diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/2022/08/29/dev-meeting.html b/2022/08/29/dev-meeting.html new file mode 100644 index 000000000..7fa71b5f3 --- /dev/null +++ b/2022/08/29/dev-meeting.html @@ -0,0 +1,367 @@ + + + + + + + + + + + + + Dev meeting | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Dev meeting

+ +

Meeting Summary

+ +

The meeting took place on 04 September 2022, at 2:00 PM UTC via Google Meet, +with team members from different time zones joining to discuss key aspects of the Pactus project.

+ +

NanoMsg instead of ZeroMQ

+ +

During the meeting, Joseph suggested using Nanomsg instead of ZeroMQ because building ZeroMQ is not easy, +especially in Windows. Additionally, we can use the pure Go implementation of Nanomsg.

+ +

The format of block events was defined as follows:

+ +
<event_id: 1 byte><event_data: variant><height: 4 bytes><seq_num: 4 bytes>
+
+ +

As a consequence of this, smart contracts events can be defined more easily and +Infura-like services become simple, as we can just replay the events.

+ +

Reviewing a Pull Request

+ +

Nagaraj’s pull request reviewed.

+ +

Renaming project

+ +

The team discussed renaming (rebranding) the project and decided to create an online survey to +gather suggestions for a new name. +Everyone is encouraged to participate in the survey and suggest new names for the project.

+ + + + +
+
+
+
+ + + + diff --git a/2022/09/04/dev-meeting.html b/2022/09/04/dev-meeting.html new file mode 100644 index 000000000..d27d71425 --- /dev/null +++ b/2022/09/04/dev-meeting.html @@ -0,0 +1,476 @@ + + + + + + + + + + + + + Dev meeting | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Dev meeting

+ +

Meeting Summary

+ +

The meeting took place on 29 August 2022, at 2:00 PM UTC via Google Meet, +with team members from different time zones joining to discuss key aspects of the Pactus project.

+ +

Project renamed to Pactus

+ +

During the last meeting, the team conducted an online survey to rename the project. +A total of 31 responses were received, and the following names were suggested:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameVotes
Sirius11
Pactus10
Nova7
Texo6
Zemus6
Helios6
Tutti5
Haki5
Aegeus4
Virgo4
Zentora3
Zinova3
Xerxes2
Ledgeria2
Solidus2
Welt2
Ventura2
Zebra2
Miranet2
Monetha2
FutureHub1
Muonet1
Mentha1
Hypatios0
Chaintopia0
Sycee0
Lepus0
+ +

After reviewing the responses, the team chose “Pactus” as the new name for the project. 🎉 +The project will be moved to “pactus-project/pactus,” and the team plans to announce it on social media.

+ +

Discussion on GUI

+ +

In terms of the GUI, Joseph suggested using Flutter, and the team agreed. +To interact with the wallet, gRPC APIs will be provided, and the GUI will use these APIs.

+ + + + +
+
+
+
+ + + + diff --git a/2022/09/18/dev-meeting.html b/2022/09/18/dev-meeting.html new file mode 100644 index 000000000..50526d2c1 --- /dev/null +++ b/2022/09/18/dev-meeting.html @@ -0,0 +1,386 @@ + + + + + + + + + + + + + Dev meeting | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Dev meeting

+ +

Meeting Summary

+ +

The meeting took place on 18 September 2022, at 2:00 PM UTC via Google Meet, +with team members from different time zones joining to discuss key aspects of the Pactus project.

+ +

Discussion about Testnet

+ +

The team discussed Testnet and related issues, including IP block issues that were found by Hadi. +Due to sanctions, some IPs are blocked, so the team will run a support node to assist users inside Iran. +The GUI application had some issues on Windows, but they were fixed and tested by Hadi.

+ +

Discussion about Website

+ +

The website still has some issues, such as the need to rename the animation to “Pactus” and the lack of a logo. +The community suggested some logos. Additionally, the roadmap page is missing.

+ +

Status of social medias

+ +

The team discussed the status of social media platforms, including:

+ +
    +
  • Discord: 70 members
  • +
  • Instagram: 87 followers
  • +
  • Telegram: 20 followers
  • +
  • Linkedin: 20 followers
  • +
  • Twitter: Not yet
  • +
+ +

The team also decided to announce the project on social media on 29 September.

+ +

Consensus parameters

+ +

The team discussed the current consensus parameters:

+ +
    +
  • Total supply: 21 million coins
  • +
  • Reward: 1 coin per block
  • +
  • Block time: 10 second
  • +
  • Committee size: 21 members
  • +
  • Bond interval: one hour
  • +
  • Unbond interval: 21 days
  • +
  • Fee fraction: 0.0001
  • +
  • Min fee: 0.0000001
  • +
  • Max fee: 0.01
  • +
  • Maximum stake: 12381
  • +
+ + + + +
+
+
+
+ + + + diff --git a/2022/09/20/release-0-9-0.html b/2022/09/20/release-0-9-0.html new file mode 100644 index 000000000..c0ac42902 --- /dev/null +++ b/2022/09/20/release-0-9-0.html @@ -0,0 +1,356 @@ + + + + + + + + + + + + + Pactus 0.9.0 released | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Pactus 0.9.0 released

+ +

Overview

+ +

Pactus Blockchain Release Version 0.9.0 +is now available for download. +This release includes a new graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Download

+ +

This version has been implemented for Testnet-0 and is preparing for the upcoming Mainnet launch. +To get started with the Pactus Blockchain Testnet-0, simply download +the latest version and run the Pactus software.

+ +

Join the Testnet now and get ready for the future!

+ + + + +
+
+
+
+ + + + diff --git a/2022/09/24/testnet-0-launched.html b/2022/09/24/testnet-0-launched.html new file mode 100644 index 000000000..3fc401e89 --- /dev/null +++ b/2022/09/24/testnet-0-launched.html @@ -0,0 +1,352 @@ + + + + + + + + + + + + + Testnet-0 launch announcement | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Testnet-0 launch announcement

+ +

testnet

+ +

The Pactus blockchain Testnet-0 is now accessible. +To participate, simply download the Pactus application version 0.9.0 and +connect to the Testnet without any special configurations. +For test coins, please visit our Discord channel and share your validator address.

+ +

By taking part in the Testnet, you can familiarize yourself with the Pactus blockchain and +get ready for the Mainnet launch. +Testnet participants will also be given higher priority during the Mainnet launch.

+ +

Please share your feedback with us to help improve the user experience in future versions of the software.

+ + + + +
+
+
+
+ + + + diff --git a/2022/10/30/dev-meeting.html b/2022/10/30/dev-meeting.html new file mode 100644 index 000000000..d069d8ab6 --- /dev/null +++ b/2022/10/30/dev-meeting.html @@ -0,0 +1,379 @@ + + + + + + + + + + + + + Dev meeting | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Dev meeting

+ +

Meeting Summary

+ +

The meeting took place on 30 October 2022, at 2:00 PM UTC via Google Meet, +with team members from different time zones joining to discuss key aspects of the Pactus project.

+ +

In memory of Mahsa Amini

+ +

The meeting started in memory of Mahsa Amini. +We in the Pactus family stand in solidarity with courageous people who are fighting for equality, equity and freedom in Iran.

+ +

Woman Life Freedom

+ +

Launching Block explorer

+ +

The beta version of the block explorer has been launched 🚀 and is now available at +https://pacscan.org.

+ +

Nagaraj explained the block explorer and some of the features.

+ +

Project road map

+ +

Project road map was discussed.

+ +

IdeaKita pitch deck

+ +

Ali presented the Pactus pitch deck for the IdeaKita in Malaysia. +The IdeaKita program, under the Malaysia Digital Economy Corporation (MDEC), is designed to +support entrepreneurs and startups in Malaysia.

+ +

Latest development progress

+ +

The latest pull requests were reviewed:

+ + + + + + +
+
+
+
+ + + + diff --git a/2022/11/24/release-0-9-1.html b/2022/11/24/release-0-9-1.html new file mode 100644 index 000000000..e5f8670f8 --- /dev/null +++ b/2022/11/24/release-0-9-1.html @@ -0,0 +1,371 @@ + + + + + + + + + + + + + Pactus 0.9.1 released | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Pactus 0.9.1 released

+ +

Overview

+ +

Pactus Blockchain Release Version 0.9.1 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Download

+ +

This version has been implemented for Testnet-0 and is preparing for the upcoming Mainnet launch. +To start using the Pactus Blockchain Testnet-0, +you can download the latest version from download page +and join the Testnet.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +
    +
  • Blocks can be fully decoded when queried in gRPC
  • +
  • The HTTP module now uses gRPC module, making node configuration simpler by removing the CapnP module
  • +
  • Reducing the blockchain size by saving blocks by number instead of hash
  • +
  • The wallet can hold unconfirmed transactions
  • +
  • The wallet can use different gRPC servers
  • +
  • The GUI displays committee information
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

+ + + + +
+
+
+
+ + + + diff --git a/2023/03/01/what-is-testnet.html b/2023/03/01/what-is-testnet.html new file mode 100644 index 000000000..6f57a9cb5 --- /dev/null +++ b/2023/03/01/what-is-testnet.html @@ -0,0 +1,423 @@ + + + + + + + + + + + + + What is a Testnet? | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

What is a Testnet?

+ +

Mainnet vs Testnet?

+ +

If you have ever wondered what Testnet is and how it is different from Mainnet, read this article to the end to find out!

+ +

Mainnet and Testnet are two widely used terminologies in the Blockchain ecosystem; +so it is important to understand the meaning and differences while working in the industry or +following announcements of the Blockchain projects like Pactus.

+ +

Here’s a quick explanation: +Before the actual live version of a Blockchain network that is used for real transactions, +functions and smart-contracts (which is referred as Mainnet), +there is a test version of the Blockchain network for testing purposes (which is referred as Testnet). +In Testnet, a safe environment is provided to help developers experiment and test their applications, +and make sure that everything functions smoothly in the Mainnet version.

+ +

Testnet

+ +

A Testnet is a simulation of a Blockchain, in which developers can test all the functionalities of +their Blockchain network without risking their assets and convenience of end-users. +Using Testnet, any possible error, bug or malfunctions can be fixed before the Mainnet launch. +Testnet also can be an experimental environment for new features, updates and upgrades. +So several Testnet networks of the same version or newer version of the Mainnet can be implemented on the roadmap.

+ +

What are use cases of Testnet?

+ +

A secure environment to test development ideas and updates. +So many features and minor details in Pactus project have been successfully developed so far using the Testnet; such as:

+ +
    +
  • extra details and information on Pactus-GUI;
  • +
  • well-functioning Pactus Blockchain explorer to access transactions and block details;
  • +
  • Upgrades that led to decreasing the size of the Pactus network
  • +
+ +

Providing a safe testing ground for resolve scalability and security problems, as well as decentralization issues. +Pactus network is also a secure and purely decentralized network. However in the last updates during the Testnet, +developers are now able to decrease the database size by approximately 10% without compromising performance. +They did it by utilizing block height instead of hash to store blocks within the database. (you can find out more +here).

+ +

Testing new versions, patches and features on Testnet. it is vital for enhancing the security, load testing, +Blockchain migration, integration tests, and etc. This is why you can now use the latest version of Pactus-GUI +that works like clockwork and is extremely secure.

+ +

Testing the functions of cryptocurrency without disrupting the Mainnet. In the Testnet of Pactus Blockchain, +you as a user or validator can use all the features to send, receive, bond or unbond your assets in the Pactus-GUI.

+ +

Development and simulation of smart contract features and DApps. Note that many Blockchain projects like Pactus, +can be used as smart-contract platforms. So the Testnet can be designed in different stages to test and improve +different applications of the network.

+ +

Please note that after a certain period of time, when developers get satisfied with the functionality and debugging process, +they launch Mainnet. Mainnet has its own independent genesis blocks; +so the assets and addresses that users use in Testnet are not valid inside the new Mainnet Blockchain anymore. +In fact the whole Blockchain network starts working from the scratch and users and validators start to +work with real tokens and transactions instead of the simulated ones. But since Testnet has an important effect +on the health and improvement of the network, in Pactus Blockchain, we have several advantages +for the people who join the Testnet.

+ +

Why should you join the Testnet?

+ +

There are different contributors in a Blockchain network; +Some people are developers and programmers that use the Testnet to contribute, enhance and lead the project to a better future. +Testnet is actually vital for them to perform their changes and try their innovations and ideas.

+ +

But you might also be an end user; you might want to either be a validator and stake your assets to earn more Pactus coins, +or you might want to learn how to use the network for future personal applications. Either way, +you might find it handy to give it a try and be familiar with Pactus-GUI and its different features.

+ +

However, there is another advantage for end users who join the Testnet. +While using the network, running a node or testing the Pactus-GUI in Testnet period, you are contributing to +the community to find improvement potentials, that’s why there are more advantages contemplated for the Testnet users; +Soon our Mainnet will be launched and also Pactus network will be announced and listed in well-known exchanges. +As an early contributor, you will have the advantage of getting some extra initial tokens at the beginning of Mainnet launch. +So that you can use it to run a validator node and earn more from staking your assets. This airdrop is considered +for every individual who installs Pactus-GUI and starts a node in Testnet.

+ +

There are other positive conditions you may experience as an early contributor.

+ +
    +
  • Advanced and very responsive support for your issues (we dedicate more time to provide you with solutions)
  • +
  • Embracing your suggestions, improvement ideas, needs and information you may require to have a better user experience.
  • +
+ + + + +
+
+
+
+ + + + diff --git a/2023/04/21/testnet-0-concluded.html b/2023/04/21/testnet-0-concluded.html new file mode 100644 index 000000000..db56f430e --- /dev/null +++ b/2023/04/21/testnet-0-concluded.html @@ -0,0 +1,376 @@ + + + + + + + + + + + + + Story of Testnet-0 | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Story of Testnet-0

+ +

What is Testnet?

+ +

Testnet is a testing environment where developers and users can try out the functionality of a blockchain project, +without putting real assets or data at risk. +It helps to ensure that the final product is reliable and secure for users to use. +If you like to read more about the Testnet you can check out our post on +“What is Testnet?”.

+ +

Summary of Testnet-0

+ +

In September 2022, we launched our first Testnet. +The purpose of this Testnet was to +check the consensus protocol, +test different transaction types, +and ensure the stability of the blockchain. +We also wanted to test the sortition algorithm +to make sure it works properly.

+ +

The committee +for the Testnet-0 was set to five validators, and more than 19 validators joined during the Testnet period. +Over 2 million blocks were created, and more than 3.2 million transactions were processed during this time. +The size of the blockchain is approximately 1 gigabyte. +The maximum number of transactions recorded in a single block was 386. With a block time of 10 seconds, +we can confirm that Pactus blockchain can support up to 30 transactions per second (TPS), +which is a reasonable number for TPS. Based on real-time statistics available at realtps, +we can see that Pactus is among the top 10 blockchains in terms of TPS.

+ +

At this point, the development team decided to end the Testnet-0 and move on to the next one, +Testnet-1. We are planning to run the Testnet-1 to prepare for the MainNet launch. +We will provide updates on our progress and share the details of the new Testnet soon.

+ +

As promised, participants in Testnets will be given priority as validators for the MainNet, +and will receive bounty tokens from the bootstrap accounts to set up their validator. +We are grateful to all those who participated in Testnet-0, and we encourage them to join our next Testnet to +help us improve Pactus. +As a community-based project, we rely on the support of our community members, and we value any help we receive.

+ + + + +
+
+
+
+ + + + diff --git a/2023/05/08/release-0-10-0.html b/2023/05/08/release-0-10-0.html new file mode 100644 index 000000000..1d55c06f1 --- /dev/null +++ b/2023/05/08/release-0-10-0.html @@ -0,0 +1,399 @@ + + + + + + + + + + + + + Pactus 0.10.0 released | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Pactus 0.10.0 released

+ +

Overview

+ +

Pactus Blockchain Version 0.10.0 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Highlight

+ +

The main update in this version allows users to set up multiple validators in one node. +Users can set up to 32 validators in a single node, and each validator can stake up to 1,000 coins.

+ +

Multi validators

+ +

Download

+ +

This version has been implemented for Testnet-1 and +is being prepared for the upcoming Mainnet launch. +To start using Pactus Blockchain Testnet-1, download the latest version from the +download page and join the Testnet.

+ +

These guides can help you to run and configure your node:

+ + + +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • removing address from account (#454)
  • +
  • supporting multiple consensus instances (#450)
  • +
  • adding sortition interval to the parameters (#442)
  • +
+ +

Fix

+ +
    +
  • gui: check if the node has an active consensus instance (#458)
  • +
  • Use of a Persistent Merkle tree to enhance performance of calculating the +state hash; fully tested in Testnet-0 (#432)
  • +
  • GetBlockchainInfo API in gRPC now returns the total number of validators and accounts (#439)
  • +
  • wallet path as argument (#455)
  • +
  • adding reward addresses to config (#453)
  • +
  • removing committers from the certificate hash (#444)
  • +
  • prevent data race conditions in committee (#452)
  • +
  • using 2^256 for the vrf denominator (#445)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

+ + + + +
+
+
+
+ + + + diff --git a/2023/05/09/testnet-1-launched.html b/2023/05/09/testnet-1-launched.html new file mode 100644 index 000000000..39014376b --- /dev/null +++ b/2023/05/09/testnet-1-launched.html @@ -0,0 +1,382 @@ + + + + + + + + + + + + + Testnet-1 launch announcement | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Testnet-1 launch announcement

+ +

Overview

+ +

The Pactus blockchain Testnet-1 is now available for participation. +This version simulates the Mainnet environment and evaluate the system’s performance, stability, +and security in a controlled environment. +The primary goal of this version of Testnet is to determine the efficient and secure committee size for the Mainnet.

+ +

Key Aspects

+ +
    +
  • Simulating the Mainnet environment
  • +
  • Determining the actual block creation time
  • +
  • Assessing the staking mechanism and consensus protocol
  • +
  • Evaluating network usage under different loads
  • +
  • Evaluating the syncing process for new nodes joining the network
  • +
  • Ensuring network stability with over 1000 validators
  • +
  • Evaluating transaction performance
  • +
  • Conducting stress tests
  • +
  • Performing security tests, including double spend attacks, Sybil attacks +(nodes with different identities), and forking resistance
  • +
+ +

Joining Testnet-1

+ +

To join the Testnet, download Pactus software +version 0.10.0 and +connect to Testnet without any special configuration or hardware. +You can run the software on your personal computer or laptop. +To acquire test coins, visit the Discord channel and +provide your validator address.

+ +

Benefits for Participation

+ +

By taking part in the Testnet, users can familiarize themselves with the Pactus blockchain and +be well-prepared for the Mainnet launch. +Testnet participants will also receive higher priority during the Mainnet launch and +get free coins for initial staking on the Mainnet.

+ +

Your Feedback Matters

+ +

User feedback plays a vital role in the improvement of the Pactus blockchain. +Share your thoughts and experiences to contribute to the enhancement of future software versions.

+ + + + +
+
+
+
+ + + + diff --git a/2023/05/29/release-0-11-0.html b/2023/05/29/release-0-11-0.html new file mode 100644 index 000000000..e0b8f15d4 --- /dev/null +++ b/2023/05/29/release-0-11-0.html @@ -0,0 +1,411 @@ + + + + + + + + + + + + + Pactus 0.11.0 released | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Pactus 0.11.0 released

+ +

Overview

+ +

Pactus Blockchain Version 0.11.0 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Highlights

+ +

The main update in this version is the fix for the relay +connection issue. +A relay is a peer in the network that facilitates the connection between two peers, +particularly when they are using home internet.

+ +

Another significant update is that sending a Bond transaction +is now more user-friendly. +Users no longer need to set the validator public key if they want to bond Test PAC coins to their validators.

+ +

Bond transaction dialog

+ +

Download

+ +

This version has been implemented for Testnet-1 and +is being prepared for the upcoming Mainnet launch. +To start using Pactus Blockchain Testnet-1, download the latest version from the +download page and join the Testnet.

+ +

These guides can help you to run and configure your node:

+ + + +

How to Upgrade

+ +

If you are running an older version, shut it down. +Uninstall the previous version and install the newer version. +If you are using the archived version, simply use the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Fix

+ +
    +
  • gui: showing the total number of validators (#474)
  • +
  • network: fixing relay connection issue (#475)
  • +
  • consensus: rejecting vote with round numbers exceeding the limit (#466)
  • +
  • increase failed counter when stream got error (#489)
  • +
  • boosting syncing process (#482)
  • +
  • waiting for proposal in pre-commit phase (#486)
  • +
  • retrieving public key from wallet for bond transactions (#485)
  • +
  • restoring config file to the default (#484)
  • +
  • defining ChainType in genesis to detect the type of network (#483)
  • +
  • reducing the default Argon2d to consume less memory (#480)
  • +
  • adding password option to the start commands (#473)
  • +
+ +

Refactor

+ +
    +
  • rename send to transfer. (#469)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

+ + + + +
+
+
+
+ + + + diff --git a/2023/06/19/release-0-12-0.html b/2023/06/19/release-0-12-0.html new file mode 100644 index 000000000..36b72c1af --- /dev/null +++ b/2023/06/19/release-0-12-0.html @@ -0,0 +1,409 @@ + + + + + + + + + + + + + Pactus 0.12.0 released | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Pactus 0.12.0 released

+ +

Overview

+ +

Pactus Blockchain Version 0.12.0 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Highlights

+ +

This version is focused on improving the sync time to make it faster. +This is achieved by implementing a caching mechanism that executes transactions more quickly and +improves the calculation of total power (stake) of the blockchain in a more effective way.

+ +

Syncing progress

+ +

Download

+ +

This version has been implemented for Testnet-1 and +is being prepared for the upcoming Mainnet launch. +To start using Pactus Blockchain Testnet-1, download the latest version from the +download page and join the Testnet.

+ +

These guides can help you to run and configure your node:

+ + + +

How to Upgrade

+ +

If you are running an older version, shut it down. +Uninstall the previous version and install the newer version. +If you are using the archived version, simply use the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • add GetAccountByNumber API to get account by number (#511)
  • +
+ +

Fix

+ +
    +
  • caching account and validator in store (#513)
  • +
  • get recent blocks by stamp (#509)
  • +
  • closing the mDNS connection upon stopping the network (#508)
  • +
  • updating linkedmap to use generic (#507)
  • +
  • removing state from cache (#506)
  • +
  • Typo in GUI (#499)
  • +
  • supporting localnet (#492)
  • +
+ +

Refactor

+ +
    +
  • update total power calculation based on power change(deltas) (#518)
  • +
  • GetValidators return all validators in state validators map (#512)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

+ + + + +
+
+
+
+ + + + diff --git a/2023/07/01/release-0-13-0.html b/2023/07/01/release-0-13-0.html new file mode 100644 index 000000000..532339da9 --- /dev/null +++ b/2023/07/01/release-0-13-0.html @@ -0,0 +1,400 @@ + + + + + + + + + + + + + Pactus 0.13.0 released | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Pactus 0.13.0 released

+ +

Overview

+ +

Pactus Blockchain Version 0.13.0 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Highlights

+ +

Users can now restore the default_wallet during the node initialization. +If users have a backup of the seed phrase (mnemonic) for the default_wallet, +they can now restore it and re-initialize the node.

+ +

Restore mode

+ +

Download

+ +

This version has been implemented for Testnet-1 and +is being prepared for the upcoming Mainnet launch. +To start using Pactus Blockchain Testnet-1, download the latest version from the +download page and join the Testnet.

+ +

These guides can help you to run and configure your node:

+ + + +

How to Upgrade

+ +

If you are running an older version, shut it down. +Uninstall the previous version and install the newer version. +If you are using the archived version, simply use the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Fix

+ +
    +
  • implemented restore wallet base on input seed (#553)
  • +
  • measuring total sent and received bytes (#552)
  • +
  • add validate seed and restore wallet (#533)
  • +
  • HTTP: Missing handlers (#549)
  • +
  • gui: update about dialog and menu items in help (#532)
  • +
+ +

Refactor

+ +
    +
  • implementing TestSuite (#535)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

+ + + + +
+
+
+
+ + + + diff --git a/2023/07/05/testnet-500-validators.html b/2023/07/05/testnet-500-validators.html new file mode 100644 index 000000000..a42c4d0bc --- /dev/null +++ b/2023/07/05/testnet-500-validators.html @@ -0,0 +1,374 @@ + + + + + + + + + + + + + 500 validators joined Testnet | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

500 validators joined Testnet

+ +

For a Proof of Stake blockchain, validators are important for +maintaining the network’s integrity and security. They are similar to miners in Proof of Work blockchains like Bitcoin.

+ +

Pactus as a real Proof of Stake blockchain, has achieved a significant milestone. +More than 500 validators joined the Testnet +in less than 2 months. +This accomplishment proves that Pactus is reliable, resilient, and trustworthy. More importantly, it sets new standards +in the blockchain world. In fact, the Pactus Testnet is even more decentralized than some well-known blockchains.

+ +

500 validators of Testnet

+ +

One key reason why Pactus can accommodate more validators is its powerful +consensus mechanism. +The consensus mechanism in Pactus eliminates the need for delegation, making it possible for anyone to become a validator. +Additionally, the user-friendly application ensures that even those new to blockchain can easily contribute to the network.

+ +

What is the next

+ +

To remain competitive in the market, Pactus recognizes the importance of prioritizing user space. +We aim to ensure that running Pactus is affordable and accessible to anyone, regardless of their technical expertise or +available resources.

+ +

To achieve this, the Pactus team constantly monitors network, storage, and computational usage, striving to keep them +at minimal levels. +By doing so, we enable more individuals to participate in the Pactus blockchain.

+ +

Currently, the Pactus team is working on optimizing and reducing network usage. This effort will lead to reduced costs, +especially for users who are using home internet connections.

+ +

Furthermore, we are planning to introduce a pruning mode, allowing users to run the Pactus blockchain with significantly +less storage. +Although we believe the storage size is already small, our goal is to enable users to +retain only the most recent blockchain history. +This approach ensures that the blockchain size remains as compact as possible by disregarding some history of the blockchain.

+ + + + +
+
+
+
+ + + + diff --git a/2023/07/09/dev-meeting.html b/2023/07/09/dev-meeting.html new file mode 100644 index 000000000..6cfb5bc66 --- /dev/null +++ b/2023/07/09/dev-meeting.html @@ -0,0 +1,380 @@ + + + + + + + + + + + + + Dev meeting | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Dev meeting

+ +

Meeting Summary

+ +

The meeting took place on 09 July 2023, at 2:00 PM UTC via Google Meet, +with team members from different time zones joining to discuss key aspects of the Pactus project.

+ +

Overview to the Network Module

+ +

The meeting began with an overview of the Network module in Pactus. +This module uses Libp2p as its underlying network protocol.

+ +

The Network module is agnostic about the content of the message and +handles two types of messages: Gossip messages, which are broadcasted, +and Stream messages, which are sent directly to a specific peer. +The team discussed the relay nodes that enable communication for nodes behind NAT. +Upon receiving a message, the module publishes an event. +The two types of events are Gossip events and Steam events.

+ +

Network messages

+ +

The team discussed the issue of Relay connections resetting, and explored solutions such as +hole punching or using UDP and IPv6.

+ +

Some users in the Testnet reported high network usage. +The team discussed implementing metrics for LibP2P to monitor network usage effectively. +The discussion related to this issue can be found here. +Additionally, the team discussed the customization of network resources, +including setting limits for inbound and outbound connections.

+ +

Overview to the Sync Module

+ +

Moving on, the Sync module was discussed. +Unlike the Network module, the Sync module has full knowledge about the messages and packets. +The module handles a range of message types, which can be found +here.

+ +

It was suggested that we need to define metrics for each message type. +There was also a discussion about the need for reducing the messages to optimize the use of network resources.

+ +

The team decided to continue discussing these topics in future meetings. +They also plan to work on improving the Network and Sync modules based on these discussions.

+ + + + +
+
+
+
+ + + + diff --git a/2023/08/01/testnet-1-concluded.html b/2023/08/01/testnet-1-concluded.html new file mode 100644 index 000000000..3bac753ac --- /dev/null +++ b/2023/08/01/testnet-1-concluded.html @@ -0,0 +1,405 @@ + + + + + + + + + + + + + Story of Testnet-1 | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Story of Testnet-1

+ +

About Testnet

+ +

Testnet is a testing environment where developers and users can try out the functionality of a blockchain project, +without putting real assets or data at risk. +It helps to ensure that the final product is reliable and secure for users to use. +If you like to read more about the Testnet you can check out our post on +“What is Testnet?”.

+ +

Summary

+ +

In May 2023, we launched our second Testnet. +The main purpose of this Testnet was to measure block time creation and the responsiveness of the blockchain. +The development team also focused on evaluating the network’s performance. +Additionally, the overall performance of the software and the syncing process were closely examined and assessed.

+ +

The committee for Testnet-1 was set to 21 validators, +and 584 validators joined during the Testnet period. +More than 600,000 blocks were created, and more than 1 million transactions were processed during this time. +The size of the blockchain is about 300 megabytes.

+ +

About 300,000 coins were staked during this period, it was almost 50% of the total generated coins. +It shows that users, even in Testnet, tend to stake their coins.

+ +

Staking chart

+ +

We were able to extract the confirmation time of transactions. +More than 97% of transactions were confirmed in just one block after submission. +This indicates that the transaction pool and broadcasting models are working fine.

+ +

Transaction confirmation chart

+ +

Based on logs from one of the validators, the time for creating a block is about 3 seconds in normal cases. +More than 97% of blocks are committed in the first rounds.

+ +

Consensus round chart

+ +

During Testnet-1, we released three versions(Version +0.11.0, +0.12.0, +0.13.0), and the upgrade process was smooth. +At this time, the development team decided to stop Testnet-1 and work on improvements that are not backward compatible, +including:

+ +
    +
  • Improving the consensus protocol
  • +
  • Reducing the blockchain size
  • +
  • Optimizing the network usage
  • +
+ +

After stabilizing the changes, we will announce the next Testnet, and hopefully, this will be the pre-launch Testnet.

+ +

Spacial thanks to the community

+ +

This Testnet was important for us. +It helped us learn what we need to do to make Pactus work even better. +Without the community that supports us and dedicates their time and resources to testing and feedback, +we wouldn’t have been able to progress as we have.

+ +

we thank all of them for their valuable contributions. +As promised, participants in Testnets will be given priority as validators for the MainNet, and +will receive bounty tokens from the bootstrap accounts to set up their validator.

+ +

We are grateful to all those who participated in Testnet-1, and +we encourage them to join our next Testnet to help us improve Pactus. +As a community-based project, we rely on the support of our community members, and we value any help we receive.

+ + + + +
+
+
+
+ + + + diff --git a/2023/08/22/dev-report.html b/2023/08/22/dev-report.html new file mode 100644 index 000000000..157f0f633 --- /dev/null +++ b/2023/08/22/dev-report.html @@ -0,0 +1,374 @@ + + + + + + + + + + + + + Dev report | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Dev report

+ +

Abstract

+ +

there is several activities in pactus github this month, here is a clear report and explain of activities.

+ +

Github Pactus

+ +

Linters

+ +

one of new changes in pactus project is new linters we added this month. +what is linters? +linters are just a set of rules for the style of source codes, they force developers to write new codes +in correct, clean and safe way.

+ +

why we use them? +the reason we are using linters in Pactus and add new ones, is to make the code more safe, +and also make it easy to work on for new contributors because we are focus on being decentralized even in development.

+ +

Linters we added till now

+ +

TLA+ spec

+ +

one another new change in Pactus is updating TLA+ spec, which is related to consensus, +as you know we had some problem with consensus in Testnet-1, we fixed the issues and now we are trying to make it more clean.

+ +

link to changes

+ +

if you wish you can learn more about Pactus consensus here.

+ +

Refactoring

+ +

some of previous Pactus dependencies was so old, so we start refactoring them and use new libraries. +also we used some libraries with higher performance which is make Pactus full node more faster in mainnet.

+ +

one of refactors

+ + + + +
+
+
+
+ + + + diff --git a/2023/09/04/introduction-to-pips.html b/2023/09/04/introduction-to-pips.html new file mode 100644 index 000000000..459f8d3de --- /dev/null +++ b/2023/09/04/introduction-to-pips.html @@ -0,0 +1,382 @@ + + + + + + + + + + + + + Introduction to PIPs | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Introduction to PIPs

+ +

Introduction to PIPs

+ +

In our commitment to transparency and innovation, we’re excited to introduce a major step in Pactus’s journey: +the Pactus Improvement Proposals, or PIPs.

+ +

PIPs image

+ +

What are PIPs?

+ +

Pactus Improvement Proposals (PIPs) define standards for the ongoing development and enhancement of the Pactus platform. +Each PIP has a unique number like PIP-2, +PIP-3, and so on. +These proposals provide technical details for suggested modifications or enactments, serving as a guide for development.

+ +

The PIP process

+ +

The PIP process is open, allowing any member of the Pactus community to propose a PIP. +The author should provide a summary, motivation, and a detailed technical explanation. +The Pactus Laboratory team will carefully review each PIP. +Security considerations must be addressed before finalizing a PIP. +Once finalized, it can be added to the code. +This process helps avoid unexpected issues during development and maintain consistency and safety.

+ +

The Origins of PIPs

+ +

The Pactus Improvement Proposals (PIPs) was inspired by the +Ethereum Improvement Proposals (EIPs) system, +which had its roots in the Bitcoin Improvement Proposals (BIPs) and +Python Enhancement Proposals (PEPs).

+ +

New Feature Policy

+ +

From now on, all major changes or new features in the Pactus project require a PIP. +Any implementation must reference its specific PIP. +Without approval from Pactus Laboratory team, changes won’t be approved and added to the codebase.

+ +

PIPs Repository

+ +

For a complete list of Pactus Improvement Proposals, visit this link. +The corresponding GitHub repository is accessible here.

+ +

PIPs repository on Github

+ + + + +
+
+
+
+ + + + diff --git a/2023/09/24/dev-report-pre-testnet-2.html b/2023/09/24/dev-report-pre-testnet-2.html new file mode 100644 index 000000000..7a61f4ef5 --- /dev/null +++ b/2023/09/24/dev-report-pre-testnet-2.html @@ -0,0 +1,392 @@ + + + + + + + + + + + + + Dev Report pre-testnet2 | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Dev Report pre-testnet2

+ +

Abstract

+ +

there is several activities in Pactus github in September month, here is a clear report and explain of activities.

+ +

Github Pactus

+ +

Implementing PIP 2, 3 and 4

+ +

After starting Pactus Labs and PIPs, +we start implementing each accepted PIP one by one to improve Pactus, here is a list of implemented PIPs:

+ + + +

Network

+ +

There is some very good change and new features for Pactus network module, +this list contain a list of important changes in Pactus networking:

+ + + +

gRPC and nanomessage services

+ +

We also updated, improved and enhanced gRPC and nanomessage services for better developer experience, +for third-party and side project developers, here is some changes:

+ + + +

Refactoring and other new feature or debugs

+ +

We had some not implemented feature request, not fixed bugs and some issue with new golang version, +list of this changes:

+ + + + + + +
+
+
+
+ + + + diff --git a/2023/09/28/how-sspos-works-in-simple-word.html b/2023/09/28/how-sspos-works-in-simple-word.html new file mode 100644 index 000000000..69ce1bd9f --- /dev/null +++ b/2023/09/28/how-sspos-works-in-simple-word.html @@ -0,0 +1,426 @@ + + + + + + + + + + + + + How SSPoS (Solid State Proof of Stake) works in simple word | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

How SSPoS (Solid State Proof of Stake) works in simple word

+ +

Abstract

+ +

In all Blockchain protocols, there is a concept called a consensus mechanism. +This mechanism is used to enable nodes to reach an agreement +on the state of the Blockchain they are +maintaining, in order to have a synchronized and integrated Blockchain.

+ +

For now, we have a lot of consensus mechanisms in the Blockchain world. +Pactus Blockchain uses the SSPoS (Solid State Proof of State) which is a new consensus model.

+ +

To explain how it works let’s start with explaining one of the first and simplest +consensus mechanisms (or if you already know them, just jump into the last part named SSPoS).

+ +

Solid State Proof of Stake

+ +

PoW (Proof of Work)

+ +

In the proof of work model, each node in the network should solve a complex mathematical +problem that requires lots of computing resources to make a new block.

+ +

In this way, it’s highly unlikely that anyone would be able to change +past transactions and change Blockchain states such as balances, +without expending equivalent computational power.

+ +

By doing this we ensure the security and integrity of the Blockchain.

+ +

The concept was adapted from digital tokens by Hal Finney in 2004 +through the idea of “reusable proof of work” using the 160-bit secure hash algorithm 1 (SHA-1).

+ +

Bitcoin uses this consensus model.

+ +

PoS (Proof of Stake)

+ +

On the other hand, PoS or Proof of Stake is another consensus mechanism that instead of miners has validators!

+ +

Validators lock a number of their assets in the Blockchain and they can transfer or use it +till it is locked which we call staking. +after each Block is committed one of the validators will be chosen randomly (more amount of stake, +more chance to be chosen) when a validator is chosen +it proposes a block and announces it to other nodes to be validated, +when a supermajority of validators accept the block it’s going to be committed.

+ +

In this system, validators have no incentive to behave maliciously or dishonestly. +If they do, they risk losing the stake amount.

+ +

More amount of validators in a PoS Blockchain makes it more secure, +decentralized, and trustable, but it also makes the validation and consensus process slower and more difficult.

+ +

Ethereum uses this model.

+ +

DPoS (Delegated Proof of Stake)

+ +

DPoS or Delegated Proof of Stake, is a variant of the PoS consensus algorithm. +users entrust their stakes to a small group of “delegates”. +These delegates are responsible for validating transactions +and creating blocks. The number of delegates is limited +to ensure accountability and efficiency in the validation process.

+ +

Some Blockchains like Cardano and Tron use DPoS.

+ +

DPoS tries to solve the issue of PoS which when validators +increase we have an inefficient validation process. but the main issue with DPoS itself is putting a lot +of trust in the hands of a small number of delegates, +which goes against the principle of “don’t trust, verify”.

+ +

SSPoS (Solid State Proof of Stake)

+ +

BUT, HOW ABOUT SSPoS? HOW ABOUT PACTUS?

+ +

In Pactus Blockchain, we have something called Solid State Proof of Stake +and we try to fix the previous model’s issue, let me explain.

+ +

Pactus uses a dynamic committee of validators with a fixed size of 21, +but the members of the committee randomly change in each round, +based on stake amount the chance of being chosen is higher. on the other hand, +the number of validators out on the committee is unlimited, allowing anyone +to become a validator by staking coins.

+ +

At each block, validators participate in a sortition algorithm by generating a random number +between zero and the total staked coins. If the number is less +than the validator’s stake, they can enter the committee and replace the oldest committee member.

+ +

So, in SSPoS models which are a variant of PoS, we can reach a consensus, +without using high computation resources, having an inefficient +validation process by increasing validator numbers, +and also without breaking the principle of “don’t trust, verify”.

+ + + + +
+
+
+
+ + + + diff --git a/2023/10/15/release-0-15-0.html b/2023/10/15/release-0-15-0.html new file mode 100644 index 000000000..933566441 --- /dev/null +++ b/2023/10/15/release-0-15-0.html @@ -0,0 +1,466 @@ + + + + + + + + + + + + + Pactus 0.15.0 released | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Pactus 0.15.0 released

+ +

Overview

+ +

Pactus Blockchain Version 0.15.0 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Splash screen

+ +

Download

+ +

This version is the bootstrap version for +Testnet-2. +To start using Pactus Blockchain Testnet-1, download the latest version from the +download page and join the Testnet.

+ +

These guides can help you to run and configure your node:

+ + + +
+ If you participated in Testnet-1, ensure to delete your previous working directory and + create a new wallet. +

+ By default, the working directory is located at "C:\Users\<name>\pactus" on Windows, + or "~/pactus" on Unix-compatible platforms. +
+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • gui: adding the splash screen (#743)
  • +
  • add absentees votes to the certificate (#746)
  • +
  • logger: short stringer for loggers (#732)
  • +
  • implementing pip-7 (#731)
  • +
  • implementing pip-11 (#712)
  • +
  • implementing pip-8 (#711)
  • +
  • implementing pip-9 (#706)
  • +
  • new API to get Public key by address (#704)
  • +
  • Adding address field for AccountInfo (#703)
  • +
  • CreateValidatorEvent and CreateAccountEvent for nanomsg (#702)
  • +
  • implementing PIP-2 and PIP-3 (#699)
  • +
  • Adding Hole Punching to network (#697)
  • +
  • write logs into file (#673)
  • +
  • check protocol support before sending connect/disconnect event (#683)
  • +
  • updating genesis for pre-testnet-2 (#679)
  • +
  • adding udp protocol for network (#672)
  • +
  • implementing pip-4 (#671)
  • +
  • Notifee service events (#628)
  • +
  • adding MinimumStake parameter (#574)
  • +
  • adding Sent and Received bytes per message metrics for peers (#618)
  • +
  • add reason to BlockResponse messages (#607)
  • +
  • Add CalcualteFee in GRPC (#601)
  • +
  • add sent bytes and received bytes metrics to peerset plus update grpc (#606)
  • +
  • added metrics of libp2p with supporting prometheus (#588)
  • +
  • Check node address is valid (#565)
  • +
  • add LastSent and LastReceived properties to peer (#569)
  • +
+ +

Fix

+ +
    +
  • data race issue on updating certificate (#747)
  • +
  • network: async connection (#744)
  • +
  • adding query vote timer for CP phase (#738)
  • +
  • trim transactions in proposed block (#737)
  • +
  • fixing query votes and proposal issue (#736)
  • +
  • fixing issue when a block has max transactions (#735)
  • +
  • consensus: anti-entroy mechanism for the consensus (#734)
  • +
  • logger: invalid level parsing error (#733)
  • +
  • cache certificate by height (#730)
  • +
  • fixing a crash on consensus (#729)
  • +
  • consensus: prevent double entry in new height (#728)
  • +
  • resolve consensus halt caused by time discrepancy in network. (#727)
  • +
  • unsorted addresses in wallet listing (#721)
  • +
  • send query votes message, if there is no proposal yet (#723)
  • +
  • fixing logger level issue (#722)
  • +
  • fixing syncing stuck issue (#720)
  • +
  • fixing some minor issues on pre-testnet (#719)
  • +
  • supporting go version 1.21 and higher (#692)
  • +
  • ensure log rotation using tests (#693)
  • +
  • restoring at the first block (#691)
  • +
  • swagger doesn’t work with multiple proto files (#687)
  • +
  • fixing wallet-cli issues (#686)
  • +
  • prevent stripping public key for subsidy transactions (#678)
  • +
  • updating the consensus protocol (#668)
  • +
  • aggregating signature for hello message (#640)
  • +
  • error case for logger (#634)
  • +
  • adding committers to the certificate (#623)
  • +
  • updating sortition executor (#608)
  • +
  • update buf and fixing proto generation issue (#600)
  • +
  • adding block hash to peer (#584)
  • +
  • copy to clipboard option for address and pubkey (#583)
  • +
  • public key aggregate (#576)
  • +
  • remove GetValidators rpc method (#573)
  • +
  • missing swagger ui for grpc get account by number (#564)
  • +
  • incorrect handler for validator by number (#563)
  • +
+ +

Refactor

+ +
    +
  • sync: refactoring syncing process (#676)
  • +
  • remove payload prefix from payload transaction type (#669)
  • +
  • change Hello message from broadcasting to direct messaging (#665)
  • +
  • committee: using generic list for validators (#667)
  • +
  • rename SanityCheck to BasicCheck (#643)
  • +
  • cli: Migrating from mow.cli to cobra for wallet (#629)
  • +
  • cli: replacing mow.cli with cobra for daemon (#621)
  • +
  • logger: using fast JSON logger (zerolog) (#613)
  • +
  • Using Generics for calculating Min and Max for numeric type #604 (#609)
  • +
  • Updating LRU cache to version 2 #514 (#602)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

+ + + + +
+
+
+
+ + + + diff --git a/2023/10/15/testnet-2-launched.html b/2023/10/15/testnet-2-launched.html new file mode 100644 index 000000000..313a71d9e --- /dev/null +++ b/2023/10/15/testnet-2-launched.html @@ -0,0 +1,390 @@ + + + + + + + + + + + + + Testnet-2 launch announcement | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Testnet-2 launch announcement

+ +

Overview

+ +

Exciting news for the Pactus Community: Testnet-2 is has launched! +The journey through Testnet-1 +brought success and invaluable experiences, with over 500 validators joining the network. +Despite its noteworthy achievements, it also faced challenges that led to a tough decision: to pause the Testnet and +thoroughly address these issues. +After two months of dedicated work and testing, many problems have been resolved, and +we feel confident launching the Testnet again. +Testnet-2 comes with substantial improvements compared to its predecessor by enhancing the core of the Pactus Blockchain. +Notably, the new consensus mechanism and improved overall network performance.

+ +

At this point, we want to assure the Pactus community that this version of +the Testnet will not stop until the mainnet launches, +and our main focus is on improving its overall performance and launching the Mainnet.

+ +

If you’re new to the concept of Testnet, check out our informative post: +What is the Testnet?

+ +

Key Focus Areas

+ +

Testnet-2 has important tasks ahead. +Firstly, we aim to confirm that the new consensus mechanism is both safe and efficient. +A close eye will be kept on the network’s performance, ensuring it operates as expected. +For Testnet-2, the committee +size has been expanded to 51 members. +Both the committee’s performance and block production will be closely monitored. +The goal is a blockchain that remains stable and trustworthy, +even with thousands of validators in the network, +ensuring it manages its regular duties seamlessly.

+ +

How To Join

+ +

Want to join the Testnet-2? Great! It’s super easy. +Just download the latest Pactus software and you’re good to go. +no fancy setups or special gear needed. +You can run the software straight from your personal computer or laptop. +Need some test coins? Pop over to our Discord channel and share your validator address there.

+ +

Benefits for Participation

+ +

By taking part in the Testnet, users can familiarize themselves with the Pactus blockchain and +be well-prepared for the Mainnet launch. +Testnet participants will also receive higher priority during the Mainnet launch and +get free coins for initial staking on the Mainnet.

+ +

Your Feedback Matters

+ +

User feedback plays a vital role in the improvement of the Pactus blockchain. +Share your thoughts and experiences to contribute to the enhancement of future software versions.

+ + + + +
+
+
+
+ + + + diff --git a/2023/10/21/release-0-15-1.html b/2023/10/21/release-0-15-1.html new file mode 100644 index 000000000..fe7837117 --- /dev/null +++ b/2023/10/21/release-0-15-1.html @@ -0,0 +1,386 @@ + + + + + + + + + + + + + Pactus 0.15.1 released | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Pactus 0.15.1 released

+ +

Overview

+ +

Pactus Blockchain Version 0.15.1 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Highlites

+ +

This version address an unforeseen issue in the consensus protocol. +We kindly ask all validators to upgrade their nodes to this version.

+ +

Download

+ +

This version has been implemented for Testnet-1 and +is being prepared for the upcoming Mainnet launch. +To start using Pactus Blockchain Testnet-2, download the latest version from the +download page and join the Testnet.

+ + + +

How to Upgrade

+ +

If you are running an older version, shut it down. +Uninstall the previous version and install the newer version. +If you are using the archived version, simply use the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Fix

+ +
    +
  • consensus: strong termination for the binary agreement (#765)
  • +
  • consensus: not increase the voting power on duplicated binary votes (#762)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

+ + + + +
+
+
+
+ + + + diff --git a/2023/10/21/release-0-15-2.html b/2023/10/21/release-0-15-2.html new file mode 100644 index 000000000..1f3681351 --- /dev/null +++ b/2023/10/21/release-0-15-2.html @@ -0,0 +1,400 @@ + + + + + + + + + + + + + Pactus 0.15.2 released | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Pactus 0.15.2 released

+ +

Overview

+ +

Pactus Blockchain Version 0.15.2 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Highlights

+ +

This version allows nodes to set limits on the number of connections they can establish. +By default, each node can have a minimum of 8 connections and a maximum of 16 connections. +Users can easily change these numbers in the configuration file.

+ +

Download

+ +

This version has been implemented for Testnet-2 and +is being prepared for the upcoming Mainnet launch. +To start using Pactus Blockchain Testnet-2, download the latest version from the +download page and join the Testnet.

+ +

These guides can help you to download, install and configure your node:

+ + + +

How to Upgrade

+ +

If you are running an older version, shut it down. +Uninstall the previous version and install the newer version. +If you are using the archived version, simply use the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • add community bootstrap nodes to testnet config (#764)
  • +
  • network: implementing connection manager (#773)
  • +
  • network: adding bootstrapper mode to the network config (#760)
  • +
+ +

Fix

+ +
    +
  • network: ensure relay is not used when there is no direct connection
  • +
  • network: close connection when unbale to get supported protocols (#781)
  • +
  • network: enabling peer exchange for bootstrappers (#779)
  • +
  • network: set connection limit for the resource manager (#775)
  • +
  • sync: peer status set to known on sucessfull handshaking (#774)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

+ + + + +
+
+
+
+ + + + diff --git a/404.html b/404.html new file mode 100644 index 000000000..30898898f --- /dev/null +++ b/404.html @@ -0,0 +1,194 @@ + + + + + + + + + + + + + Error 404, Page Not Found | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+

404

+ +

Page not found :(

+

The requested page could not be found.

+
+ + + diff --git a/CNAME b/CNAME new file mode 100644 index 000000000..4ad1830d6 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +pactus.org diff --git a/about/faq/index.html b/about/faq/index.html new file mode 100644 index 000000000..1dd04bd3f --- /dev/null +++ b/about/faq/index.html @@ -0,0 +1,986 @@ + + + + + + + + + + + + + FAQ | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
+

FAQ

+

This FAQ (Frequently Asked Questions) page aims to provide helpful information and guidance on common questions and concerns related to Pactus. +

+
+ +
+ + + + + + + +
+
+
+ + Economy +
+
+ +
+ + + + + +
+
***
+ +
+ +
+
+
+ + General +
+
+ + + +

+ What does "Pactus" mean? +

+
+ The word "Pactus" is of Latin origin and means "to agree together", "contract", or "transact". In English, the term "Pact" is derived from the Latin word "Pactus". + + +
+ + + +

+ Is Pactus a copy of any other blockchain? +

+
+ No, Pactus is not a copy or a derivative of any other blockchain. It is a new and unique blockchain protocol that has been designed from scratch. The consensus mechanism used in Pactus is unique and specifically created to solve the scalability issue of validators in the Proof of Stake blockchains. + + +
+ + + +

+ Does Pactus have an ICO? +

+
+ No, Pactus does not have an ICO (Initial Coin Offering) and there are no predefined or privileged accounts in pactus. The Pactus blockchain starts from zero and all coins are minted through the consensus mechanism. This ensures that the distribution of coins is fair and there is no centralization of wealth. + + +
+ + + +

+ Where can I buy Pactus coins? +

+
+ Pactus does not have any pre-sales coins. The only way to obtain Pactus coins at the moment is by installing the Pactus software and actively participating in block validation. By engaging in the network and contributing to block validation, you will be rewarded with Pactus coins. + + +
+ + + +

+ Why was Pactus developed? +

+
+ Pactus was developed with the goal of scaling blockchain without compromising security and decentralization. To achieve this, Pactus utilizes a unique consensus mechanism that enables the creation of blocks in just 10 seconds. Moreover, Pactus was designed to be more accessible to all users, regardless of their technical expertise or financial resources.

Our commitment to decentralization and fairness is reflected in our decision to start the Pactus blockchain from zero and ensure that all coins are minted through the consensus mechanism, rather than through an ICO or privileged accounts. + + +
+ + + +

+ What problems does Pactus solve that other blockchains don't? +

+
+ Pactus tries to solve several problems faced by other blockchain networks, including:

Scalability: Pactus has a unique consensus mechanism that is specifically designed to address the scalability issue without sacrificing the security and decentralization.

Accessibility: Running a node on Pactus is designed to be more accessible to normal users compared to other blockchains.

Fairness in distribution: Pactus has a fair and transparent coin distribution model, and all coins are generated through the consensus mechanism.

Storage cost: Pactus offers a novel storage solution by allowing users to allocate dedicated storage files, reducing storage costs and simplifying the smart contracts. + + +
+ + + +

+ How is Pactus different from Bitcoin? +

+
+ Pactus and Bitcoin are two different types of blockchain networks. While Bitcoin uses a process called "Proof of Work" to secure its network, Pactus uses a different method called "Proof of Stake". This means that instead of mining, validators are responsible for voting on incoming blocks and must hold a certain amount of the network's coin, known as "stake", as a security deposit to prevent malicious behavior. + + +
+ + + +

+ How is Pactus different from Ethereum? +

+
+ Pactus and Ethereum are both Proof of Stake blockchains, but they differ in their approach to running a validator. Running a validator on Ethereum can be challenging and requires 32 Ethereum coins to stake. In contrast, Pactus is designed to be more accessible to normal users. There is no minimum stake requirement, and you can run the Pactus node on personal Computers with basic hardware. This approach reflects our commitment to promoting decentralization and making blockchain technology accessible to a wider audience. + + +
+ +
+ +
+
+
+ + Validator +
+
+ + + +

+ What are validators? +

+
+ Validators on Pactus are responsible for processing transactions and creating blocks and, by doing so, helping to secure the network and keep it decentralized. They use their own coins as a stake to ensure the network's security and receive rewards for their contributions. + + +
+ + + +

+ What are the minimum and maximum amounts I can stake? +

+
+ In Pactus, there is no minimum limit for staking coins, but the maximum amount you can stake is 1000 coins. If you want to stake more than 1000 coins, you can run a new validator. Running multiple validators keeps the network more decentralized and helps maintain its security and stability. + + +
+ + + +

+ Why is there a limit for maximum stake? +

+
+ The limit for the maximum stake per validator enhances decentralization and prevents validators from gaining too much power, which could potentially lead them to control the committee. The maximum staking limit is part of the consensus parameters and can be changed in the future through consensus among the validators. + +
+ + + +

+ Can I run multiple validators on one computer? +

+
+ The Pactus software allows you to run up to 32 validators on a single node. Running multiple validators may require slightly more memory, but it has no impact on storage, and has a negligible effect on CPU and networking usage. Running multiple validators on a single node enables users to distribute their stake across multiple validators, especially when they want to stake more than the maximum stake per validator. This eliminates the need for additional resources and simplifies node management. + + +
+ + + +

+ How do validators get rewarded? +

+
+ Once a validator proposes a valid block and it is accepted by the network, the validator receives one coin as a block reward. The reward is an incentive given to validators for their contribution to the network. + + +
+ + + +

+ How much is the block reward in Pactus? +

+
+ Block reward in Pactus is fixed, and it is always one coin per block. This flat reward scheme helps to ensure simplicity, fairness and better coin distribution. + + + How much is the block reward in Pactus? + +
+ +
+ +
+
+
+ + Consensus +
+
+ + + +

+ How does Pactus blockchain work? +

+
+ Pactus operates with a committee of validators who are responsible for creating new blocks. The committee consists of 21 validators, however, the members of the committee change randomly over time. Every 10 seconds, a validator in the committee known as the proposer collects all the valid transactions, adds them into a block, and shares it with other validators in the committee. If more than ⅔ of the stakeholders in the committee attest to the proposed block by signing it, the block gets committed and all the transactions inside the block will be executed. This process repeats every 10 seconds. + + + How does Pactus blockchain work? + +
+ + + +

+ How can a validator enter to the committee? +

+
+ To enter the committee in Pactus, validators participate in a sortition process that occurs at each block. In this process, validators generate a provable random number between zero and the total staked coins, and if the number is less than their stake, they can send a transaction known as sortition transaction with the proof of sortition. Once the sortition transaction is included in a block, the validator replaces the oldest committee member. + + +
+ + + +

+ How are block proposers selected in the committee? +

+
+ The block proposer inside the committee is selected based on the time they entered the committee. This means that the selection process follows a first-come, first-propose order. + + +
+ + + +

+ Can multiple validators enter the committee at once? +

+
+ The process of sortition in Pactus is random, so it's possible for more than one validator to enter the committee at once, or no validator at all. However, on average, one validator should join the committee at each block. + + +
+ + + +

+ Is it possible to have two valid blocks at the same time? +

+
+ It is not possible to have two valid blocks at the same time in Pactus blockchain. The consensus algorithm in Pactus prevents the possibility of having two block proposers at the same time. This ensures that there will be no fork in the network. + + +
+ +
+ +
+
+
+ + Economy +
+
+ + + +

+ What is the total supply of Pactus coins? +

+
+ Pactus has a total supply of 21 million coins, and each coin is divided into 1 billion units. Every 10 seconds, a new coin is generated, resulting in 8,640 new coins per day and about 3 million per year. All coins will be generated within 7 years. + + + What is the total supply of Pactus coins? + +
+ + + +

+ What is the Treasury account? +

+
+ The Treasury account is a special account in Pactus blockchain that holds the total supply of coins, which is 21 million coins. It is created at the genesis time and has no key pair associated with it, meaning it cannot be accessed or controlled by anyone. Every time a block is created, one coin from the Treasury account transfers to the proposer account as a block reward. + + +
+ +
+ +
+
+
+ + Transaction +
+
+ + + +

+ What is a Transfer transaction? +

+
+ A transfer transaction is a type of transaction that allows users to transfer Pactus coin from one account to another. + + +
+ + + +

+ What is a Bond transaction? +

+
+ A bond transaction is a type of transaction that allows users to become a validator by staking some coins. The amount of stake determines the voting power in the consensus. + + +
+ + + +

+ What is a Sortition transaction? +

+
+ A sortition transaction is a type of transaction that allows validators to enter the committee. + + +
+ + + +

+ What is an Unbond transaction? +

+
+ An unbond transaction is a type of transaction that allows users to unbond their validator. Once a validator is unbonded, they can no longer participate in the consensus mechanism. + + +
+ + + +

+ What is a Withdraw transaction? +

+
+ A withdraw transaction is a type of transaction that allows a validator to withdraw their staked coins from the network. + + +
+ +
+ +
+
+
+ + Fee +
+
+ + + +

+ How are transaction fees calculated in Pactus? +

+
+ Transaction fees in Pactus are calculated using a percentage-based fee model. This means that the fee is a percentage of the transferred amount, with a minimum and maximum fee. The percentage, minimum fee, and maximum fee parameters are part of the blockchain parameters and can be changed through a agreement upon all validators. + + +
+ + + +

+ What is the minimum and maximum fee? +

+
+ These parameters are designed to provide greater control over the fee structure and ensure that fees remain within a certain range. If the calculated fee for a transaction falls below the minimum fee, the minimum fee is used instead. Similarly, if the calculated fee exceeds the maximum fee, the maximum fee is used instead. This helps prevent users from overpaying or underpaying for transactions and provides greater predictability and fairness in the fee structure. + + +
+ + + +

+ Why was a percentage-based fee model chosen for Pactus? +

+
+ The percentage-based fee model was chosen for Pactus because it provides a more equitable and predictable fee structure for users, as fees are proportional to the transferred amount. It also allows for greater flexibility in adjusting the fee structure to better align with the needs of the blockchain and its users, as the percentage, minimum fee, and maximum fee parameters can be changed through a consensus mechanism agreed upon by all validators. + + +
+ +
+ +
+ + + + +
+ +
+
+
+
+ + + + + diff --git a/about/roadmap/index.html b/about/roadmap/index.html new file mode 100644 index 000000000..62f32a155 --- /dev/null +++ b/about/roadmap/index.html @@ -0,0 +1,488 @@ + + + + + + + + + + + + + Roadmap | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+

Roadmap

+ +
+
✅ Completed Task
+
🚧 Ongoing Task
+
⏳ Upcoming Task
+
+ +
+
+
+
+
+
+
Smart Contract Engine
+
Q3 2024
+
+
+
+
+
+
+
Mobile Wallet
+
Q2 2024
+
+
+
+
+
+
+
Main Net Launch
+
Q1 2024
+
+
+
+
+
+
+ +
Oct 2023
+
+
+
+
+
+
+ +
Oct 2023
+
+
+
+
+
+
+ +
Aug 2023
+
+
+
+
+
+
+ +
Jul 2023
+
+
+
+
+
+
+ +
June 2023
+
+
+
+
+
+
+ +
May 2023
+
+
+
+
+
+
+ +
May 2023
+
+
+
+
+
+
+ +
May 2023
+
+
+
+
+
+
+ +
April 2023
+
+
+
+
+
+
+ +
September 2022
+
+
+
+
+
+
+ +
September 2022
+
+
+
+
+
+
+ +
+
+
+
+ + + + + diff --git a/about/what-is-pactus/index.html b/about/what-is-pactus/index.html new file mode 100644 index 000000000..ce99cce9f --- /dev/null +++ b/about/what-is-pactus/index.html @@ -0,0 +1,377 @@ + + + + + + + + + + + + + What is Pactus? | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+

What is Pactus?

+ +
+ +
+
+

Pactus is a blockchain focused on decentralization

+ Pactus is built on the principle that a fair and transparent system can only be achieved through decentralization. Unlike many other blockchain platforms, Pactus aims to eliminate the potential for centralization and manipulation by removing the need for delegation and miners. This allows anyone to become a part of the ecosystem and ensures that the platform remains truly decentralized. + +
+
+ +
+
+

Pactus is a user-friendly blockchain

+ Pactus aims to create a user-friendly blockchain that can be easily used by anyone, not just tech experts. Our protocol is designed to be simple, easy to maintain, and develop. Pactus offers a simple GUI application that makes it easy for users to run a node. + +
+
+ +
+
+

Pactus uses a percentage-based fee model

+ Transaction fees are calculated based on a percentage model with a minimum and maximum fee. These parameters provide greater control over the fee structure and prevent overpaying or underpaying. The percentage-based model ensures fairness and predictability, and can be adjusted through consensus among all validators. + +
+
+ +
+
+

Dedicated Decentralized Storage in Pactus

+ In Pactus, users can purchase a dedicated storage file that can be renewed annually, leading to reduced costs for storage and smart contract execution. This unique feature can pave the way for a new protocols in the decentralized platforms. + +
+
+ +
+ +
+
+
+
+ + + + + diff --git a/android-chrome-192x192.png b/android-chrome-192x192.png new file mode 100644 index 000000000..6b8b563b7 Binary files /dev/null and b/android-chrome-192x192.png differ diff --git a/android-chrome-256x256.png b/android-chrome-256x256.png new file mode 100644 index 000000000..5386e869a Binary files /dev/null and b/android-chrome-256x256.png differ diff --git a/apple-touch-icon.png b/apple-touch-icon.png new file mode 100644 index 000000000..6419a53bc Binary files /dev/null and b/apple-touch-icon.png differ diff --git a/ar/2022/08/29/dev-meeting.html b/ar/2022/08/29/dev-meeting.html new file mode 100644 index 000000000..c82f21e8c --- /dev/null +++ b/ar/2022/08/29/dev-meeting.html @@ -0,0 +1,367 @@ + + + + + + + + + + + + + Dev meeting | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Dev meeting

+ +

Meeting Summary

+ +

The meeting took place on 04 September 2022, at 2:00 PM UTC via Google Meet, +with team members from different time zones joining to discuss key aspects of the Pactus project.

+ +

NanoMsg instead of ZeroMQ

+ +

During the meeting, Joseph suggested using Nanomsg instead of ZeroMQ because building ZeroMQ is not easy, +especially in Windows. Additionally, we can use the pure Go implementation of Nanomsg.

+ +

The format of block events was defined as follows:

+ +
<event_id: 1 byte><event_data: variant><height: 4 bytes><seq_num: 4 bytes>
+
+ +

As a consequence of this, smart contracts events can be defined more easily and +Infura-like services become simple, as we can just replay the events.

+ +

Reviewing a Pull Request

+ +

Nagaraj’s pull request reviewed.

+ +

Renaming project

+ +

The team discussed renaming (rebranding) the project and decided to create an online survey to +gather suggestions for a new name. +Everyone is encouraged to participate in the survey and suggest new names for the project.

+ + + + +
+
+
+
+ + + + diff --git a/ar/2022/09/04/dev-meeting.html b/ar/2022/09/04/dev-meeting.html new file mode 100644 index 000000000..1bb4f40c3 --- /dev/null +++ b/ar/2022/09/04/dev-meeting.html @@ -0,0 +1,476 @@ + + + + + + + + + + + + + Dev meeting | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Dev meeting

+ +

Meeting Summary

+ +

The meeting took place on 29 August 2022, at 2:00 PM UTC via Google Meet, +with team members from different time zones joining to discuss key aspects of the Pactus project.

+ +

Project renamed to Pactus

+ +

During the last meeting, the team conducted an online survey to rename the project. +A total of 31 responses were received, and the following names were suggested:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameVotes
Sirius11
Pactus10
Nova7
Texo6
Zemus6
Helios6
Tutti5
Haki5
Aegeus4
Virgo4
Zentora3
Zinova3
Xerxes2
Ledgeria2
Solidus2
Welt2
Ventura2
Zebra2
Miranet2
Monetha2
FutureHub1
Muonet1
Mentha1
Hypatios0
Chaintopia0
Sycee0
Lepus0
+ +

After reviewing the responses, the team chose “Pactus” as the new name for the project. 🎉 +The project will be moved to “pactus-project/pactus,” and the team plans to announce it on social media.

+ +

Discussion on GUI

+ +

In terms of the GUI, Joseph suggested using Flutter, and the team agreed. +To interact with the wallet, gRPC APIs will be provided, and the GUI will use these APIs.

+ + + + +
+
+
+
+ + + + diff --git a/ar/2022/09/18/dev-meeting.html b/ar/2022/09/18/dev-meeting.html new file mode 100644 index 000000000..be7f90ae4 --- /dev/null +++ b/ar/2022/09/18/dev-meeting.html @@ -0,0 +1,386 @@ + + + + + + + + + + + + + Dev meeting | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Dev meeting

+ +

Meeting Summary

+ +

The meeting took place on 18 September 2022, at 2:00 PM UTC via Google Meet, +with team members from different time zones joining to discuss key aspects of the Pactus project.

+ +

Discussion about Testnet

+ +

The team discussed Testnet and related issues, including IP block issues that were found by Hadi. +Due to sanctions, some IPs are blocked, so the team will run a support node to assist users inside Iran. +The GUI application had some issues on Windows, but they were fixed and tested by Hadi.

+ +

Discussion about Website

+ +

The website still has some issues, such as the need to rename the animation to “Pactus” and the lack of a logo. +The community suggested some logos. Additionally, the roadmap page is missing.

+ +

Status of social medias

+ +

The team discussed the status of social media platforms, including:

+ +
    +
  • Discord: 70 members
  • +
  • Instagram: 87 followers
  • +
  • Telegram: 20 followers
  • +
  • Linkedin: 20 followers
  • +
  • Twitter: Not yet
  • +
+ +

The team also decided to announce the project on social media on 29 September.

+ +

Consensus parameters

+ +

The team discussed the current consensus parameters:

+ +
    +
  • Total supply: 21 million coins
  • +
  • Reward: 1 coin per block
  • +
  • Block time: 10 second
  • +
  • Committee size: 21 members
  • +
  • Bond interval: one hour
  • +
  • Unbond interval: 21 days
  • +
  • Fee fraction: 0.0001
  • +
  • Min fee: 0.0000001
  • +
  • Max fee: 0.01
  • +
  • Maximum stake: 12381
  • +
+ + + + +
+
+
+
+ + + + diff --git a/ar/2022/09/20/release-0-9-0.html b/ar/2022/09/20/release-0-9-0.html new file mode 100644 index 000000000..31caa8612 --- /dev/null +++ b/ar/2022/09/20/release-0-9-0.html @@ -0,0 +1,356 @@ + + + + + + + + + + + + + Pactus 0.9.0 released | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Pactus 0.9.0 released

+ +

Overview

+ +

Pactus Blockchain Release Version 0.9.0 +is now available for download. +This release includes a new graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Download

+ +

This version has been implemented for Testnet-0 and is preparing for the upcoming Mainnet launch. +To get started with the Pactus Blockchain Testnet-0, simply download +the latest version and run the Pactus software.

+ +

Join the Testnet now and get ready for the future!

+ + + + +
+
+
+
+ + + + diff --git a/ar/2022/09/24/testnet-0-launched.html b/ar/2022/09/24/testnet-0-launched.html new file mode 100644 index 000000000..fbbcc80a8 --- /dev/null +++ b/ar/2022/09/24/testnet-0-launched.html @@ -0,0 +1,352 @@ + + + + + + + + + + + + + Testnet-0 launch announcement | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Testnet-0 launch announcement

+ +

testnet

+ +

The Pactus blockchain Testnet-0 is now accessible. +To participate, simply download the Pactus application version 0.9.0 and +connect to the Testnet without any special configurations. +For test coins, please visit our Discord channel and share your validator address.

+ +

By taking part in the Testnet, you can familiarize yourself with the Pactus blockchain and +get ready for the Mainnet launch. +Testnet participants will also be given higher priority during the Mainnet launch.

+ +

Please share your feedback with us to help improve the user experience in future versions of the software.

+ + + + +
+
+
+
+ + + + diff --git a/ar/2022/10/30/dev-meeting.html b/ar/2022/10/30/dev-meeting.html new file mode 100644 index 000000000..a2f22992d --- /dev/null +++ b/ar/2022/10/30/dev-meeting.html @@ -0,0 +1,379 @@ + + + + + + + + + + + + + Dev meeting | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Dev meeting

+ +

Meeting Summary

+ +

The meeting took place on 30 October 2022, at 2:00 PM UTC via Google Meet, +with team members from different time zones joining to discuss key aspects of the Pactus project.

+ +

In memory of Mahsa Amini

+ +

The meeting started in memory of Mahsa Amini. +We in the Pactus family stand in solidarity with courageous people who are fighting for equality, equity and freedom in Iran.

+ +

Woman Life Freedom

+ +

Launching Block explorer

+ +

The beta version of the block explorer has been launched 🚀 and is now available at +https://pacscan.org.

+ +

Nagaraj explained the block explorer and some of the features.

+ +

Project road map

+ +

Project road map was discussed.

+ +

IdeaKita pitch deck

+ +

Ali presented the Pactus pitch deck for the IdeaKita in Malaysia. +The IdeaKita program, under the Malaysia Digital Economy Corporation (MDEC), is designed to +support entrepreneurs and startups in Malaysia.

+ +

Latest development progress

+ +

The latest pull requests were reviewed:

+ + + + + + +
+
+
+
+ + + + diff --git a/ar/2022/11/24/release-0-9-1.html b/ar/2022/11/24/release-0-9-1.html new file mode 100644 index 000000000..96e2aeb10 --- /dev/null +++ b/ar/2022/11/24/release-0-9-1.html @@ -0,0 +1,371 @@ + + + + + + + + + + + + + Pactus 0.9.1 released | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Pactus 0.9.1 released

+ +

Overview

+ +

Pactus Blockchain Release Version 0.9.1 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Download

+ +

This version has been implemented for Testnet-0 and is preparing for the upcoming Mainnet launch. +To start using the Pactus Blockchain Testnet-0, +you can download the latest version from download page +and join the Testnet.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +
    +
  • Blocks can be fully decoded when queried in gRPC
  • +
  • The HTTP module now uses gRPC module, making node configuration simpler by removing the CapnP module
  • +
  • Reducing the blockchain size by saving blocks by number instead of hash
  • +
  • The wallet can hold unconfirmed transactions
  • +
  • The wallet can use different gRPC servers
  • +
  • The GUI displays committee information
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

+ + + + +
+
+
+
+ + + + diff --git a/ar/2023/03/01/what-is-testnet.html b/ar/2023/03/01/what-is-testnet.html new file mode 100644 index 000000000..091630100 --- /dev/null +++ b/ar/2023/03/01/what-is-testnet.html @@ -0,0 +1,423 @@ + + + + + + + + + + + + + What is a Testnet? | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

What is a Testnet?

+ +

Mainnet vs Testnet?

+ +

If you have ever wondered what Testnet is and how it is different from Mainnet, read this article to the end to find out!

+ +

Mainnet and Testnet are two widely used terminologies in the Blockchain ecosystem; +so it is important to understand the meaning and differences while working in the industry or +following announcements of the Blockchain projects like Pactus.

+ +

Here’s a quick explanation: +Before the actual live version of a Blockchain network that is used for real transactions, +functions and smart-contracts (which is referred as Mainnet), +there is a test version of the Blockchain network for testing purposes (which is referred as Testnet). +In Testnet, a safe environment is provided to help developers experiment and test their applications, +and make sure that everything functions smoothly in the Mainnet version.

+ +

Testnet

+ +

A Testnet is a simulation of a Blockchain, in which developers can test all the functionalities of +their Blockchain network without risking their assets and convenience of end-users. +Using Testnet, any possible error, bug or malfunctions can be fixed before the Mainnet launch. +Testnet also can be an experimental environment for new features, updates and upgrades. +So several Testnet networks of the same version or newer version of the Mainnet can be implemented on the roadmap.

+ +

What are use cases of Testnet?

+ +

A secure environment to test development ideas and updates. +So many features and minor details in Pactus project have been successfully developed so far using the Testnet; such as:

+ +
    +
  • extra details and information on Pactus-GUI;
  • +
  • well-functioning Pactus Blockchain explorer to access transactions and block details;
  • +
  • Upgrades that led to decreasing the size of the Pactus network
  • +
+ +

Providing a safe testing ground for resolve scalability and security problems, as well as decentralization issues. +Pactus network is also a secure and purely decentralized network. However in the last updates during the Testnet, +developers are now able to decrease the database size by approximately 10% without compromising performance. +They did it by utilizing block height instead of hash to store blocks within the database. (you can find out more +here).

+ +

Testing new versions, patches and features on Testnet. it is vital for enhancing the security, load testing, +Blockchain migration, integration tests, and etc. This is why you can now use the latest version of Pactus-GUI +that works like clockwork and is extremely secure.

+ +

Testing the functions of cryptocurrency without disrupting the Mainnet. In the Testnet of Pactus Blockchain, +you as a user or validator can use all the features to send, receive, bond or unbond your assets in the Pactus-GUI.

+ +

Development and simulation of smart contract features and DApps. Note that many Blockchain projects like Pactus, +can be used as smart-contract platforms. So the Testnet can be designed in different stages to test and improve +different applications of the network.

+ +

Please note that after a certain period of time, when developers get satisfied with the functionality and debugging process, +they launch Mainnet. Mainnet has its own independent genesis blocks; +so the assets and addresses that users use in Testnet are not valid inside the new Mainnet Blockchain anymore. +In fact the whole Blockchain network starts working from the scratch and users and validators start to +work with real tokens and transactions instead of the simulated ones. But since Testnet has an important effect +on the health and improvement of the network, in Pactus Blockchain, we have several advantages +for the people who join the Testnet.

+ +

Why should you join the Testnet?

+ +

There are different contributors in a Blockchain network; +Some people are developers and programmers that use the Testnet to contribute, enhance and lead the project to a better future. +Testnet is actually vital for them to perform their changes and try their innovations and ideas.

+ +

But you might also be an end user; you might want to either be a validator and stake your assets to earn more Pactus coins, +or you might want to learn how to use the network for future personal applications. Either way, +you might find it handy to give it a try and be familiar with Pactus-GUI and its different features.

+ +

However, there is another advantage for end users who join the Testnet. +While using the network, running a node or testing the Pactus-GUI in Testnet period, you are contributing to +the community to find improvement potentials, that’s why there are more advantages contemplated for the Testnet users; +Soon our Mainnet will be launched and also Pactus network will be announced and listed in well-known exchanges. +As an early contributor, you will have the advantage of getting some extra initial tokens at the beginning of Mainnet launch. +So that you can use it to run a validator node and earn more from staking your assets. This airdrop is considered +for every individual who installs Pactus-GUI and starts a node in Testnet.

+ +

There are other positive conditions you may experience as an early contributor.

+ +
    +
  • Advanced and very responsive support for your issues (we dedicate more time to provide you with solutions)
  • +
  • Embracing your suggestions, improvement ideas, needs and information you may require to have a better user experience.
  • +
+ + + + +
+
+
+
+ + + + diff --git a/ar/2023/04/21/testnet-0-concluded.html b/ar/2023/04/21/testnet-0-concluded.html new file mode 100644 index 000000000..b9262bea6 --- /dev/null +++ b/ar/2023/04/21/testnet-0-concluded.html @@ -0,0 +1,376 @@ + + + + + + + + + + + + + Story of Testnet-0 | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Story of Testnet-0

+ +

What is Testnet?

+ +

Testnet is a testing environment where developers and users can try out the functionality of a blockchain project, +without putting real assets or data at risk. +It helps to ensure that the final product is reliable and secure for users to use. +If you like to read more about the Testnet you can check out our post on +“What is Testnet?”.

+ +

Summary of Testnet-0

+ +

In September 2022, we launched our first Testnet. +The purpose of this Testnet was to +check the consensus protocol, +test different transaction types, +and ensure the stability of the blockchain. +We also wanted to test the sortition algorithm +to make sure it works properly.

+ +

The committee +for the Testnet-0 was set to five validators, and more than 19 validators joined during the Testnet period. +Over 2 million blocks were created, and more than 3.2 million transactions were processed during this time. +The size of the blockchain is approximately 1 gigabyte. +The maximum number of transactions recorded in a single block was 386. With a block time of 10 seconds, +we can confirm that Pactus blockchain can support up to 30 transactions per second (TPS), +which is a reasonable number for TPS. Based on real-time statistics available at realtps, +we can see that Pactus is among the top 10 blockchains in terms of TPS.

+ +

At this point, the development team decided to end the Testnet-0 and move on to the next one, +Testnet-1. We are planning to run the Testnet-1 to prepare for the MainNet launch. +We will provide updates on our progress and share the details of the new Testnet soon.

+ +

As promised, participants in Testnets will be given priority as validators for the MainNet, +and will receive bounty tokens from the bootstrap accounts to set up their validator. +We are grateful to all those who participated in Testnet-0, and we encourage them to join our next Testnet to +help us improve Pactus. +As a community-based project, we rely on the support of our community members, and we value any help we receive.

+ + + + +
+
+
+
+ + + + diff --git a/ar/2023/05/08/release-0-10-0.html b/ar/2023/05/08/release-0-10-0.html new file mode 100644 index 000000000..458ca3a29 --- /dev/null +++ b/ar/2023/05/08/release-0-10-0.html @@ -0,0 +1,399 @@ + + + + + + + + + + + + + Pactus 0.10.0 released | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Pactus 0.10.0 released

+ +

Overview

+ +

Pactus Blockchain Version 0.10.0 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Highlight

+ +

The main update in this version allows users to set up multiple validators in one node. +Users can set up to 32 validators in a single node, and each validator can stake up to 1,000 coins.

+ +

Multi validators

+ +

Download

+ +

This version has been implemented for Testnet-1 and +is being prepared for the upcoming Mainnet launch. +To start using Pactus Blockchain Testnet-1, download the latest version from the +download page and join the Testnet.

+ +

These guides can help you to run and configure your node:

+ + + +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • removing address from account (#454)
  • +
  • supporting multiple consensus instances (#450)
  • +
  • adding sortition interval to the parameters (#442)
  • +
+ +

Fix

+ +
    +
  • gui: check if the node has an active consensus instance (#458)
  • +
  • Use of a Persistent Merkle tree to enhance performance of calculating the +state hash; fully tested in Testnet-0 (#432)
  • +
  • GetBlockchainInfo API in gRPC now returns the total number of validators and accounts (#439)
  • +
  • wallet path as argument (#455)
  • +
  • adding reward addresses to config (#453)
  • +
  • removing committers from the certificate hash (#444)
  • +
  • prevent data race conditions in committee (#452)
  • +
  • using 2^256 for the vrf denominator (#445)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

+ + + + +
+
+
+
+ + + + diff --git a/ar/2023/05/09/testnet-1-launched.html b/ar/2023/05/09/testnet-1-launched.html new file mode 100644 index 000000000..00e6a6875 --- /dev/null +++ b/ar/2023/05/09/testnet-1-launched.html @@ -0,0 +1,382 @@ + + + + + + + + + + + + + Testnet-1 launch announcement | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Testnet-1 launch announcement

+ +

Overview

+ +

The Pactus blockchain Testnet-1 is now available for participation. +This version simulates the Mainnet environment and evaluate the system’s performance, stability, +and security in a controlled environment. +The primary goal of this version of Testnet is to determine the efficient and secure committee size for the Mainnet.

+ +

Key Aspects

+ +
    +
  • Simulating the Mainnet environment
  • +
  • Determining the actual block creation time
  • +
  • Assessing the staking mechanism and consensus protocol
  • +
  • Evaluating network usage under different loads
  • +
  • Evaluating the syncing process for new nodes joining the network
  • +
  • Ensuring network stability with over 1000 validators
  • +
  • Evaluating transaction performance
  • +
  • Conducting stress tests
  • +
  • Performing security tests, including double spend attacks, Sybil attacks +(nodes with different identities), and forking resistance
  • +
+ +

Joining Testnet-1

+ +

To join the Testnet, download Pactus software +version 0.10.0 and +connect to Testnet without any special configuration or hardware. +You can run the software on your personal computer or laptop. +To acquire test coins, visit the Discord channel and +provide your validator address.

+ +

Benefits for Participation

+ +

By taking part in the Testnet, users can familiarize themselves with the Pactus blockchain and +be well-prepared for the Mainnet launch. +Testnet participants will also receive higher priority during the Mainnet launch and +get free coins for initial staking on the Mainnet.

+ +

Your Feedback Matters

+ +

User feedback plays a vital role in the improvement of the Pactus blockchain. +Share your thoughts and experiences to contribute to the enhancement of future software versions.

+ + + + +
+
+
+
+ + + + diff --git a/ar/2023/05/29/release-0-11-0.html b/ar/2023/05/29/release-0-11-0.html new file mode 100644 index 000000000..d1342fcfe --- /dev/null +++ b/ar/2023/05/29/release-0-11-0.html @@ -0,0 +1,411 @@ + + + + + + + + + + + + + Pactus 0.11.0 released | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Pactus 0.11.0 released

+ +

Overview

+ +

Pactus Blockchain Version 0.11.0 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Highlights

+ +

The main update in this version is the fix for the relay +connection issue. +A relay is a peer in the network that facilitates the connection between two peers, +particularly when they are using home internet.

+ +

Another significant update is that sending a Bond transaction +is now more user-friendly. +Users no longer need to set the validator public key if they want to bond Test PAC coins to their validators.

+ +

Bond transaction dialog

+ +

Download

+ +

This version has been implemented for Testnet-1 and +is being prepared for the upcoming Mainnet launch. +To start using Pactus Blockchain Testnet-1, download the latest version from the +download page and join the Testnet.

+ +

These guides can help you to run and configure your node:

+ + + +

How to Upgrade

+ +

If you are running an older version, shut it down. +Uninstall the previous version and install the newer version. +If you are using the archived version, simply use the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Fix

+ +
    +
  • gui: showing the total number of validators (#474)
  • +
  • network: fixing relay connection issue (#475)
  • +
  • consensus: rejecting vote with round numbers exceeding the limit (#466)
  • +
  • increase failed counter when stream got error (#489)
  • +
  • boosting syncing process (#482)
  • +
  • waiting for proposal in pre-commit phase (#486)
  • +
  • retrieving public key from wallet for bond transactions (#485)
  • +
  • restoring config file to the default (#484)
  • +
  • defining ChainType in genesis to detect the type of network (#483)
  • +
  • reducing the default Argon2d to consume less memory (#480)
  • +
  • adding password option to the start commands (#473)
  • +
+ +

Refactor

+ +
    +
  • rename send to transfer. (#469)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

+ + + + +
+
+
+
+ + + + diff --git a/ar/2023/06/19/release-0-12-0.html b/ar/2023/06/19/release-0-12-0.html new file mode 100644 index 000000000..2a7286ef5 --- /dev/null +++ b/ar/2023/06/19/release-0-12-0.html @@ -0,0 +1,409 @@ + + + + + + + + + + + + + Pactus 0.12.0 released | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Pactus 0.12.0 released

+ +

Overview

+ +

Pactus Blockchain Version 0.12.0 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Highlights

+ +

This version is focused on improving the sync time to make it faster. +This is achieved by implementing a caching mechanism that executes transactions more quickly and +improves the calculation of total power (stake) of the blockchain in a more effective way.

+ +

Syncing progress

+ +

Download

+ +

This version has been implemented for Testnet-1 and +is being prepared for the upcoming Mainnet launch. +To start using Pactus Blockchain Testnet-1, download the latest version from the +download page and join the Testnet.

+ +

These guides can help you to run and configure your node:

+ + + +

How to Upgrade

+ +

If you are running an older version, shut it down. +Uninstall the previous version and install the newer version. +If you are using the archived version, simply use the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • add GetAccountByNumber API to get account by number (#511)
  • +
+ +

Fix

+ +
    +
  • caching account and validator in store (#513)
  • +
  • get recent blocks by stamp (#509)
  • +
  • closing the mDNS connection upon stopping the network (#508)
  • +
  • updating linkedmap to use generic (#507)
  • +
  • removing state from cache (#506)
  • +
  • Typo in GUI (#499)
  • +
  • supporting localnet (#492)
  • +
+ +

Refactor

+ +
    +
  • update total power calculation based on power change(deltas) (#518)
  • +
  • GetValidators return all validators in state validators map (#512)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

+ + + + +
+
+
+
+ + + + diff --git a/ar/2023/07/01/release-0-13-0.html b/ar/2023/07/01/release-0-13-0.html new file mode 100644 index 000000000..ece40f40a --- /dev/null +++ b/ar/2023/07/01/release-0-13-0.html @@ -0,0 +1,400 @@ + + + + + + + + + + + + + Pactus 0.13.0 released | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Pactus 0.13.0 released

+ +

Overview

+ +

Pactus Blockchain Version 0.13.0 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Highlights

+ +

Users can now restore the default_wallet during the node initialization. +If users have a backup of the seed phrase (mnemonic) for the default_wallet, +they can now restore it and re-initialize the node.

+ +

Restore mode

+ +

Download

+ +

This version has been implemented for Testnet-1 and +is being prepared for the upcoming Mainnet launch. +To start using Pactus Blockchain Testnet-1, download the latest version from the +download page and join the Testnet.

+ +

These guides can help you to run and configure your node:

+ + + +

How to Upgrade

+ +

If you are running an older version, shut it down. +Uninstall the previous version and install the newer version. +If you are using the archived version, simply use the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Fix

+ +
    +
  • implemented restore wallet base on input seed (#553)
  • +
  • measuring total sent and received bytes (#552)
  • +
  • add validate seed and restore wallet (#533)
  • +
  • HTTP: Missing handlers (#549)
  • +
  • gui: update about dialog and menu items in help (#532)
  • +
+ +

Refactor

+ +
    +
  • implementing TestSuite (#535)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

+ + + + +
+
+
+
+ + + + diff --git a/ar/2023/07/05/testnet-500-validators.html b/ar/2023/07/05/testnet-500-validators.html new file mode 100644 index 000000000..4c56ca85e --- /dev/null +++ b/ar/2023/07/05/testnet-500-validators.html @@ -0,0 +1,374 @@ + + + + + + + + + + + + + 500 validators joined Testnet | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

500 validators joined Testnet

+ +

For a Proof of Stake blockchain, validators are important for +maintaining the network’s integrity and security. They are similar to miners in Proof of Work blockchains like Bitcoin.

+ +

Pactus as a real Proof of Stake blockchain, has achieved a significant milestone. +More than 500 validators joined the Testnet +in less than 2 months. +This accomplishment proves that Pactus is reliable, resilient, and trustworthy. More importantly, it sets new standards +in the blockchain world. In fact, the Pactus Testnet is even more decentralized than some well-known blockchains.

+ +

500 validators of Testnet

+ +

One key reason why Pactus can accommodate more validators is its powerful +consensus mechanism. +The consensus mechanism in Pactus eliminates the need for delegation, making it possible for anyone to become a validator. +Additionally, the user-friendly application ensures that even those new to blockchain can easily contribute to the network.

+ +

What is the next

+ +

To remain competitive in the market, Pactus recognizes the importance of prioritizing user space. +We aim to ensure that running Pactus is affordable and accessible to anyone, regardless of their technical expertise or +available resources.

+ +

To achieve this, the Pactus team constantly monitors network, storage, and computational usage, striving to keep them +at minimal levels. +By doing so, we enable more individuals to participate in the Pactus blockchain.

+ +

Currently, the Pactus team is working on optimizing and reducing network usage. This effort will lead to reduced costs, +especially for users who are using home internet connections.

+ +

Furthermore, we are planning to introduce a pruning mode, allowing users to run the Pactus blockchain with significantly +less storage. +Although we believe the storage size is already small, our goal is to enable users to +retain only the most recent blockchain history. +This approach ensures that the blockchain size remains as compact as possible by disregarding some history of the blockchain.

+ + + + +
+
+
+
+ + + + diff --git a/ar/2023/07/09/dev-meeting.html b/ar/2023/07/09/dev-meeting.html new file mode 100644 index 000000000..89f7c66d8 --- /dev/null +++ b/ar/2023/07/09/dev-meeting.html @@ -0,0 +1,380 @@ + + + + + + + + + + + + + Dev meeting | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Dev meeting

+ +

Meeting Summary

+ +

The meeting took place on 09 July 2023, at 2:00 PM UTC via Google Meet, +with team members from different time zones joining to discuss key aspects of the Pactus project.

+ +

Overview to the Network Module

+ +

The meeting began with an overview of the Network module in Pactus. +This module uses Libp2p as its underlying network protocol.

+ +

The Network module is agnostic about the content of the message and +handles two types of messages: Gossip messages, which are broadcasted, +and Stream messages, which are sent directly to a specific peer. +The team discussed the relay nodes that enable communication for nodes behind NAT. +Upon receiving a message, the module publishes an event. +The two types of events are Gossip events and Steam events.

+ +

Network messages

+ +

The team discussed the issue of Relay connections resetting, and explored solutions such as +hole punching or using UDP and IPv6.

+ +

Some users in the Testnet reported high network usage. +The team discussed implementing metrics for LibP2P to monitor network usage effectively. +The discussion related to this issue can be found here. +Additionally, the team discussed the customization of network resources, +including setting limits for inbound and outbound connections.

+ +

Overview to the Sync Module

+ +

Moving on, the Sync module was discussed. +Unlike the Network module, the Sync module has full knowledge about the messages and packets. +The module handles a range of message types, which can be found +here.

+ +

It was suggested that we need to define metrics for each message type. +There was also a discussion about the need for reducing the messages to optimize the use of network resources.

+ +

The team decided to continue discussing these topics in future meetings. +They also plan to work on improving the Network and Sync modules based on these discussions.

+ + + + +
+
+
+
+ + + + diff --git a/ar/2023/08/01/testnet-1-concluded.html b/ar/2023/08/01/testnet-1-concluded.html new file mode 100644 index 000000000..0948e6353 --- /dev/null +++ b/ar/2023/08/01/testnet-1-concluded.html @@ -0,0 +1,405 @@ + + + + + + + + + + + + + Story of Testnet-1 | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Story of Testnet-1

+ +

About Testnet

+ +

Testnet is a testing environment where developers and users can try out the functionality of a blockchain project, +without putting real assets or data at risk. +It helps to ensure that the final product is reliable and secure for users to use. +If you like to read more about the Testnet you can check out our post on +“What is Testnet?”.

+ +

Summary

+ +

In May 2023, we launched our second Testnet. +The main purpose of this Testnet was to measure block time creation and the responsiveness of the blockchain. +The development team also focused on evaluating the network’s performance. +Additionally, the overall performance of the software and the syncing process were closely examined and assessed.

+ +

The committee for Testnet-1 was set to 21 validators, +and 584 validators joined during the Testnet period. +More than 600,000 blocks were created, and more than 1 million transactions were processed during this time. +The size of the blockchain is about 300 megabytes.

+ +

About 300,000 coins were staked during this period, it was almost 50% of the total generated coins. +It shows that users, even in Testnet, tend to stake their coins.

+ +

Staking chart

+ +

We were able to extract the confirmation time of transactions. +More than 97% of transactions were confirmed in just one block after submission. +This indicates that the transaction pool and broadcasting models are working fine.

+ +

Transaction confirmation chart

+ +

Based on logs from one of the validators, the time for creating a block is about 3 seconds in normal cases. +More than 97% of blocks are committed in the first rounds.

+ +

Consensus round chart

+ +

During Testnet-1, we released three versions(Version +0.11.0, +0.12.0, +0.13.0), and the upgrade process was smooth. +At this time, the development team decided to stop Testnet-1 and work on improvements that are not backward compatible, +including:

+ +
    +
  • Improving the consensus protocol
  • +
  • Reducing the blockchain size
  • +
  • Optimizing the network usage
  • +
+ +

After stabilizing the changes, we will announce the next Testnet, and hopefully, this will be the pre-launch Testnet.

+ +

Spacial thanks to the community

+ +

This Testnet was important for us. +It helped us learn what we need to do to make Pactus work even better. +Without the community that supports us and dedicates their time and resources to testing and feedback, +we wouldn’t have been able to progress as we have.

+ +

we thank all of them for their valuable contributions. +As promised, participants in Testnets will be given priority as validators for the MainNet, and +will receive bounty tokens from the bootstrap accounts to set up their validator.

+ +

We are grateful to all those who participated in Testnet-1, and +we encourage them to join our next Testnet to help us improve Pactus. +As a community-based project, we rely on the support of our community members, and we value any help we receive.

+ + + + +
+
+
+
+ + + + diff --git a/ar/2023/08/22/dev-report.html b/ar/2023/08/22/dev-report.html new file mode 100644 index 000000000..b94cdfe3a --- /dev/null +++ b/ar/2023/08/22/dev-report.html @@ -0,0 +1,374 @@ + + + + + + + + + + + + + Dev report | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Dev report

+ +

Abstract

+ +

there is several activities in pactus github this month, here is a clear report and explain of activities.

+ +

Github Pactus

+ +

Linters

+ +

one of new changes in pactus project is new linters we added this month. +what is linters? +linters are just a set of rules for the style of source codes, they force developers to write new codes +in correct, clean and safe way.

+ +

why we use them? +the reason we are using linters in Pactus and add new ones, is to make the code more safe, +and also make it easy to work on for new contributors because we are focus on being decentralized even in development.

+ +

Linters we added till now

+ +

TLA+ spec

+ +

one another new change in Pactus is updating TLA+ spec, which is related to consensus, +as you know we had some problem with consensus in Testnet-1, we fixed the issues and now we are trying to make it more clean.

+ +

link to changes

+ +

if you wish you can learn more about Pactus consensus here.

+ +

Refactoring

+ +

some of previous Pactus dependencies was so old, so we start refactoring them and use new libraries. +also we used some libraries with higher performance which is make Pactus full node more faster in mainnet.

+ +

one of refactors

+ + + + +
+
+
+
+ + + + diff --git a/ar/2023/09/04/introduction-to-pips.html b/ar/2023/09/04/introduction-to-pips.html new file mode 100644 index 000000000..a5c116ea0 --- /dev/null +++ b/ar/2023/09/04/introduction-to-pips.html @@ -0,0 +1,382 @@ + + + + + + + + + + + + + Introduction to PIPs | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Introduction to PIPs

+ +

Introduction to PIPs

+ +

In our commitment to transparency and innovation, we’re excited to introduce a major step in Pactus’s journey: +the Pactus Improvement Proposals, or PIPs.

+ +

PIPs image

+ +

What are PIPs?

+ +

Pactus Improvement Proposals (PIPs) define standards for the ongoing development and enhancement of the Pactus platform. +Each PIP has a unique number like PIP-2, +PIP-3, and so on. +These proposals provide technical details for suggested modifications or enactments, serving as a guide for development.

+ +

The PIP process

+ +

The PIP process is open, allowing any member of the Pactus community to propose a PIP. +The author should provide a summary, motivation, and a detailed technical explanation. +The Pactus Laboratory team will carefully review each PIP. +Security considerations must be addressed before finalizing a PIP. +Once finalized, it can be added to the code. +This process helps avoid unexpected issues during development and maintain consistency and safety.

+ +

The Origins of PIPs

+ +

The Pactus Improvement Proposals (PIPs) was inspired by the +Ethereum Improvement Proposals (EIPs) system, +which had its roots in the Bitcoin Improvement Proposals (BIPs) and +Python Enhancement Proposals (PEPs).

+ +

New Feature Policy

+ +

From now on, all major changes or new features in the Pactus project require a PIP. +Any implementation must reference its specific PIP. +Without approval from Pactus Laboratory team, changes won’t be approved and added to the codebase.

+ +

PIPs Repository

+ +

For a complete list of Pactus Improvement Proposals, visit this link. +The corresponding GitHub repository is accessible here.

+ +

PIPs repository on Github

+ + + + +
+
+
+
+ + + + diff --git a/ar/2023/09/24/dev-report-pre-testnet-2.html b/ar/2023/09/24/dev-report-pre-testnet-2.html new file mode 100644 index 000000000..f75dcf4e4 --- /dev/null +++ b/ar/2023/09/24/dev-report-pre-testnet-2.html @@ -0,0 +1,392 @@ + + + + + + + + + + + + + Dev Report pre-testnet2 | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Dev Report pre-testnet2

+ +

Abstract

+ +

there is several activities in Pactus github in September month, here is a clear report and explain of activities.

+ +

Github Pactus

+ +

Implementing PIP 2, 3 and 4

+ +

After starting Pactus Labs and PIPs, +we start implementing each accepted PIP one by one to improve Pactus, here is a list of implemented PIPs:

+ + + +

Network

+ +

There is some very good change and new features for Pactus network module, +this list contain a list of important changes in Pactus networking:

+ + + +

gRPC and nanomessage services

+ +

We also updated, improved and enhanced gRPC and nanomessage services for better developer experience, +for third-party and side project developers, here is some changes:

+ + + +

Refactoring and other new feature or debugs

+ +

We had some not implemented feature request, not fixed bugs and some issue with new golang version, +list of this changes:

+ + + + + + +
+
+
+
+ + + + diff --git a/ar/2023/09/28/how-sspos-works-in-simple-word.html b/ar/2023/09/28/how-sspos-works-in-simple-word.html new file mode 100644 index 000000000..a07d25b8d --- /dev/null +++ b/ar/2023/09/28/how-sspos-works-in-simple-word.html @@ -0,0 +1,426 @@ + + + + + + + + + + + + + How SSPoS (Solid State Proof of Stake) works in simple word | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

How SSPoS (Solid State Proof of Stake) works in simple word

+ +

Abstract

+ +

In all Blockchain protocols, there is a concept called a consensus mechanism. +This mechanism is used to enable nodes to reach an agreement +on the state of the Blockchain they are +maintaining, in order to have a synchronized and integrated Blockchain.

+ +

For now, we have a lot of consensus mechanisms in the Blockchain world. +Pactus Blockchain uses the SSPoS (Solid State Proof of State) which is a new consensus model.

+ +

To explain how it works let’s start with explaining one of the first and simplest +consensus mechanisms (or if you already know them, just jump into the last part named SSPoS).

+ +

Solid State Proof of Stake

+ +

PoW (Proof of Work)

+ +

In the proof of work model, each node in the network should solve a complex mathematical +problem that requires lots of computing resources to make a new block.

+ +

In this way, it’s highly unlikely that anyone would be able to change +past transactions and change Blockchain states such as balances, +without expending equivalent computational power.

+ +

By doing this we ensure the security and integrity of the Blockchain.

+ +

The concept was adapted from digital tokens by Hal Finney in 2004 +through the idea of “reusable proof of work” using the 160-bit secure hash algorithm 1 (SHA-1).

+ +

Bitcoin uses this consensus model.

+ +

PoS (Proof of Stake)

+ +

On the other hand, PoS or Proof of Stake is another consensus mechanism that instead of miners has validators!

+ +

Validators lock a number of their assets in the Blockchain and they can transfer or use it +till it is locked which we call staking. +after each Block is committed one of the validators will be chosen randomly (more amount of stake, +more chance to be chosen) when a validator is chosen +it proposes a block and announces it to other nodes to be validated, +when a supermajority of validators accept the block it’s going to be committed.

+ +

In this system, validators have no incentive to behave maliciously or dishonestly. +If they do, they risk losing the stake amount.

+ +

More amount of validators in a PoS Blockchain makes it more secure, +decentralized, and trustable, but it also makes the validation and consensus process slower and more difficult.

+ +

Ethereum uses this model.

+ +

DPoS (Delegated Proof of Stake)

+ +

DPoS or Delegated Proof of Stake, is a variant of the PoS consensus algorithm. +users entrust their stakes to a small group of “delegates”. +These delegates are responsible for validating transactions +and creating blocks. The number of delegates is limited +to ensure accountability and efficiency in the validation process.

+ +

Some Blockchains like Cardano and Tron use DPoS.

+ +

DPoS tries to solve the issue of PoS which when validators +increase we have an inefficient validation process. but the main issue with DPoS itself is putting a lot +of trust in the hands of a small number of delegates, +which goes against the principle of “don’t trust, verify”.

+ +

SSPoS (Solid State Proof of Stake)

+ +

BUT, HOW ABOUT SSPoS? HOW ABOUT PACTUS?

+ +

In Pactus Blockchain, we have something called Solid State Proof of Stake +and we try to fix the previous model’s issue, let me explain.

+ +

Pactus uses a dynamic committee of validators with a fixed size of 21, +but the members of the committee randomly change in each round, +based on stake amount the chance of being chosen is higher. on the other hand, +the number of validators out on the committee is unlimited, allowing anyone +to become a validator by staking coins.

+ +

At each block, validators participate in a sortition algorithm by generating a random number +between zero and the total staked coins. If the number is less +than the validator’s stake, they can enter the committee and replace the oldest committee member.

+ +

So, in SSPoS models which are a variant of PoS, we can reach a consensus, +without using high computation resources, having an inefficient +validation process by increasing validator numbers, +and also without breaking the principle of “don’t trust, verify”.

+ + + + +
+
+
+
+ + + + diff --git a/ar/2023/10/15/release-0-15-0.html b/ar/2023/10/15/release-0-15-0.html new file mode 100644 index 000000000..888ceb3c9 --- /dev/null +++ b/ar/2023/10/15/release-0-15-0.html @@ -0,0 +1,466 @@ + + + + + + + + + + + + + Pactus 0.15.0 released | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Pactus 0.15.0 released

+ +

Overview

+ +

Pactus Blockchain Version 0.15.0 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Splash screen

+ +

Download

+ +

This version is the bootstrap version for +Testnet-2. +To start using Pactus Blockchain Testnet-1, download the latest version from the +download page and join the Testnet.

+ +

These guides can help you to run and configure your node:

+ + + +
+ If you participated in Testnet-1, ensure to delete your previous working directory and + create a new wallet. +

+ By default, the working directory is located at "C:\Users\<name>\pactus" on Windows, + or "~/pactus" on Unix-compatible platforms. +
+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • gui: adding the splash screen (#743)
  • +
  • add absentees votes to the certificate (#746)
  • +
  • logger: short stringer for loggers (#732)
  • +
  • implementing pip-7 (#731)
  • +
  • implementing pip-11 (#712)
  • +
  • implementing pip-8 (#711)
  • +
  • implementing pip-9 (#706)
  • +
  • new API to get Public key by address (#704)
  • +
  • Adding address field for AccountInfo (#703)
  • +
  • CreateValidatorEvent and CreateAccountEvent for nanomsg (#702)
  • +
  • implementing PIP-2 and PIP-3 (#699)
  • +
  • Adding Hole Punching to network (#697)
  • +
  • write logs into file (#673)
  • +
  • check protocol support before sending connect/disconnect event (#683)
  • +
  • updating genesis for pre-testnet-2 (#679)
  • +
  • adding udp protocol for network (#672)
  • +
  • implementing pip-4 (#671)
  • +
  • Notifee service events (#628)
  • +
  • adding MinimumStake parameter (#574)
  • +
  • adding Sent and Received bytes per message metrics for peers (#618)
  • +
  • add reason to BlockResponse messages (#607)
  • +
  • Add CalcualteFee in GRPC (#601)
  • +
  • add sent bytes and received bytes metrics to peerset plus update grpc (#606)
  • +
  • added metrics of libp2p with supporting prometheus (#588)
  • +
  • Check node address is valid (#565)
  • +
  • add LastSent and LastReceived properties to peer (#569)
  • +
+ +

Fix

+ +
    +
  • data race issue on updating certificate (#747)
  • +
  • network: async connection (#744)
  • +
  • adding query vote timer for CP phase (#738)
  • +
  • trim transactions in proposed block (#737)
  • +
  • fixing query votes and proposal issue (#736)
  • +
  • fixing issue when a block has max transactions (#735)
  • +
  • consensus: anti-entroy mechanism for the consensus (#734)
  • +
  • logger: invalid level parsing error (#733)
  • +
  • cache certificate by height (#730)
  • +
  • fixing a crash on consensus (#729)
  • +
  • consensus: prevent double entry in new height (#728)
  • +
  • resolve consensus halt caused by time discrepancy in network. (#727)
  • +
  • unsorted addresses in wallet listing (#721)
  • +
  • send query votes message, if there is no proposal yet (#723)
  • +
  • fixing logger level issue (#722)
  • +
  • fixing syncing stuck issue (#720)
  • +
  • fixing some minor issues on pre-testnet (#719)
  • +
  • supporting go version 1.21 and higher (#692)
  • +
  • ensure log rotation using tests (#693)
  • +
  • restoring at the first block (#691)
  • +
  • swagger doesn’t work with multiple proto files (#687)
  • +
  • fixing wallet-cli issues (#686)
  • +
  • prevent stripping public key for subsidy transactions (#678)
  • +
  • updating the consensus protocol (#668)
  • +
  • aggregating signature for hello message (#640)
  • +
  • error case for logger (#634)
  • +
  • adding committers to the certificate (#623)
  • +
  • updating sortition executor (#608)
  • +
  • update buf and fixing proto generation issue (#600)
  • +
  • adding block hash to peer (#584)
  • +
  • copy to clipboard option for address and pubkey (#583)
  • +
  • public key aggregate (#576)
  • +
  • remove GetValidators rpc method (#573)
  • +
  • missing swagger ui for grpc get account by number (#564)
  • +
  • incorrect handler for validator by number (#563)
  • +
+ +

Refactor

+ +
    +
  • sync: refactoring syncing process (#676)
  • +
  • remove payload prefix from payload transaction type (#669)
  • +
  • change Hello message from broadcasting to direct messaging (#665)
  • +
  • committee: using generic list for validators (#667)
  • +
  • rename SanityCheck to BasicCheck (#643)
  • +
  • cli: Migrating from mow.cli to cobra for wallet (#629)
  • +
  • cli: replacing mow.cli with cobra for daemon (#621)
  • +
  • logger: using fast JSON logger (zerolog) (#613)
  • +
  • Using Generics for calculating Min and Max for numeric type #604 (#609)
  • +
  • Updating LRU cache to version 2 #514 (#602)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

+ + + + +
+
+
+
+ + + + diff --git a/ar/2023/10/15/testnet-2-launched.html b/ar/2023/10/15/testnet-2-launched.html new file mode 100644 index 000000000..22a03d6ca --- /dev/null +++ b/ar/2023/10/15/testnet-2-launched.html @@ -0,0 +1,390 @@ + + + + + + + + + + + + + Testnet-2 launch announcement | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Testnet-2 launch announcement

+ +

Overview

+ +

Exciting news for the Pactus Community: Testnet-2 is has launched! +The journey through Testnet-1 +brought success and invaluable experiences, with over 500 validators joining the network. +Despite its noteworthy achievements, it also faced challenges that led to a tough decision: to pause the Testnet and +thoroughly address these issues. +After two months of dedicated work and testing, many problems have been resolved, and +we feel confident launching the Testnet again. +Testnet-2 comes with substantial improvements compared to its predecessor by enhancing the core of the Pactus Blockchain. +Notably, the new consensus mechanism and improved overall network performance.

+ +

At this point, we want to assure the Pactus community that this version of +the Testnet will not stop until the mainnet launches, +and our main focus is on improving its overall performance and launching the Mainnet.

+ +

If you’re new to the concept of Testnet, check out our informative post: +What is the Testnet?

+ +

Key Focus Areas

+ +

Testnet-2 has important tasks ahead. +Firstly, we aim to confirm that the new consensus mechanism is both safe and efficient. +A close eye will be kept on the network’s performance, ensuring it operates as expected. +For Testnet-2, the committee +size has been expanded to 51 members. +Both the committee’s performance and block production will be closely monitored. +The goal is a blockchain that remains stable and trustworthy, +even with thousands of validators in the network, +ensuring it manages its regular duties seamlessly.

+ +

How To Join

+ +

Want to join the Testnet-2? Great! It’s super easy. +Just download the latest Pactus software and you’re good to go. +no fancy setups or special gear needed. +You can run the software straight from your personal computer or laptop. +Need some test coins? Pop over to our Discord channel and share your validator address there.

+ +

Benefits for Participation

+ +

By taking part in the Testnet, users can familiarize themselves with the Pactus blockchain and +be well-prepared for the Mainnet launch. +Testnet participants will also receive higher priority during the Mainnet launch and +get free coins for initial staking on the Mainnet.

+ +

Your Feedback Matters

+ +

User feedback plays a vital role in the improvement of the Pactus blockchain. +Share your thoughts and experiences to contribute to the enhancement of future software versions.

+ + + + +
+
+
+
+ + + + diff --git a/ar/2023/10/21/release-0-15-1.html b/ar/2023/10/21/release-0-15-1.html new file mode 100644 index 000000000..ae5ef5157 --- /dev/null +++ b/ar/2023/10/21/release-0-15-1.html @@ -0,0 +1,386 @@ + + + + + + + + + + + + + Pactus 0.15.1 released | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Pactus 0.15.1 released

+ +

Overview

+ +

Pactus Blockchain Version 0.15.1 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Highlites

+ +

This version address an unforeseen issue in the consensus protocol. +We kindly ask all validators to upgrade their nodes to this version.

+ +

Download

+ +

This version has been implemented for Testnet-1 and +is being prepared for the upcoming Mainnet launch. +To start using Pactus Blockchain Testnet-2, download the latest version from the +download page and join the Testnet.

+ + + +

How to Upgrade

+ +

If you are running an older version, shut it down. +Uninstall the previous version and install the newer version. +If you are using the archived version, simply use the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Fix

+ +
    +
  • consensus: strong termination for the binary agreement (#765)
  • +
  • consensus: not increase the voting power on duplicated binary votes (#762)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

+ + + + +
+
+
+
+ + + + diff --git a/ar/2023/10/21/release-0-15-2.html b/ar/2023/10/21/release-0-15-2.html new file mode 100644 index 000000000..69a015ed5 --- /dev/null +++ b/ar/2023/10/21/release-0-15-2.html @@ -0,0 +1,400 @@ + + + + + + + + + + + + + Pactus 0.15.2 released | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Pactus 0.15.2 released

+ +

Overview

+ +

Pactus Blockchain Version 0.15.2 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Highlights

+ +

This version allows nodes to set limits on the number of connections they can establish. +By default, each node can have a minimum of 8 connections and a maximum of 16 connections. +Users can easily change these numbers in the configuration file.

+ +

Download

+ +

This version has been implemented for Testnet-2 and +is being prepared for the upcoming Mainnet launch. +To start using Pactus Blockchain Testnet-2, download the latest version from the +download page and join the Testnet.

+ +

These guides can help you to download, install and configure your node:

+ + + +

How to Upgrade

+ +

If you are running an older version, shut it down. +Uninstall the previous version and install the newer version. +If you are using the archived version, simply use the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • add community bootstrap nodes to testnet config (#764)
  • +
  • network: implementing connection manager (#773)
  • +
  • network: adding bootstrapper mode to the network config (#760)
  • +
+ +

Fix

+ +
    +
  • network: ensure relay is not used when there is no direct connection
  • +
  • network: close connection when unbale to get supported protocols (#781)
  • +
  • network: enabling peer exchange for bootstrappers (#779)
  • +
  • network: set connection limit for the resource manager (#775)
  • +
  • sync: peer status set to known on sucessfull handshaking (#774)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

+ + + + +
+
+
+
+ + + + diff --git a/ar/404.html b/ar/404.html new file mode 100644 index 000000000..067832eae --- /dev/null +++ b/ar/404.html @@ -0,0 +1,194 @@ + + + + + + + + + + + + + Error 404, Page Not Found | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+

404

+ +

Page not found :(

+

The requested page could not be found.

+
+ + + diff --git a/ar/about/faq/index.html b/ar/about/faq/index.html new file mode 100644 index 000000000..54d7a2533 --- /dev/null +++ b/ar/about/faq/index.html @@ -0,0 +1,990 @@ + + + + + + + + + + + + + الأسئلة المتكررة | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
+

الأسئلة المتكررة

+

تهدف هذه الصفحة الشائعة الاستخدام (الأسئلة المتكررة) إلى توفير معلومات مفيدة وإرشادات حول الأسئلة الشائعة والمخاوف المتعلقة بـ بكتوس. +

+
+ +
+ + + + + + + + + + + + + +
+
***
+ +
+ +
+
+
+ + عام +
+
+ + + +

+ ما معنى "بكتوس"؟ +

+
+ كلمة "Pactus" ذات أصل لاتيني + وتعني "الاتفاق معًا" أو "عقد" أو "معاملة". في الإنجليزية، يتم استخراج مصطلح "Pact" من الكلمة اللاتينية "Pactus". + + +
+ + + +

+ هل بكتوس هي نسخة من أي بلوكشين أخرى؟ +

+
+ لا، بكتوس ليست نسخة أو مشتقة من أي بلوكشين آخر. إنها بروتوكول بلوكشين جديد وفريد تم تصميمه من الصفر. آلية التوافق المستخدمة في بكتوس فريدة وتم إنشاؤها خصيصًا لحل مشكلة قابلية توسع محققي الحصة الأدلة بلوكشين. + + +
+ + + +

+ هل بكتوس لديها ICO؟ +

+
+ لا، بكتوس ليس لديها ICO (Initial Coin Offering) ولا توجد حسابات محددة مسبقًا أو محظوظة في بكتوس. يبدأ بلوكشين بكتوس من الصفر وتتم طباعة جميع العملات من خلال آلية التوافق. هذا يضمن توزيع العملات بشكل عادل وعدم وجود تمركز للثروة. + + +
+ + + +

+ Where can I buy Pactus coins? +

+
+ Pactus does not have any pre-sales coins. The only way to obtain Pactus coins at the moment is by installing the Pactus software and actively participating in block validation. By engaging in the network and contributing to block validation, you will be rewarded with Pactus coins. + + +
+ + + +

+ لماذا تم تطوير بكتوس؟ +

+
+ تم تطوير بكتوس بهدف توسيع مقياس بلوكشين دون التأثير على الأمان والتفرد. ولتحقيق ذلك، يستخدم بكتوس آلية توافق فريدة تمكّن من إنشاء بلوك في 10 ثوانٍ فقط. وعلاوة على ذلك، تم تصميم بكتوس لتكون أكثر إمكانية الوصول لجميع المستخدمين، بغض النظر عن خبراتهم التقنية أو مواردهم المالية.

تعكس التزامنا بالتفرد والعدالة في قرارنا + بالبدء في بلوكشين بكتوس من الصفر وضمان طباعة جميع العملات من خلال آلية التوافق، بدلاً من إجراء ICO أو حسابات محظوظة. + + +
+ + + +

+ ما المشكلات التي يحلّها بكتوس ولا يحلّها غيرها من البلوكتشينات؟ +

+
+ Pactus tries to solve several problems faced by other blockchain networks, including:

Scalability: Pactus has a unique consensus mechanism that is specifically designed to address the scalability issue without sacrificing the security and decentralization.

Accessibility: Running a node on Pactus is designed to be more accessible to normal users compared to other blockchains.

Fairness in distribution: Pactus has a fair and transparent coin distribution model, and all coins are generated through the consensus mechanism.

Storage cost: Pactus offers a novel storage solution by allowing users to allocate dedicated storage files, reducing storage costs and simplifying the smart contracts. + + +
+ + + +

+ ما الفرق بين بكتوس وبيتكوين؟ +

+
+ بكتوس وبيتكوين هما نوعان مختلفان من شبكات البلوكتشين. بينما يستخدم بيتكوين + عملية تسمى "إثبات العمل" لتأمين شبكته، يستخدم بكتوس طريقة مختلفة تسمى "إثبات الحصة". هذا يعني أنه بدلاً من التعدين، +يكون المصدقون مسؤولين عن التصويت على الكتل الواردة ويجب أن يمتلكوا مبلغًا معينًا من عملة الشبكة، المعروفة باسم "الحصة"، كوديعة أمان لمنع السلوك الخبيث. + + +
+ + + +

+ ما الفرق بين بكتوس وإيثيريوم؟ +

+
+ Pactus and Ethereum are both Proof of Stake blockchains, but they differ in their approach to running a validator. Running a validator on Ethereum can be challenging and requires 32 Ethereum coins to stake. In contrast, Pactus is designed to be more accessible to normal users. There is no minimum stake requirement, and you can run the Pactus node on personal Computers with basic hardware. This approach reflects our commitment to promoting decentralization and making blockchain technology accessible to a wider audience. + + +
+ +
+ +
+
+
+ + المُصدّق +
+
+ + + +

+ ما هي المُعالِجين؟ +

+
+ يتحمّل المعالجون في بكتوس مسؤولية معالجة المعاملات وإنشاء الكتل وبالتالي، يساعدون في تأمين الشبكة والحفاظ على انحيازها. يستخدمون عملاتهم الخاصة كرهان لضمان أمان الشبكة وتلقي مكافآت عن مساهماتهم. + + +
+ + + +

+ ما هي الحدود الدنيا والعليا للرهان الممكنة؟ +

+
+ In Pactus, there is no minimum limit for staking coins, but the maximum amount you can stake is 1000 coins. If you want to stake more than 1000 coins, you can run a new validator. Running multiple validators keeps the network more decentralized and helps maintain its security and stability. + + +
+ + + +

+ Why is there a limit for maximum stake? +

+
+ The limit for the maximum stake per validator enhances decentralization and prevents validators from gaining too much power, which could potentially lead them to control the committee. The maximum staking limit is part of the consensus parameters and can be changed in the future through consensus among the validators. + +
+ + + +

+ Can I run multiple validators on one computer? +

+
+ The Pactus software allows you to run up to 32 validators on a single node. Running multiple validators may require slightly more memory, but it has no impact on storage, and has a negligible effect on CPU and networking usage. Running multiple validators on a single node enables users to distribute their stake across multiple validators, especially when they want to stake more than the maximum stake per validator. This eliminates the need for additional resources and simplifies node management. + + +
+ + + +

+ كيف يتم مكافأة المعالجين؟ +

+
+ Once a validator proposes a valid block and it is accepted by the network, the validator receives one coin as a block reward. The reward is an incentive given to validators for their contribution to the network. + + +
+ + + +

+ ما هو حجم مكافأة الكتلة في بكتوس؟ +

+
+ تكون مكافأة الكتلة في بكتوس ثابتة، وهي عملة واحدة دائمًا لكل كتلة. تساعد هذه الخطة الثابتة للمكافأة على ضمان البساطة والعدالة وتوزيع العملة بشكل أفضل. + + + ما هو حجم مكافأة الكتلة في بكتوس؟ + +
+ +
+ +
+
+
+ + إجماع +
+
+ + + +

+ كيف تعمل بلوكشين بكتوس؟ +

+
+ يعمل بكتوس بواسطة لجنة من المصادقين المسؤولين عن إنشاء كتل جديدة. تتكون اللجنة من 21 مصادقًا، ومع ذلك، تتغير أعضاء اللجنة بشكل عشوائي مع مرور الوقت. كل 10 ثوانٍ، يجمع مصادق في اللجنة يُعرف باسم "المقترح" جميع المعاملات الصالحة، ويضيفها إلى كتلة، ويشاركها مع المصادقين الآخرين في اللجنة. إذا أكد أكثر من 2/3 من أصحاب المصلحة في اللجنة على الكتلة المقترحة بتوقيعهم عليها، يتم تأكيد الكتلة ويتم تنفيذ جميع المعاملات داخل الكتلة. يتكرر هذه العملية كل 10 ثوانٍ. + + + كيف تعمل بلوكشين بكتوس؟ + +
+ + + +

+ كيف يمكن لمصادق الانضمام إلى اللجنة؟ +

+
+ To enter the committee in Pactus, validators participate in a sortition process that occurs at each block. In this process, validators generate a provable random number between zero and the total staked coins, and if the number is less than their stake, they can send a transaction known as sortition transaction with the proof of sortition. Once the sortition transaction is included in a block, the validator replaces the oldest committee member. + + +
+ + + +

+ كيف يتم اختيار مقترحي البلوك في اللجنة؟ +

+
+ يتم اختيار مقترح البلوك داخل اللجنة بناءً على وقت دخوله إلى اللجنة. وهذا يعني أن عملية الاختيار تتبع ترتيب "الأولوية لأولئك الذين يدخلون أولاً". + + +
+ + + +

+ هل يمكن للمحققين العديدة الدخول إلى اللجنة في وقت واحد؟ +

+
+ The process of sortition in Pactus is random, so it's possible for more than one validator to enter the committee at once, or no validator at all. However, on average, one validator should join the committee at each block. + + +
+ + + +

+ هل من الممكن أن يكون هناك بلوكين صحيحين في نفس الوقت؟ +

+
+ لا يمكن أن يكون هناك بلوكين صحيحين في نفس الوقت في سلسلة بكتوس. يمنع خوارزمية الاتفاق في بكتوس إمكانية وجود اثنين من المقترحين في نفس الوقت. هذا يضمن عدم حدوث فورك في الشبكة. + + +
+ +
+ +
+
+
+ + اقتصاد +
+
+ + + +

+ ما هو إجمالي إمدادات عملة بكتوس؟ +

+
+ بكتوس لديها إجمالي إمدادات 21 مليون عملة، وكل عملة مقسمة إلى 1 مليار وحدة. كل 10 ثوانٍ، يتم إنشاء عملة جديدة، مما يؤدي إلى 8،640 عملة جديدة في اليوم وحوالي 3 ملايين في السنة. سيتم إنشاء جميع العملات في غضون 7 سنوات. + + + ما هو إجمالي إمدادات عملة بكتوس؟ + +
+ + + +

+ ما هو حساب الخزانة؟ +

+
+ حساب الخزانة هو حساب خاص في بلوكشين بكتوس يحتوي على إجمالي إمدادات العملات والذي يبلغ 21 مليون عملة. يتم إنشاؤه في وقت النشأة وليس له زوج مفاتيح مرتبط به، مما يعني عدم إمكانية الوصول إليه أو التحكم فيه من قبل أي شخص. في كل مرة يتم إنشاء بلوك، يتم نقل عملة واحدة من حساب الخزانة إلى حساب المقترح كمكافأة للبلوك. + + +
+ +
+ +
+
+
+ + معاملة +
+
+ + + +

+ ما هي عملية تحويل الأموال؟ +

+
+ عملية تحويل الأموال هي نوع من العمليات التي تسمح للمستخدمين بتحويل عملات بكتوس من حساب واحد إلى آخر. + + +
+ + + +

+ ما هي عملية الرهن؟ +

+
+ A bond transaction is a type of transaction that allows users to become a validator by staking some coins. The amount of stake determines the voting power in the consensus. + + +
+ + + +

+ ما هي عملية الفرز؟ +

+
+ عملية الفرز هي نوع من العمليات التي تسمح للمحققين بالدخول إلى اللجنة. + + +
+ + + +

+ ما هي عملية الغاء الرهن؟ +

+
+ An unbond transaction is a type of transaction that allows users to unbond their validator. Once a validator is unbonded, they can no longer participate in the consensus mechanism. + + +
+ + + +

+ ما هي عملية السحب؟ +

+
+ عملية السحب هي نوع من العمليات التي تسمح للمحققين بسحب عملاتهم التي تم رهنها من الشبكة. + + +
+ +
+ +
+
+
+ + رسوم +
+
+ + + +

+ كيف يتم حساب رسوم المعاملات في بكتوس؟ +

+
+ تتم حساب رسوم المعاملات في بكتوس باستخدام نموذج رسوم يعتمد على النسبة المئوية. هذا يعني أن الرسوم تشكل نسبة مئوية من المبلغ المحول، مع وجود حد أدنى وحد أقصى للرسوم. معلمات النسبة المئوية والحد الأدنى للرسوم والحد الأقصى للرسوم هي جزء من معلمات بلوكشين ويمكن تغييرها باتفاق بين جميع المحققين. + + +
+ + + +

+ ما هو الحد الأدنى والأقصى للرسوم؟ +

+
+ تم تصميم هذه المعلمات لتوفير مزيد من السيطرة على هيكل الرسوم وضمان بقاء الرسوم داخل نطاق معين. إذا كانت الرسوم المحسوبة للمعاملة تقل عن الحد الأدنى للرسوم، يتم استخدام الحد الأدنى للرسوم بدلاً من ذلك. بالمثل، إذا تجاوزت الرسوم المحسوبة الحد الأقصى للرسوم، يتم استخدام الحد الأقصى للرسوم بدلاً من ذلك. يساعد هذا على منع المستخدمين من دفع رسوم زائدة أو غير كافية للمعاملات ويوفر مزيدًا من الثب + + +
+ + + +

+ لماذا تم اختيار نموذج رسوم يعتمد على النسبة المئوية لـ بكتوس؟ +

+
+ تم اختيار نموذج الرسوم المعتمد على النسبة المئوية لـ بكتوس لأنه يوفر هيكلًا للرسوم أكثر إنصافًا وتوقعًا للمستخدمين، حيث تكون الرسوم متناسبة مع المبلغ المحول. كما أنه يسمح بمرونة أكبر في ضبط هيكل الرسوم لمواءمتها بشكل أفضل مع احتياجات البلوكشين ومستخدميه، حيث يمكن تغيير معلمات النسبة المئوية والحد الأدنى للرسوم والحد الأقصى للرسوم من خلال آلية التوافق المتفق عليها بين جميع المحققين. + + +
+ +
+ +
+ + + + +
+ +
+
+
+
+ + + + + diff --git a/ar/about/roadmap/index.html b/ar/about/roadmap/index.html new file mode 100644 index 000000000..bfe0e99bd --- /dev/null +++ b/ar/about/roadmap/index.html @@ -0,0 +1,488 @@ + + + + + + + + + + + + + خارطة الطريق | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+

خارطة الطريق

+ +
+
✅ المهمة المكتملة
+
🚧 المهمة الجارية
+
⏳ المهمة القادمة
+
+ +
+
+
+
+
+
+
Smart Contract Engine
+
Q3 2024
+
+
+
+
+
+
+
Mobile Wallet
+
Q2 2024
+
+
+
+
+
+
+
Main Net Launch
+
Q1 2024
+
+
+
+
+
+
+ +
Oct 2023
+
+
+
+
+
+
+ +
Oct 2023
+
+
+
+
+
+
+ +
Aug 2023
+
+
+
+
+
+
+ +
Jul 2023
+
+
+
+
+
+
+ +
June 2023
+
+
+
+
+
+
+ +
May 2023
+
+
+
+
+
+
+ +
May 2023
+
+
+
+
+
+
+ +
May 2023
+
+
+
+
+
+
+ +
April 2023
+
+
+
+
+
+
+ +
September 2022
+
+
+
+
+
+
+ +
September 2022
+
+
+
+
+
+
+ +
+
+
+
+ + + + + diff --git a/ar/about/what-is-pactus/index.html b/ar/about/what-is-pactus/index.html new file mode 100644 index 000000000..193941e89 --- /dev/null +++ b/ar/about/what-is-pactus/index.html @@ -0,0 +1,377 @@ + + + + + + + + + + + + + ما هو بكتوس؟ | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+

ما هو بكتوس؟

+ +
+ +
+
+

بكتوس هو بلوكشين يركز على التوزيع

+ يعتمد بكتوس على مبدأ أنه يمكن تحقيق نظام عادل وشفاف فقط من خلال التوزيع. على عكس العديد من منصات البلوكشين الأخرى، يهدف بكتوس إلى القضاء على إمكانية المركزية والتلاعب من خلال إزالة الحاجة إلى التفويض والمُعدِّنين. يتيح ذلك لأي شخص أن يصبح جزءًا من النظام البيئي ويضمن أن تظل المنصة موزعة بالفعل. + +
+
+ +
+
+

بكتوس هو بلوكشين سهل الاستخدام

+ يهدف بكتوس إلى إنشاء بلوكشين سهل الاستخدام يمكن استخدامه بسهولة من قبل أي شخص، وليس فقط خبراء التقنية. يتم تصميم بروتوكولنا ليكون بسيطًا وسهل الصيانة والتطوير. يقدم بكتوس تطبيق واجهة المستخدم الرسومية البسيطة التي يسهل للمستخدمين تشغيل عقدة. + +
+
+ +
+
+

يستخدم بكتوس نموذج رسوم مبني على النسبة المئوية

+ تُحسَب رسوم المعاملات استنادًا إلى نموذج النسبة المئوية مع رسوم دنيا وعليا. توفر هذه المعايير تحكمًا أكبر في هيكل الرسوم وتمنع الدفع الزائد أو الدفع الناقص. يضمن النموذج المبني على النسبة المئوية النزاهة والقدرة على التنبؤ، ويمكن تعديله من خلال الإجماع بين جميع المصادقين. + +
+
+ +
+
+

تخزين متفرد ولامركزي في بكتوس

+ في بكتوس، يمكن للمستخدمين شراء ملف تخزين مخصص يمكن تجديده سنويًا، مما يؤدي إلى تخفيض التكاليف المتعلقة بالتخزين وتنفيذ العقود الذكية. يمكن أن تمهد هذه الميزة الفريدة الطريق لبروتوكولات جديدة في المنصات الموزعة. + +
+
+ +
+ +
+
+
+
+ + + + + diff --git a/ar/android-chrome-192x192.png b/ar/android-chrome-192x192.png new file mode 100644 index 000000000..8a8e2b6d8 Binary files /dev/null and b/ar/android-chrome-192x192.png differ diff --git a/ar/android-chrome-256x256.png b/ar/android-chrome-256x256.png new file mode 100644 index 000000000..827219e8a Binary files /dev/null and b/ar/android-chrome-256x256.png differ diff --git a/ar/apple-touch-icon.png b/ar/apple-touch-icon.png new file mode 100644 index 000000000..1fa36ea07 Binary files /dev/null and b/ar/apple-touch-icon.png differ diff --git a/ar/assets/css/custom.css b/ar/assets/css/custom.css new file mode 100644 index 000000000..6ce37f1d7 --- /dev/null +++ b/ar/assets/css/custom.css @@ -0,0 +1 @@ +body{font-family:"Open Sans",sans-serif;font-weight:400;color:#4c4c4c;background-color:#edeef0;max-width:1200px;margin:0 auto}.navbar .nav-top{height:86px}.navbar .fixed-menu{width:220px}.navbar .logo img{width:200px}a{text-decoration:none}a a:hover:not(.btn){color:#021a34 !important}h1,h2{font-weight:500;line-height:1.25;padding-bottom:12px;padding-top:14px}h1{font-weight:600}.motto .title{font-weight:600;font-size:32px;padding-top:18px}.motto .motto{font-weight:500;font-size:21px}.btn-fixed{border-width:2px;border-style:solid;width:220px;height:46px;text-transform:uppercase;font-weight:700;border-radius:0%;vertical-align:middle !important;line-height:46px;padding:0;margin:16px}.btn-fixed.btn-more{color:#021a34;border-color:#021a34}.btn-fixed.btn-more:hover{background-color:#021a34;color:#edeef0 !important}.btn-fixed.btn-faq{border-color:#021a34;background-color:#021a34;color:#edeef0}.btn-fixed.btn-faq:hover{background-color:#021a34;color:#edeef0 !important}.btn-fixed.btn-community{border-color:#e03c3c;background-color:#e03c3c;color:#edeef0 !important}.btn-fixed.btn-community:hover{background-color:#e03c3c;color:#edeef0 !important}.footer .text-muted{color:#edeef0 !important;font-size:12px}.footer .text-muted a{color:#edeef0 !important}.pactus-video video{max-width:100%;width:100%;margin-left:auto;margin-right:auto;display:block}.highlighter-rouge .highlight pre{padding:32px 12px 12px 12px;color:#edeef0;position:relative;overflow:auto;direction:ltr}.highlighter-rouge .highlight pre button{position:absolute;top:6px;right:8px;padding:2px;background-color:gray;color:#404040;border-radius:5px;border:ridge 1px gray}.highlighter-rouge .highlight pre button:hover{cursor:pointer;background-color:#bcbabb}.nav-tabs{border-color:#404040 !important}.nav-tabs a{color:#404040}.nav-tabs .nav-link{border-width:0 !important}.nav-tabs .nav-link:not(.active):hover{background-color:gray !important;color:#edeef0 !important}.nav-tabs .active{color:#edeef0 !important;background-color:#404040 !important}table tbody tr:nth-child(2n+1) td{background-color:#eee}blockquote{background:#eee;border-left:10px solid #ccc;padding:16px;quotes:"“" "”" "‘" "’"}blockquote:before{color:#ccc;content:open-quote;font-size:64px;line-height:.1em;vertical-align:-0.4em}blockquote p{margin-top:16px}blockquote p:first-child{display:inline;padding-bottom:160px;margin-bottom:160px}.footer{background-color:#021a34 !important;color:#edeef0 !important}.footer .section{font-size:1.75rem;font-weight:500;line-height:1.25;padding-bottom:20px}.footer li{padding-bottom:8px !important}.footer.anchor a{color:#fff}.footer.anchor a:link{color:#eff1ef;background-color:rgba(0,0,0,0) !important;text-decoration:none !important}.footer.anchor a:hover{color:#eff1ef !important}.community img{margin:4px}#btn-back-to-top{background-color:#021a34;color:#edeef0;position:fixed;bottom:20px;right:20px;display:none}.edit-bar{padding-top:30px}.edit-bar .edit-btn,.edit-bar .edit-btn>a:hover{color:#4c4c4c;text-decoration:none}.all-posts .post-link{padding-bottom:8px}.blog-post .post-date{padding-bottom:10px;color:gray}.blog-post .content{padding-top:22px;min-height:600px}.partners img{padding-top:24px}.hexdump{font-family:monospace;font-size:12px;padding-bottom:1rem}.hexdump .offset{border-right:2px solid #708090;color:#789}.hexdump .ascii{color:dimgray}.faq h3{margin-top:20px;padding-top:16px;border-top:1px solid #4c4c4c}.faq a{text-decoration:none}.faq .group{padding-top:16px}.faq .group .col{font-weight:600;padding-bottom:10px}.faq .separator{padding-top:12px;padding-bottom:12px}.toc .btn,.toc a{color:#4c4c4c !important}.toc .btn-section{padding:.25rem .5rem;font-weight:600;background-color:rgba(0,0,0,0)}.toc .btn-section:hover,.toc .btn-section:focus{background-color:#d2f4ea}.toc .btn-section::before{width:1.25em;line-height:0;content:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='rgba%280,0,0,.5%29' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 14l6-6-6-6'/%3e%3c/svg%3e");transition:transform .35s ease;transform-origin:.5em 50%}.toc .btn-page a{padding:.1875rem .5rem;margin-top:.125rem;margin-left:1.25rem}.toc .btn-page a:hover,.toc .btn-page a:focus,.toc .btn-page .selected{background-color:#d2f4ea}.timeline{position:relative}.timeline::after{content:"";position:absolute;width:6px;background-color:#939597;top:0;bottom:0;left:50%;margin-left:-3px}.timeline-card{position:relative;background-color:inherit;width:50%}.timeline-card .card-title{padding-bottom:12px;font-size:1.3rem;font-weight:500}.timeline-card::after{line-height:38px;font-size:24px;position:absolute;text-align:center;width:48px;height:48px;right:-24px;top:15px;border-radius:50%;z-index:1}.timeline-card.completed::after{content:"✅";background-color:#eee;border:5px solid #77b255}.timeline-card.ongoing::after{content:"🚧";background-color:#eee;border:5px solid #ffcb4b}.timeline-card.upcoming::after{content:"⏳";background-color:#eee;border:5px solid #478ec2}.timeline-card.left{padding:0px 50px 20px 0px;left:0}.timeline-card.right{padding:0px 0px 20px 50px;left:50%}.timeline-card.left::before{content:"";position:absolute;height:20px;width:20px;background:#fff;box-sizing:border-box;transform:rotate(45deg) translate(-50%);top:34px;z-index:0;right:34px;border:1px solid rgba(0,0,0,.175)}.timeline-card.right::before{content:"";position:absolute;height:20px;width:20px;background:#fff;box-sizing:border-box;transform:rotate(45deg) translate(-50%);top:34px;z-index:0;left:48px;border:1px solid rgba(0,0,0,.175)}.timeline-card.right::after{left:-24px}@media screen and (max-width: 600px){.timeline::after{left:31px}.timeline-card{width:100%;padding-left:80px !important;padding-right:25px !important}.timeline-card::before{left:80px !important}.timeline-card.left::after,.timeline-card.right::after{left:8px !important}.timeline-card.left::before{right:auto}.timeline-card.right{left:0%}}.learn h2{border-top:1px solid gray}/*# sourceMappingURL=custom.css.map */ \ No newline at end of file diff --git a/ar/assets/css/custom.css.map b/ar/assets/css/custom.css.map new file mode 100644 index 000000000..4131e3d24 --- /dev/null +++ b/ar/assets/css/custom.css.map @@ -0,0 +1 @@ +{"version":3,"sourceRoot":"","sources":["../../_sass/_styles.scss","../../_sass/_vars.scss","../../_sass/_hexdump.scss","../../_sass/_faq.scss","../../_sass/_toc.scss","../../_sass/_roadmap.scss","../../_sass/_learn.scss"],"names":[],"mappings":"CAEA,KACE,mCACA,gBACA,MCFW,QDGX,iBCJS,QDKT,iBACA,cAIA,iBACE,YAGF,oBACE,YAGF,kBACE,YAIJ,EACE,qBAEA,oBACE,yBAIJ,MAEE,gBACA,iBACA,oBACA,iBAGF,GACE,gBAIA,cACE,gBACA,eACA,iBAGF,cACE,gBACA,eAKJ,WACE,iBACA,mBACA,YACA,YACA,yBACA,gBACA,iBACA,iCACA,iBACA,UACA,YAEA,oBACE,MCzEY,QD0EZ,aC1EY,QD4EZ,0BACE,iBC7EU,QD8EV,yBAIJ,mBACE,aCnFY,QDoFZ,iBCpFY,QDqFZ,MCnFO,QDqFP,yBACE,iBCxFU,QDyFV,yBAIJ,yBACE,aC1Fc,QD2Fd,iBC3Fc,QD4Fd,yBAEA,+BACE,iBC/FY,QDgGZ,yBAMJ,oBACE,yBACA,eAEA,sBACE,yBAMJ,oBACE,eACA,WACA,iBACA,kBACA,cAIJ,kCACE,4BACA,MC9HS,QD+HT,kBACA,cACA,cAEA,yCACE,kBACA,QACA,UAEA,YACA,sBACA,cACA,kBACA,sBAEA,+CACE,eACA,yBAKN,UACE,gCAEA,YACE,cAGF,oBACE,0BAEA,uCACE,iCACA,yBAIJ,kBACE,yBACA,oCAKF,kCACE,sBAIJ,WACE,gBACA,4BACA,aACA,uBAEA,kBACE,WACA,mBACA,eACA,iBACA,sBAGF,aACE,gBAGF,yBACE,eACA,qBACA,oBAIJ,QACE,oCACA,yBAEA,iBACE,kBACA,gBACA,iBACA,oBAGF,WACE,8BAIA,iBACE,WAGF,sBACE,cACA,0CACA,gCAGF,uBACE,yBAMJ,eACE,WAIJ,iBACE,iBCnPc,QDoPd,MClPS,QDmPT,eACA,YACA,WACA,aAGF,UACE,iBAGA,gDAEE,MC9PS,QD+PT,qBAKF,sBACE,mBAKF,sBACE,oBACA,WAEF,oBACE,iBACA,iBAKF,cACE,iBEzRJ,SACE,sBACA,eACA,oBAGF,iBACE,+BACA,WAEF,gBACE,cCRA,QACE,gBACA,iBACA,6BAGF,OACE,qBAGF,YACE,iBAEA,iBACE,gBACA,oBAIJ,gBACE,iBACA,oBCrBF,iBAEE,yBAGF,kBACE,qBACA,gBACA,+BAGF,gDAEE,yBAGF,0BACE,aACA,cACA,yQACA,+BACA,0BAGF,iBACE,uBACA,mBACA,oBAGF,uEAGE,yBCjCJ,UACE,kBAGA,iBACE,WACA,kBACA,UACA,iBAXS,QAYT,MACA,SACA,SACA,iBAKJ,eACE,kBACA,yBACA,UAEA,2BACE,oBACA,iBACA,gBAGF,sBACE,iBACA,eACA,kBACA,kBACA,WACA,YACA,YACA,SACA,kBACA,UAGF,gCACE,YACA,sBACA,yBAGF,8BACE,aACA,sBACA,yBAGF,+BACE,YACA,sBACA,yBAIF,oBACE,0BACA,OAIF,qBACE,0BACA,SAIF,4BACE,WACA,kBACA,YACA,WACA,gBACA,sBACA,wCACA,SACA,UACA,WACA,kCAIF,6BACE,WACA,kBACA,YACA,WACA,gBACA,sBACA,wCACA,SACA,UACA,UACA,kCAIF,4BACE,WAKJ,qCAEE,iBACE,UAIF,eACE,WACA,6BACA,8BAGA,uBACE,qBAIF,uDAEE,oBAGF,4BACE,WAIF,qBACE,SCzIJ,UACE,WLCS","sourcesContent":["@import \"vars\";\n\nbody {\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n color: $font-color;\n background-color: $bg-color;\n max-width: 1200px;\n margin: 0 auto;\n}\n\n.navbar {\n .nav-top {\n height: 86px;\n }\n\n .fixed-menu {\n width: 220px;\n }\n\n .logo img {\n width: 200px;\n }\n}\n\na {\n text-decoration: none;\n\n a:hover:not(.btn) {\n color: $primary-color !important;\n }\n}\n\nh1,\nh2 {\n font-weight: 500;\n line-height: 1.25;\n padding-bottom: 12px;\n padding-top: 14px;\n}\n\nh1 {\n font-weight: 600;\n}\n\n.motto {\n .title {\n font-weight: 600;\n font-size: 32px;\n padding-top: 18px;\n }\n\n .motto {\n font-weight: 500;\n font-size: 21px;\n }\n\n}\n\n.btn-fixed {\n border-width: 2px;\n border-style: solid;\n width: 220px;\n height: 46px;\n text-transform: uppercase;\n font-weight: 700;\n border-radius: 0%;\n vertical-align: middle !important;\n line-height: 46px;\n padding: 0;\n margin: 16px;\n\n &.btn-more {\n color: $primary-color;\n border-color: $primary-color;\n\n &:hover {\n background-color: $primary-color;\n color: $bg-color !important;\n }\n }\n\n &.btn-faq {\n border-color: $primary-color;\n background-color: $primary-color;\n color: $bg-color;\n\n &:hover {\n background-color: $primary-color;\n color: $bg-color !important;\n }\n }\n\n &.btn-community {\n border-color: $community-color;\n background-color: $community-color;\n color: $bg-color !important;\n\n &:hover {\n background-color: $community-color;\n color: $bg-color !important;\n }\n }\n}\n\n.footer {\n .text-muted {\n color: $bg-color !important;\n font-size: 12px;\n\n a {\n color: $bg-color !important;\n }\n }\n}\n\n.pactus-video {\n video {\n max-width: 100%;\n width: 100%;\n margin-left: auto;\n margin-right: auto;\n display: block;\n }\n}\n\n.highlighter-rouge .highlight pre {\n padding: 32px 12px 12px 12px;\n color: $bg-color;\n position: relative;\n overflow: auto;\n direction: ltr;\n\n button {\n position: absolute;\n top: 6px;\n right: 8px;\n\n padding: 2px;\n background-color: #808080;\n color: #404040;\n border-radius: 5px;\n border: ridge 1px #808080;\n\n &:hover {\n cursor: pointer;\n background-color: #bcbabb;\n }\n }\n}\n\n.nav-tabs {\n border-color: #404040 !important;\n\n a {\n color: #404040;\n }\n\n .nav-link {\n border-width: 0 !important;\n\n &:not(.active):hover {\n background-color: #808080 !important;\n color: $bg-color !important;\n }\n }\n\n .active {\n color: $bg-color !important;\n background-color: #404040 !important;\n }\n}\n\ntable {\n tbody tr:nth-child(2n + 1) td {\n background-color: #eee;\n }\n}\n\nblockquote {\n background: #eee;\n border-left: 10px solid #ccc;\n padding: 16px;\n quotes: \"\\201C\"\"\\201D\"\"\\2018\"\"\\2019\";\n\n &:before {\n color: #ccc;\n content: open-quote;\n font-size: 64px;\n line-height: 0.1em;\n vertical-align: -0.4em;\n }\n\n p {\n margin-top: 16px;\n }\n\n & p:first-child {\n display: inline;\n padding-bottom: 160px;\n margin-bottom: 160px;\n }\n}\n\n.footer {\n background-color: $primary-color !important;\n color: $bg-color !important;\n\n .section {\n font-size: 1.75rem;\n font-weight: 500;\n line-height: 1.25;\n padding-bottom: 20px;\n }\n\n li {\n padding-bottom: 8px !important;\n }\n\n &.anchor {\n a {\n color: #ffffff;\n }\n\n a:link {\n color: rgb(239, 241, 239);\n background-color: transparent !important;\n text-decoration: none !important;\n }\n\n a:hover {\n color: rgb(239, 241, 239) !important;\n }\n }\n}\n\n.community {\n img {\n margin: 4px;\n }\n}\n\n#btn-back-to-top {\n background-color: $primary-color;\n color: $bg-color;\n position: fixed;\n bottom: 20px;\n right: 20px;\n display: none;\n}\n\n.edit-bar {\n padding-top: 30px;\n // border-top: $border-top;\n\n .edit-btn,\n .edit-btn>a:hover {\n color: $font-color;\n text-decoration: none;\n }\n}\n\n.all-posts {\n .post-link {\n padding-bottom: 8px;\n }\n}\n\n.blog-post {\n .post-date {\n padding-bottom: 10px;\n color: #808080;\n }\n .content {\n padding-top: 22px;\n min-height: 600px;\n }\n}\n\n.partners {\n img {\n padding-top: 24px;\n }\n}\n","$primary-color: #021a34;\n$secondary-color: #23547b;\n$bg-color: #edeef0;\n$font-color: #4c4c4c;\n$community-color: #e03c3c;\n$border-top: 1px solid gray;\n",".hexdump {\n font-family: monospace;\n font-size: 12px;\n padding-bottom: 1rem;\n}\n\n.hexdump .offset {\n border-right: 2px solid #708090;\n color: #778899;\n}\n.hexdump .ascii {\n color: #696969;\n}\n","@import \"vars\";\n\n.faq {\n h3 {\n margin-top: 20px;\n padding-top: 16px;\n border-top: 1px solid $font-color;\n }\n\n a {\n text-decoration: none;\n }\n\n .group {\n padding-top: 16px;\n\n .col {\n font-weight: 600;\n padding-bottom: 10px;\n }\n }\n\n .separator {\n padding-top: 12px;\n padding-bottom: 12px;\n }\n}\n","@import \"vars\";\n\n.toc {\n .btn,\n a {\n color: $font-color !important;\n }\n\n .btn-section {\n padding: 0.25rem 0.5rem;\n font-weight: 600;\n background-color: transparent;\n }\n\n .btn-section:hover,\n .btn-section:focus {\n background-color: #d2f4ea;\n }\n\n .btn-section::before {\n width: 1.25em;\n line-height: 0;\n content: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='rgba%280,0,0,.5%29' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 14l6-6-6-6'/%3e%3c/svg%3e\");\n transition: transform 0.35s ease;\n transform-origin: 0.5em 50%;\n }\n\n .btn-page a {\n padding: 0.1875rem 0.5rem;\n margin-top: 0.125rem;\n margin-left: 1.25rem;\n }\n\n .btn-page a:hover,\n .btn-page a:focus,\n .btn-page .selected {\n background-color: #d2f4ea;\n }\n}\n","$line-color: #939597;\n\n/* The actual timeline (the vertical ruler) */\n.timeline {\n position: relative;\n\n /* The actual timeline (the vertical ruler) */\n &::after {\n content: \"\";\n position: absolute;\n width: 6px;\n background-color: $line-color;\n top: 0;\n bottom: 0;\n left: 50%;\n margin-left: -3px;\n }\n}\n\n/* Container around content */\n.timeline-card {\n position: relative;\n background-color: inherit;\n width: 50%;\n\n .card-title {\n padding-bottom: 12px;\n font-size: 1.3rem;\n font-weight: 500;\n }\n /* The circles on the timeline */\n &::after {\n line-height: 38px;\n font-size: 24px;\n position: absolute;\n text-align: center;\n width: 48px;\n height: 48px;\n right: -24px;\n top: 15px;\n border-radius: 50%;\n z-index: 1;\n }\n\n &.completed::after {\n content: \"✅\";\n background-color: #eeeeee;\n border: 5px solid #77b255;\n }\n\n &.ongoing::after {\n content: \"🚧\";\n background-color: #eeeeee;\n border: 5px solid #ffcb4b;\n }\n\n &.upcoming::after {\n content: \"⏳\";\n background-color: #eeeeee;\n border: 5px solid #478ec2;\n }\n\n /* Place the container to the left */\n &.left {\n padding: 0px 50px 20px 0px;\n left: 0;\n }\n\n /* Place the container to the right */\n &.right {\n padding: 0px 0px 20px 50px;\n left: 50%;\n }\n\n /* Add arrows to the left container (pointing right) */\n &.left::before {\n content: \"\";\n position: absolute;\n height: 20px;\n width: 20px;\n background: white;\n box-sizing: border-box;\n transform: rotate(45deg) translate(-50%);\n top: 34px;\n z-index: 0;\n right: 34px;\n border: 1px solid rgba(0, 0, 0, 0.175);\n }\n\n /* Add arrows to the right container (pointing left) */\n &.right::before {\n content: \"\";\n position: absolute;\n height: 20px;\n width: 20px;\n background: white;\n box-sizing: border-box;\n transform: rotate(45deg) translate(-50%);\n top: 34px;\n z-index: 0;\n left: 48px;\n border: 1px solid rgba(0, 0, 0, 0.175);\n }\n\n /* Fix the circle for containers on the right side */\n &.right::after {\n left: -24px;\n }\n}\n\n/* Media queries - Responsive timeline on screens less than 600px wide */\n@media screen and (max-width: 600px) {\n /* Place the timeline to the left */\n .timeline::after {\n left: 31px;\n }\n\n /* Full-width containers */\n .timeline-card {\n width: 100%;\n padding-left: 80px !important;\n padding-right: 25px !important;\n\n /* Make sure that all arrows are pointing leftwards */\n &::before {\n left: 80px !important;\n }\n\n /* Make sure all circles are at the same spot */\n &.left::after,\n &.right::after {\n left: 8px !important;\n }\n\n &.left::before {\n right: auto;\n }\n\n /* Make all right containers behave like the left ones */\n &.right {\n left: 0%;\n }\n }\n}\n","@import \"vars\";\n\n.learn {\n h2 {\n border-top: $border-top;\n }\n}\n"],"file":"custom.css"} \ No newline at end of file diff --git a/ar/blog/index.html b/ar/blog/index.html new file mode 100644 index 000000000..e838d0040 --- /dev/null +++ b/ar/blog/index.html @@ -0,0 +1,488 @@ + + + + + + + + + + + + + مدونة | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

جميع المقالات

+ + + feed + +
+ +
+ + +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + + + +
+ +
+
+
+
+ + + + + diff --git a/ar/browserconfig.xml b/ar/browserconfig.xml new file mode 100644 index 000000000..b3930d0f0 --- /dev/null +++ b/ar/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #da532c + + + diff --git a/ar/community/index.html b/ar/community/index.html new file mode 100644 index 000000000..8061d47ff --- /dev/null +++ b/ar/community/index.html @@ -0,0 +1,376 @@ + + + + + + + + + + + + + المجتمع | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+

انضم إلى مجتمع بكتوس

+ +

من خلال الانضمام إلى مجتمع بكتوس، تصبح جزءًا من شبكة عالمية من المبتكرين والمفكرين والفاعلين الذين يتحدون برؤية مشتركة لبناء مستقبل أفضل مع تقنية البلوكشين. سواء كنت مطورًا أو رائد أعمال أو مستثمرًا أو مجرد عاشق للبلوكشين، هناك مكان لك هنا في بكتوس.
إذًا، لنتحد ونحدث تغييرًا!

+ + + +
+
+
+
+ + + + + diff --git a/ar/contributing/index.html b/ar/contributing/index.html new file mode 100644 index 000000000..836915eb4 --- /dev/null +++ b/ar/contributing/index.html @@ -0,0 +1,401 @@ + + + + + + + + + + + + + المساهمة | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+

المساهمة

+ + +

As an open-source platform, Pactus blockchain empowers from its community. +Whether you’re a developer, designer, or enthusiast, your contributions can make a meaningful impact.

+ +

There are several ways to support the Pactus project:

+ +

Run a Node

+ +

One of the most effective ways to contribute to the Pactus network is by running a node. +A “node” is a software program that downloads a copy of the Pactus blockchain and +ensure the network keeps running safe and decentralized.

+ +

These guides can help you to run and configure your node:

+ + + +

Become a Validator

+ +

Validators play an important role in the Pactus blockchain by verifying transactions and +adding them to the blockchain. +By becoming a validator, you can earn rewards +for contributing to the network’s security and decentralization.

+ +

To become a validator, you will need to stake a certain amount of Pactus coins. +These guides can help you to send a Bond transaction and stake some coins:

+ + + +

Develop

+ +

Pactus is an open-source project that welcomes and encourages contributions from developers. +By contributing to the project, you can help improve the Pactus platform and create new features that +benefit the entire community.

+ +

You can check our Contributing page +for more information on how to get involved and contribute to the project.

+ +

Translation

+ +

Another way to contribute to the Pactus project is by translating this website into other languages and +improving its content.

+ +

Spread the Word

+ +

The more people who know about Pactus, the more opportunities there are for collaboration and growth. +Share our project on social media, attend Pactus events, or simply tell your friends and colleagues about us.

+ +
+ +

Together, Let’s build a better future for blockchain technology.

+ + +
+
+
+
+ + + + + diff --git a/ar/download/index.html b/ar/download/index.html new file mode 100644 index 000000000..8ad0dbc21 --- /dev/null +++ b/ar/download/index.html @@ -0,0 +1,491 @@ + + + + + + + + + + + + + تنزيل | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+

تحميل بكتوس

+ +

على هذه الصفحة يمكنك العثور على كيفية تحميل والحصول على أحدث إصدار من برنامج بكتوس.

+ +
+ +

🏗️ تجميع من شفرة المصدر

+ +

يتم توزيع مشروع بكتوس كبرنامج مفتوح المصدر، لذا فإن الطريقة المفضلة لتثبيته هي استنساخ شفرة المصدر من مستودع جيت هاب وتجميع شفرة المصدر.

+ +

تتوفر تعليمات تجميع بكتوس على صفحة التثبيت.

+ +
+ +

⬇️ تنزيل الإصدارات المستقرة

+ +

يمكنك أيضًا تنزيل أحدث إصدارات بكتوس المستقرة. يتم تحديث هذه الإصدارات تلقائيًا عند إصدار نسخة جديدة في مستودع جيت هاب.

+ +

واجهة المستخدم الرسومية لـ بكتوس (GUI)

+ +

يمكنك تشغيل بكتوس في وضع واجهة المستخدم الرسومية (GUI) وهو مناسب للمبتدئين والمستخدمين المتقدمين.

+ +

واجهة المستخدم الرسومية لـ بكتوس (GUI)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
File nameKindOSArch
pactus-gui_0.15.2_darwin_amd64.tar.gzArchivemacOS64-bit
pactus-gui_0.15.2_darwin_amd64.dmgDMGmacOS64-bit
pactus-gui_0.15.2_linux_amd64.tar.gzArchiveLinux64-bit
pactus-gui_0.15.2_windows_amd64.zipArchiveWindows64-bit
pactus-gui_0.15.2_windows_amd64_installer.exeInstallerWindows64-bit
+ +
+ تطبيق غير موثوق

كن على علم بأن الثنائيات المجمعة مسبقًا لا يتم شحنها مع أي شهادة توقيع الكود. من المحتمل أن تكون الثنائيات المجمعة مسبقًا غير موثوقة على نظام ويندوز و ماك أو إس. + +
+ +

بمجرد تنزيل واجهة بكتوس الرسومية (GUI)، يمكنك اتباع هذا البرنامج التعليمي لإعداد عقدتك وتشغيلها: + كيفية تشغيل بكتوس في الوضع الرسومي؟

+ +
+ +

واجهة سطر الأوامر لـ بكتوس (CLI)

+ +

يمكن للمستخدم المتقدم تشغيل بكتوس في وضع واجهة سطر الأوامر (CLI).

+ +

واجهة سطر الأوامر لـ بكتوس (CLI)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
File nameOSArch
pactus-cli_0.15.2_android_arm64.tar.gzAndroidARM64
pactus-cli_0.15.2_darwin_amd64.tar.gzmacOS64-bit
pactus-cli_0.15.2_darwin_arm64.tar.gzmacOSARM64
pactus-cli_0.15.2_freebsd_amd64.tar.gzFreeBSD64-bit
pactus-cli_0.15.2_freebsd_arm.tar.gzFreeBSDARM
pactus-cli_0.15.2_linux_amd64.tar.gzLinux64-bit
pactus-cli_0.15.2_linux_arm64.tar.gzLinuxARM64
pactus-cli_0.15.2_windows_386.zipWindows32-bit
pactus-cli_0.15.2_windows_amd64.zipWindows64-bit
+ +

بمجرد تنزيل بكتوس CLI، يمكنك اتباع هذا البرنامج التعليمي لإعداد عقدتك وتشغيلها: + كيفية تشغيل بكتوس في وضع سطر الأوامر؟

+ +
+ +

🐳 حاوية دوكر

+ +

يمكن للمستخدم المتقدم الحصول على صورة بكتوس دوكر من Docker Hub.

+ +

يمكنك اتباع هذا البرنامج التعليمي لإعداد عقدتك وتشغيلها باستخدام دوكر: + كيفية تشغيل بكتوس باستخدام دوكر؟

+ +
+
+
+
+ + + + + diff --git a/ar/favicon-128x128.png b/ar/favicon-128x128.png new file mode 100644 index 000000000..56c2f6cb2 Binary files /dev/null and b/ar/favicon-128x128.png differ diff --git a/ar/favicon-16x16.png b/ar/favicon-16x16.png new file mode 100644 index 000000000..4babb6356 Binary files /dev/null and b/ar/favicon-16x16.png differ diff --git a/ar/favicon-32x32.png b/ar/favicon-32x32.png new file mode 100644 index 000000000..e22d5d721 Binary files /dev/null and b/ar/favicon-32x32.png differ diff --git a/ar/favicon-64x64.png b/ar/favicon-64x64.png new file mode 100644 index 000000000..e8d111c2e Binary files /dev/null and b/ar/favicon-64x64.png differ diff --git a/ar/favicon.ico b/ar/favicon.ico new file mode 100644 index 000000000..64080c0ee Binary files /dev/null and b/ar/favicon.ico differ diff --git a/ar/feed.xml b/ar/feed.xml new file mode 100644 index 000000000..6779b2133 --- /dev/null +++ b/ar/feed.xml @@ -0,0 +1,1106 @@ +Jekyll2023-10-26T18:16:51+00:00https://pactus.org/feed.xmlPactus blockchainPactus 0.15.1 released2023-10-21T00:00:00+00:002023-10-21T00:00:00+00:00https://pactus.org/2023/10/21/release-0-15-1Overview + +

Pactus Blockchain Version 0.15.1 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Highlites

+ +

This version address an unforeseen issue in the consensus protocol. +We kindly ask all validators to upgrade their nodes to this version.

+ +

Download

+ +

This version has been implemented for Testnet-1 and +is being prepared for the upcoming Mainnet launch. +To start using Pactus Blockchain Testnet-2, download the latest version from the +download page and join the Testnet.

+ + + +

How to Upgrade

+ +

If you are running an older version, shut it down. +Uninstall the previous version and install the newer version. +If you are using the archived version, simply use the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Fix

+ +
    +
  • consensus: strong termination for the binary agreement (#765)
  • +
  • consensus: not increase the voting power on duplicated binary votes (#762)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

]]>
Pactus 0.15.2 released2023-10-21T00:00:00+00:002023-10-21T00:00:00+00:00https://pactus.org/2023/10/21/release-0-15-2Overview + +

Pactus Blockchain Version 0.15.2 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Highlights

+ +

This version allows nodes to set limits on the number of connections they can establish. +By default, each node can have a minimum of 8 connections and a maximum of 16 connections. +Users can easily change these numbers in the configuration file.

+ +

Download

+ +

This version has been implemented for Testnet-2 and +is being prepared for the upcoming Mainnet launch. +To start using Pactus Blockchain Testnet-2, download the latest version from the +download page and join the Testnet.

+ +

These guides can help you to download, install and configure your node:

+ + + +

How to Upgrade

+ +

If you are running an older version, shut it down. +Uninstall the previous version and install the newer version. +If you are using the archived version, simply use the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • add community bootstrap nodes to testnet config (#764)
  • +
  • network: implementing connection manager (#773)
  • +
  • network: adding bootstrapper mode to the network config (#760)
  • +
+ +

Fix

+ +
    +
  • network: ensure relay is not used when there is no direct connection
  • +
  • network: close connection when unbale to get supported protocols (#781)
  • +
  • network: enabling peer exchange for bootstrappers (#779)
  • +
  • network: set connection limit for the resource manager (#775)
  • +
  • sync: peer status set to known on sucessfull handshaking (#774)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

]]>
Pactus 0.15.0 released2023-10-15T00:00:00+00:002023-10-15T00:00:00+00:00https://pactus.org/2023/10/15/release-0-15-0Overview + +

Pactus Blockchain Version 0.15.0 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Splash screen

+ +

Download

+ +

This version is the bootstrap version for +Testnet-2. +To start using Pactus Blockchain Testnet-1, download the latest version from the +download page and join the Testnet.

+ +

These guides can help you to run and configure your node:

+ + + +
+ If you participated in Testnet-1, ensure to delete your previous working directory and + create a new wallet. +

+ By default, the working directory is located at "C:\Users\<name>\pactus" on Windows, + or "~/pactus" on Unix-compatible platforms. +
+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • gui: adding the splash screen (#743)
  • +
  • add absentees votes to the certificate (#746)
  • +
  • logger: short stringer for loggers (#732)
  • +
  • implementing pip-7 (#731)
  • +
  • implementing pip-11 (#712)
  • +
  • implementing pip-8 (#711)
  • +
  • implementing pip-9 (#706)
  • +
  • new API to get Public key by address (#704)
  • +
  • Adding address field for AccountInfo (#703)
  • +
  • CreateValidatorEvent and CreateAccountEvent for nanomsg (#702)
  • +
  • implementing PIP-2 and PIP-3 (#699)
  • +
  • Adding Hole Punching to network (#697)
  • +
  • write logs into file (#673)
  • +
  • check protocol support before sending connect/disconnect event (#683)
  • +
  • updating genesis for pre-testnet-2 (#679)
  • +
  • adding udp protocol for network (#672)
  • +
  • implementing pip-4 (#671)
  • +
  • Notifee service events (#628)
  • +
  • adding MinimumStake parameter (#574)
  • +
  • adding Sent and Received bytes per message metrics for peers (#618)
  • +
  • add reason to BlockResponse messages (#607)
  • +
  • Add CalcualteFee in GRPC (#601)
  • +
  • add sent bytes and received bytes metrics to peerset plus update grpc (#606)
  • +
  • added metrics of libp2p with supporting prometheus (#588)
  • +
  • Check node address is valid (#565)
  • +
  • add LastSent and LastReceived properties to peer (#569)
  • +
+ +

Fix

+ +
    +
  • data race issue on updating certificate (#747)
  • +
  • network: async connection (#744)
  • +
  • adding query vote timer for CP phase (#738)
  • +
  • trim transactions in proposed block (#737)
  • +
  • fixing query votes and proposal issue (#736)
  • +
  • fixing issue when a block has max transactions (#735)
  • +
  • consensus: anti-entroy mechanism for the consensus (#734)
  • +
  • logger: invalid level parsing error (#733)
  • +
  • cache certificate by height (#730)
  • +
  • fixing a crash on consensus (#729)
  • +
  • consensus: prevent double entry in new height (#728)
  • +
  • resolve consensus halt caused by time discrepancy in network. (#727)
  • +
  • unsorted addresses in wallet listing (#721)
  • +
  • send query votes message, if there is no proposal yet (#723)
  • +
  • fixing logger level issue (#722)
  • +
  • fixing syncing stuck issue (#720)
  • +
  • fixing some minor issues on pre-testnet (#719)
  • +
  • supporting go version 1.21 and higher (#692)
  • +
  • ensure log rotation using tests (#693)
  • +
  • restoring at the first block (#691)
  • +
  • swagger doesn’t work with multiple proto files (#687)
  • +
  • fixing wallet-cli issues (#686)
  • +
  • prevent stripping public key for subsidy transactions (#678)
  • +
  • updating the consensus protocol (#668)
  • +
  • aggregating signature for hello message (#640)
  • +
  • error case for logger (#634)
  • +
  • adding committers to the certificate (#623)
  • +
  • updating sortition executor (#608)
  • +
  • update buf and fixing proto generation issue (#600)
  • +
  • adding block hash to peer (#584)
  • +
  • copy to clipboard option for address and pubkey (#583)
  • +
  • public key aggregate (#576)
  • +
  • remove GetValidators rpc method (#573)
  • +
  • missing swagger ui for grpc get account by number (#564)
  • +
  • incorrect handler for validator by number (#563)
  • +
+ +

Refactor

+ +
    +
  • sync: refactoring syncing process (#676)
  • +
  • remove payload prefix from payload transaction type (#669)
  • +
  • change Hello message from broadcasting to direct messaging (#665)
  • +
  • committee: using generic list for validators (#667)
  • +
  • rename SanityCheck to BasicCheck (#643)
  • +
  • cli: Migrating from mow.cli to cobra for wallet (#629)
  • +
  • cli: replacing mow.cli with cobra for daemon (#621)
  • +
  • logger: using fast JSON logger (zerolog) (#613)
  • +
  • Using Generics for calculating Min and Max for numeric type #604 (#609)
  • +
  • Updating LRU cache to version 2 #514 (#602)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

]]>
Testnet-2 launch announcement2023-10-15T00:00:00+00:002023-10-15T00:00:00+00:00https://pactus.org/2023/10/15/testnet-2-launchedOverview + +

Exciting news for the Pactus Community: Testnet-2 is has launched! +The journey through Testnet-1 +brought success and invaluable experiences, with over 500 validators joining the network. +Despite its noteworthy achievements, it also faced challenges that led to a tough decision: to pause the Testnet and +thoroughly address these issues. +After two months of dedicated work and testing, many problems have been resolved, and +we feel confident launching the Testnet again. +Testnet-2 comes with substantial improvements compared to its predecessor by enhancing the core of the Pactus Blockchain. +Notably, the new consensus mechanism and improved overall network performance.

+ +

At this point, we want to assure the Pactus community that this version of +the Testnet will not stop until the mainnet launches, +and our main focus is on improving its overall performance and launching the Mainnet.

+ +

If you’re new to the concept of Testnet, check out our informative post: +What is the Testnet?

+ +

Key Focus Areas

+ +

Testnet-2 has important tasks ahead. +Firstly, we aim to confirm that the new consensus mechanism is both safe and efficient. +A close eye will be kept on the network’s performance, ensuring it operates as expected. +For Testnet-2, the committee +size has been expanded to 51 members. +Both the committee’s performance and block production will be closely monitored. +The goal is a blockchain that remains stable and trustworthy, +even with thousands of validators in the network, +ensuring it manages its regular duties seamlessly.

+ +

How To Join

+ +

Want to join the Testnet-2? Great! It’s super easy. +Just download the latest Pactus software and you’re good to go. +no fancy setups or special gear needed. +You can run the software straight from your personal computer or laptop. +Need some test coins? Pop over to our Discord channel and share your validator address there.

+ +

Benefits for Participation

+ +

By taking part in the Testnet, users can familiarize themselves with the Pactus blockchain and +be well-prepared for the Mainnet launch. +Testnet participants will also receive higher priority during the Mainnet launch and +get free coins for initial staking on the Mainnet.

+ +

Your Feedback Matters

+ +

User feedback plays a vital role in the improvement of the Pactus blockchain. +Share your thoughts and experiences to contribute to the enhancement of future software versions.

]]>
How SSPoS (Solid State Proof of Stake) works in simple word2023-09-28T00:00:00+00:002023-09-28T00:00:00+00:00https://pactus.org/2023/09/28/how-sspos-works-in-simple-wordAbstract + +

In all Blockchain protocols, there is a concept called a consensus mechanism. +This mechanism is used to enable nodes to reach an agreement +on the state of the Blockchain they are +maintaining, in order to have a synchronized and integrated Blockchain.

+ +

For now, we have a lot of consensus mechanisms in the Blockchain world. +Pactus Blockchain uses the SSPoS (Solid State Proof of State) which is a new consensus model.

+ +

To explain how it works let’s start with explaining one of the first and simplest +consensus mechanisms (or if you already know them, just jump into the last part named SSPoS).

+ +

Solid State Proof of Stake

+ +

PoW (Proof of Work)

+ +

In the proof of work model, each node in the network should solve a complex mathematical +problem that requires lots of computing resources to make a new block.

+ +

In this way, it’s highly unlikely that anyone would be able to change +past transactions and change Blockchain states such as balances, +without expending equivalent computational power.

+ +

By doing this we ensure the security and integrity of the Blockchain.

+ +

The concept was adapted from digital tokens by Hal Finney in 2004 +through the idea of “reusable proof of work” using the 160-bit secure hash algorithm 1 (SHA-1).

+ +

Bitcoin uses this consensus model.

+ +

PoS (Proof of Stake)

+ +

On the other hand, PoS or Proof of Stake is another consensus mechanism that instead of miners has validators!

+ +

Validators lock a number of their assets in the Blockchain and they can transfer or use it +till it is locked which we call staking. +after each Block is committed one of the validators will be chosen randomly (more amount of stake, +more chance to be chosen) when a validator is chosen +it proposes a block and announces it to other nodes to be validated, +when a supermajority of validators accept the block it’s going to be committed.

+ +

In this system, validators have no incentive to behave maliciously or dishonestly. +If they do, they risk losing the stake amount.

+ +

More amount of validators in a PoS Blockchain makes it more secure, +decentralized, and trustable, but it also makes the validation and consensus process slower and more difficult.

+ +

Ethereum uses this model.

+ +

DPoS (Delegated Proof of Stake)

+ +

DPoS or Delegated Proof of Stake, is a variant of the PoS consensus algorithm. +users entrust their stakes to a small group of “delegates”. +These delegates are responsible for validating transactions +and creating blocks. The number of delegates is limited +to ensure accountability and efficiency in the validation process.

+ +

Some Blockchains like Cardano and Tron use DPoS.

+ +

DPoS tries to solve the issue of PoS which when validators +increase we have an inefficient validation process. but the main issue with DPoS itself is putting a lot +of trust in the hands of a small number of delegates, +which goes against the principle of “don’t trust, verify”.

+ +

SSPoS (Solid State Proof of Stake)

+ +

BUT, HOW ABOUT SSPoS? HOW ABOUT PACTUS?

+ +

In Pactus Blockchain, we have something called Solid State Proof of Stake +and we try to fix the previous model’s issue, let me explain.

+ +

Pactus uses a dynamic committee of validators with a fixed size of 21, +but the members of the committee randomly change in each round, +based on stake amount the chance of being chosen is higher. on the other hand, +the number of validators out on the committee is unlimited, allowing anyone +to become a validator by staking coins.

+ +

At each block, validators participate in a sortition algorithm by generating a random number +between zero and the total staked coins. If the number is less +than the validator’s stake, they can enter the committee and replace the oldest committee member.

+ +

So, in SSPoS models which are a variant of PoS, we can reach a consensus, +without using high computation resources, having an inefficient +validation process by increasing validator numbers, +and also without breaking the principle of “don’t trust, verify”.

]]>
Dev Report pre-testnet22023-09-24T00:00:00+00:002023-09-24T00:00:00+00:00https://pactus.org/2023/09/24/dev-report-pre-testnet-2Abstract + +

there is several activities in Pactus github in September month, here is a clear report and explain of activities.

+ +

Github Pactus

+ +

Implementing PIP 2, 3 and 4

+ +

After starting Pactus Labs and PIPs, +we start implementing each accepted PIP one by one to improve Pactus, here is a list of implemented PIPs:

+ + + +

Network

+ +

There is some very good change and new features for Pactus network module, +this list contain a list of important changes in Pactus networking:

+ + + +

gRPC and nanomessage services

+ +

We also updated, improved and enhanced gRPC and nanomessage services for better developer experience, +for third-party and side project developers, here is some changes:

+ + + +

Refactoring and other new feature or debugs

+ +

We had some not implemented feature request, not fixed bugs and some issue with new golang version, +list of this changes:

+ +]]>
Introduction to PIPs2023-09-04T00:00:00+00:002023-09-04T00:00:00+00:00https://pactus.org/2023/09/04/introduction-to-pipsIntroduction to PIPs + +

In our commitment to transparency and innovation, we’re excited to introduce a major step in Pactus’s journey: +the Pactus Improvement Proposals, or PIPs.

+ +

PIPs image

+ +

What are PIPs?

+ +

Pactus Improvement Proposals (PIPs) define standards for the ongoing development and enhancement of the Pactus platform. +Each PIP has a unique number like PIP-2, +PIP-3, and so on. +These proposals provide technical details for suggested modifications or enactments, serving as a guide for development.

+ +

The PIP process

+ +

The PIP process is open, allowing any member of the Pactus community to propose a PIP. +The author should provide a summary, motivation, and a detailed technical explanation. +The Pactus Laboratory team will carefully review each PIP. +Security considerations must be addressed before finalizing a PIP. +Once finalized, it can be added to the code. +This process helps avoid unexpected issues during development and maintain consistency and safety.

+ +

The Origins of PIPs

+ +

The Pactus Improvement Proposals (PIPs) was inspired by the +Ethereum Improvement Proposals (EIPs) system, +which had its roots in the Bitcoin Improvement Proposals (BIPs) and +Python Enhancement Proposals (PEPs).

+ +

New Feature Policy

+ +

From now on, all major changes or new features in the Pactus project require a PIP. +Any implementation must reference its specific PIP. +Without approval from Pactus Laboratory team, changes won’t be approved and added to the codebase.

+ +

PIPs Repository

+ +

For a complete list of Pactus Improvement Proposals, visit this link. +The corresponding GitHub repository is accessible here.

+ +

PIPs repository on Github

]]>
Dev report2023-08-22T00:00:00+00:002023-08-22T00:00:00+00:00https://pactus.org/2023/08/22/dev-reportAbstract + +

there is several activities in pactus github this month, here is a clear report and explain of activities.

+ +

Github Pactus

+ +

Linters

+ +

one of new changes in pactus project is new linters we added this month. +what is linters? +linters are just a set of rules for the style of source codes, they force developers to write new codes +in correct, clean and safe way.

+ +

why we use them? +the reason we are using linters in Pactus and add new ones, is to make the code more safe, +and also make it easy to work on for new contributors because we are focus on being decentralized even in development.

+ +

Linters we added till now

+ +

TLA+ spec

+ +

one another new change in Pactus is updating TLA+ spec, which is related to consensus, +as you know we had some problem with consensus in Testnet-1, we fixed the issues and now we are trying to make it more clean.

+ +

link to changes

+ +

if you wish you can learn more about Pactus consensus here.

+ +

Refactoring

+ +

some of previous Pactus dependencies was so old, so we start refactoring them and use new libraries. +also we used some libraries with higher performance which is make Pactus full node more faster in mainnet.

+ +

one of refactors

]]>
Story of Testnet-12023-08-01T00:00:00+00:002023-08-01T00:00:00+00:00https://pactus.org/2023/08/01/testnet-1-concludedAbout Testnet + +

Testnet is a testing environment where developers and users can try out the functionality of a blockchain project, +without putting real assets or data at risk. +It helps to ensure that the final product is reliable and secure for users to use. +If you like to read more about the Testnet you can check out our post on +“What is Testnet?”.

+ +

Summary

+ +

In May 2023, we launched our second Testnet. +The main purpose of this Testnet was to measure block time creation and the responsiveness of the blockchain. +The development team also focused on evaluating the network’s performance. +Additionally, the overall performance of the software and the syncing process were closely examined and assessed.

+ +

The committee for Testnet-1 was set to 21 validators, +and 584 validators joined during the Testnet period. +More than 600,000 blocks were created, and more than 1 million transactions were processed during this time. +The size of the blockchain is about 300 megabytes.

+ +

About 300,000 coins were staked during this period, it was almost 50% of the total generated coins. +It shows that users, even in Testnet, tend to stake their coins.

+ +

Staking chart

+ +

We were able to extract the confirmation time of transactions. +More than 97% of transactions were confirmed in just one block after submission. +This indicates that the transaction pool and broadcasting models are working fine.

+ +

Transaction confirmation chart

+ +

Based on logs from one of the validators, the time for creating a block is about 3 seconds in normal cases. +More than 97% of blocks are committed in the first rounds.

+ +

Consensus round chart

+ +

During Testnet-1, we released three versions(Version +0.11.0, +0.12.0, +0.13.0), and the upgrade process was smooth. +At this time, the development team decided to stop Testnet-1 and work on improvements that are not backward compatible, +including:

+ +
    +
  • Improving the consensus protocol
  • +
  • Reducing the blockchain size
  • +
  • Optimizing the network usage
  • +
+ +

After stabilizing the changes, we will announce the next Testnet, and hopefully, this will be the pre-launch Testnet.

+ +

Spacial thanks to the community

+ +

This Testnet was important for us. +It helped us learn what we need to do to make Pactus work even better. +Without the community that supports us and dedicates their time and resources to testing and feedback, +we wouldn’t have been able to progress as we have.

+ +

we thank all of them for their valuable contributions. +As promised, participants in Testnets will be given priority as validators for the MainNet, and +will receive bounty tokens from the bootstrap accounts to set up their validator.

+ +

We are grateful to all those who participated in Testnet-1, and +we encourage them to join our next Testnet to help us improve Pactus. +As a community-based project, we rely on the support of our community members, and we value any help we receive.

]]>
Dev meeting2023-07-09T00:00:00+00:002023-07-09T00:00:00+00:00https://pactus.org/2023/07/09/dev-meetingMeeting Summary + +

The meeting took place on 09 July 2023, at 2:00 PM UTC via Google Meet, +with team members from different time zones joining to discuss key aspects of the Pactus project.

+ +

Overview to the Network Module

+ +

The meeting began with an overview of the Network module in Pactus. +This module uses Libp2p as its underlying network protocol.

+ +

The Network module is agnostic about the content of the message and +handles two types of messages: Gossip messages, which are broadcasted, +and Stream messages, which are sent directly to a specific peer. +The team discussed the relay nodes that enable communication for nodes behind NAT. +Upon receiving a message, the module publishes an event. +The two types of events are Gossip events and Steam events.

+ +

Network messages

+ +

The team discussed the issue of Relay connections resetting, and explored solutions such as +hole punching or using UDP and IPv6.

+ +

Some users in the Testnet reported high network usage. +The team discussed implementing metrics for LibP2P to monitor network usage effectively. +The discussion related to this issue can be found here. +Additionally, the team discussed the customization of network resources, +including setting limits for inbound and outbound connections.

+ +

Overview to the Sync Module

+ +

Moving on, the Sync module was discussed. +Unlike the Network module, the Sync module has full knowledge about the messages and packets. +The module handles a range of message types, which can be found +here.

+ +

It was suggested that we need to define metrics for each message type. +There was also a discussion about the need for reducing the messages to optimize the use of network resources.

+ +

The team decided to continue discussing these topics in future meetings. +They also plan to work on improving the Network and Sync modules based on these discussions.

]]>
500 validators joined Testnet2023-07-05T00:00:00+00:002023-07-05T00:00:00+00:00https://pactus.org/2023/07/05/testnet-500-validatorsFor a Proof of Stake blockchain, validators are important for +maintaining the network’s integrity and security. They are similar to miners in Proof of Work blockchains like Bitcoin.

+ +

Pactus as a real Proof of Stake blockchain, has achieved a significant milestone. +More than 500 validators joined the Testnet +in less than 2 months. +This accomplishment proves that Pactus is reliable, resilient, and trustworthy. More importantly, it sets new standards +in the blockchain world. In fact, the Pactus Testnet is even more decentralized than some well-known blockchains.

+ +

500 validators of Testnet

+ +

One key reason why Pactus can accommodate more validators is its powerful +consensus mechanism. +The consensus mechanism in Pactus eliminates the need for delegation, making it possible for anyone to become a validator. +Additionally, the user-friendly application ensures that even those new to blockchain can easily contribute to the network.

+ +

What is the next

+ +

To remain competitive in the market, Pactus recognizes the importance of prioritizing user space. +We aim to ensure that running Pactus is affordable and accessible to anyone, regardless of their technical expertise or +available resources.

+ +

To achieve this, the Pactus team constantly monitors network, storage, and computational usage, striving to keep them +at minimal levels. +By doing so, we enable more individuals to participate in the Pactus blockchain.

+ +

Currently, the Pactus team is working on optimizing and reducing network usage. This effort will lead to reduced costs, +especially for users who are using home internet connections.

+ +

Furthermore, we are planning to introduce a pruning mode, allowing users to run the Pactus blockchain with significantly +less storage. +Although we believe the storage size is already small, our goal is to enable users to +retain only the most recent blockchain history. +This approach ensures that the blockchain size remains as compact as possible by disregarding some history of the blockchain.

]]>
Pactus 0.13.0 released2023-07-01T00:00:00+00:002023-07-01T00:00:00+00:00https://pactus.org/2023/07/01/release-0-13-0Overview + +

Pactus Blockchain Version 0.13.0 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Highlights

+ +

Users can now restore the default_wallet during the node initialization. +If users have a backup of the seed phrase (mnemonic) for the default_wallet, +they can now restore it and re-initialize the node.

+ +

Restore mode

+ +

Download

+ +

This version has been implemented for Testnet-1 and +is being prepared for the upcoming Mainnet launch. +To start using Pactus Blockchain Testnet-1, download the latest version from the +download page and join the Testnet.

+ +

These guides can help you to run and configure your node:

+ + + +

How to Upgrade

+ +

If you are running an older version, shut it down. +Uninstall the previous version and install the newer version. +If you are using the archived version, simply use the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Fix

+ +
    +
  • implemented restore wallet base on input seed (#553)
  • +
  • measuring total sent and received bytes (#552)
  • +
  • add validate seed and restore wallet (#533)
  • +
  • HTTP: Missing handlers (#549)
  • +
  • gui: update about dialog and menu items in help (#532)
  • +
+ +

Refactor

+ +
    +
  • implementing TestSuite (#535)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

]]>
Pactus 0.12.0 released2023-06-19T00:00:00+00:002023-06-19T00:00:00+00:00https://pactus.org/2023/06/19/release-0-12-0Overview + +

Pactus Blockchain Version 0.12.0 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Highlights

+ +

This version is focused on improving the sync time to make it faster. +This is achieved by implementing a caching mechanism that executes transactions more quickly and +improves the calculation of total power (stake) of the blockchain in a more effective way.

+ +

Syncing progress

+ +

Download

+ +

This version has been implemented for Testnet-1 and +is being prepared for the upcoming Mainnet launch. +To start using Pactus Blockchain Testnet-1, download the latest version from the +download page and join the Testnet.

+ +

These guides can help you to run and configure your node:

+ + + +

How to Upgrade

+ +

If you are running an older version, shut it down. +Uninstall the previous version and install the newer version. +If you are using the archived version, simply use the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • add GetAccountByNumber API to get account by number (#511)
  • +
+ +

Fix

+ +
    +
  • caching account and validator in store (#513)
  • +
  • get recent blocks by stamp (#509)
  • +
  • closing the mDNS connection upon stopping the network (#508)
  • +
  • updating linkedmap to use generic (#507)
  • +
  • removing state from cache (#506)
  • +
  • Typo in GUI (#499)
  • +
  • supporting localnet (#492)
  • +
+ +

Refactor

+ +
    +
  • update total power calculation based on power change(deltas) (#518)
  • +
  • GetValidators return all validators in state validators map (#512)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

]]>
Pactus 0.11.0 released2023-05-29T00:00:00+00:002023-05-29T00:00:00+00:00https://pactus.org/2023/05/29/release-0-11-0Overview + +

Pactus Blockchain Version 0.11.0 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Highlights

+ +

The main update in this version is the fix for the relay +connection issue. +A relay is a peer in the network that facilitates the connection between two peers, +particularly when they are using home internet.

+ +

Another significant update is that sending a Bond transaction +is now more user-friendly. +Users no longer need to set the validator public key if they want to bond Test PAC coins to their validators.

+ +

Bond transaction dialog

+ +

Download

+ +

This version has been implemented for Testnet-1 and +is being prepared for the upcoming Mainnet launch. +To start using Pactus Blockchain Testnet-1, download the latest version from the +download page and join the Testnet.

+ +

These guides can help you to run and configure your node:

+ + + +

How to Upgrade

+ +

If you are running an older version, shut it down. +Uninstall the previous version and install the newer version. +If you are using the archived version, simply use the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Fix

+ +
    +
  • gui: showing the total number of validators (#474)
  • +
  • network: fixing relay connection issue (#475)
  • +
  • consensus: rejecting vote with round numbers exceeding the limit (#466)
  • +
  • increase failed counter when stream got error (#489)
  • +
  • boosting syncing process (#482)
  • +
  • waiting for proposal in pre-commit phase (#486)
  • +
  • retrieving public key from wallet for bond transactions (#485)
  • +
  • restoring config file to the default (#484)
  • +
  • defining ChainType in genesis to detect the type of network (#483)
  • +
  • reducing the default Argon2d to consume less memory (#480)
  • +
  • adding password option to the start commands (#473)
  • +
+ +

Refactor

+ +
    +
  • rename send to transfer. (#469)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

]]>
Testnet-1 launch announcement2023-05-09T00:00:00+00:002023-05-09T00:00:00+00:00https://pactus.org/2023/05/09/testnet-1-launchedOverview + +

The Pactus blockchain Testnet-1 is now available for participation. +This version simulates the Mainnet environment and evaluate the system’s performance, stability, +and security in a controlled environment. +The primary goal of this version of Testnet is to determine the efficient and secure committee size for the Mainnet.

+ +

Key Aspects

+ +
    +
  • Simulating the Mainnet environment
  • +
  • Determining the actual block creation time
  • +
  • Assessing the staking mechanism and consensus protocol
  • +
  • Evaluating network usage under different loads
  • +
  • Evaluating the syncing process for new nodes joining the network
  • +
  • Ensuring network stability with over 1000 validators
  • +
  • Evaluating transaction performance
  • +
  • Conducting stress tests
  • +
  • Performing security tests, including double spend attacks, Sybil attacks +(nodes with different identities), and forking resistance
  • +
+ +

Joining Testnet-1

+ +

To join the Testnet, download Pactus software +version 0.10.0 and +connect to Testnet without any special configuration or hardware. +You can run the software on your personal computer or laptop. +To acquire test coins, visit the Discord channel and +provide your validator address.

+ +

Benefits for Participation

+ +

By taking part in the Testnet, users can familiarize themselves with the Pactus blockchain and +be well-prepared for the Mainnet launch. +Testnet participants will also receive higher priority during the Mainnet launch and +get free coins for initial staking on the Mainnet.

+ +

Your Feedback Matters

+ +

User feedback plays a vital role in the improvement of the Pactus blockchain. +Share your thoughts and experiences to contribute to the enhancement of future software versions.

]]>
Pactus 0.10.0 released2023-05-08T00:00:00+00:002023-05-08T00:00:00+00:00https://pactus.org/2023/05/08/release-0-10-0Overview + +

Pactus Blockchain Version 0.10.0 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Highlight

+ +

The main update in this version allows users to set up multiple validators in one node. +Users can set up to 32 validators in a single node, and each validator can stake up to 1,000 coins.

+ +

Multi validators

+ +

Download

+ +

This version has been implemented for Testnet-1 and +is being prepared for the upcoming Mainnet launch. +To start using Pactus Blockchain Testnet-1, download the latest version from the +download page and join the Testnet.

+ +

These guides can help you to run and configure your node:

+ + + +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • removing address from account (#454)
  • +
  • supporting multiple consensus instances (#450)
  • +
  • adding sortition interval to the parameters (#442)
  • +
+ +

Fix

+ +
    +
  • gui: check if the node has an active consensus instance (#458)
  • +
  • Use of a Persistent Merkle tree to enhance performance of calculating the +state hash; fully tested in Testnet-0 (#432)
  • +
  • GetBlockchainInfo API in gRPC now returns the total number of validators and accounts (#439)
  • +
  • wallet path as argument (#455)
  • +
  • adding reward addresses to config (#453)
  • +
  • removing committers from the certificate hash (#444)
  • +
  • prevent data race conditions in committee (#452)
  • +
  • using 2^256 for the vrf denominator (#445)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

]]>
Story of Testnet-02023-04-21T00:00:00+00:002023-04-21T00:00:00+00:00https://pactus.org/2023/04/21/testnet-0-concludedWhat is Testnet? + +

Testnet is a testing environment where developers and users can try out the functionality of a blockchain project, +without putting real assets or data at risk. +It helps to ensure that the final product is reliable and secure for users to use. +If you like to read more about the Testnet you can check out our post on +“What is Testnet?”.

+ +

Summary of Testnet-0

+ +

In September 2022, we launched our first Testnet. +The purpose of this Testnet was to +check the consensus protocol, +test different transaction types, +and ensure the stability of the blockchain. +We also wanted to test the sortition algorithm +to make sure it works properly.

+ +

The committee +for the Testnet-0 was set to five validators, and more than 19 validators joined during the Testnet period. +Over 2 million blocks were created, and more than 3.2 million transactions were processed during this time. +The size of the blockchain is approximately 1 gigabyte. +The maximum number of transactions recorded in a single block was 386. With a block time of 10 seconds, +we can confirm that Pactus blockchain can support up to 30 transactions per second (TPS), +which is a reasonable number for TPS. Based on real-time statistics available at realtps, +we can see that Pactus is among the top 10 blockchains in terms of TPS.

+ +

At this point, the development team decided to end the Testnet-0 and move on to the next one, +Testnet-1. We are planning to run the Testnet-1 to prepare for the MainNet launch. +We will provide updates on our progress and share the details of the new Testnet soon.

+ +

As promised, participants in Testnets will be given priority as validators for the MainNet, +and will receive bounty tokens from the bootstrap accounts to set up their validator. +We are grateful to all those who participated in Testnet-0, and we encourage them to join our next Testnet to +help us improve Pactus. +As a community-based project, we rely on the support of our community members, and we value any help we receive.

]]>
What is a Testnet?2023-03-01T00:00:00+00:002023-03-01T00:00:00+00:00https://pactus.org/2023/03/01/what-is-testnetMainnet vs Testnet? + +

If you have ever wondered what Testnet is and how it is different from Mainnet, read this article to the end to find out!

+ +

Mainnet and Testnet are two widely used terminologies in the Blockchain ecosystem; +so it is important to understand the meaning and differences while working in the industry or +following announcements of the Blockchain projects like Pactus.

+ +

Here’s a quick explanation: +Before the actual live version of a Blockchain network that is used for real transactions, +functions and smart-contracts (which is referred as Mainnet), +there is a test version of the Blockchain network for testing purposes (which is referred as Testnet). +In Testnet, a safe environment is provided to help developers experiment and test their applications, +and make sure that everything functions smoothly in the Mainnet version.

+ +

Testnet

+ +

A Testnet is a simulation of a Blockchain, in which developers can test all the functionalities of +their Blockchain network without risking their assets and convenience of end-users. +Using Testnet, any possible error, bug or malfunctions can be fixed before the Mainnet launch. +Testnet also can be an experimental environment for new features, updates and upgrades. +So several Testnet networks of the same version or newer version of the Mainnet can be implemented on the roadmap.

+ +

What are use cases of Testnet?

+ +

A secure environment to test development ideas and updates. +So many features and minor details in Pactus project have been successfully developed so far using the Testnet; such as:

+ +
    +
  • extra details and information on Pactus-GUI;
  • +
  • well-functioning Pactus Blockchain explorer to access transactions and block details;
  • +
  • Upgrades that led to decreasing the size of the Pactus network
  • +
+ +

Providing a safe testing ground for resolve scalability and security problems, as well as decentralization issues. +Pactus network is also a secure and purely decentralized network. However in the last updates during the Testnet, +developers are now able to decrease the database size by approximately 10% without compromising performance. +They did it by utilizing block height instead of hash to store blocks within the database. (you can find out more +here).

+ +

Testing new versions, patches and features on Testnet. it is vital for enhancing the security, load testing, +Blockchain migration, integration tests, and etc. This is why you can now use the latest version of Pactus-GUI +that works like clockwork and is extremely secure.

+ +

Testing the functions of cryptocurrency without disrupting the Mainnet. In the Testnet of Pactus Blockchain, +you as a user or validator can use all the features to send, receive, bond or unbond your assets in the Pactus-GUI.

+ +

Development and simulation of smart contract features and DApps. Note that many Blockchain projects like Pactus, +can be used as smart-contract platforms. So the Testnet can be designed in different stages to test and improve +different applications of the network.

+ +

Please note that after a certain period of time, when developers get satisfied with the functionality and debugging process, +they launch Mainnet. Mainnet has its own independent genesis blocks; +so the assets and addresses that users use in Testnet are not valid inside the new Mainnet Blockchain anymore. +In fact the whole Blockchain network starts working from the scratch and users and validators start to +work with real tokens and transactions instead of the simulated ones. But since Testnet has an important effect +on the health and improvement of the network, in Pactus Blockchain, we have several advantages +for the people who join the Testnet.

+ +

Why should you join the Testnet?

+ +

There are different contributors in a Blockchain network; +Some people are developers and programmers that use the Testnet to contribute, enhance and lead the project to a better future. +Testnet is actually vital for them to perform their changes and try their innovations and ideas.

+ +

But you might also be an end user; you might want to either be a validator and stake your assets to earn more Pactus coins, +or you might want to learn how to use the network for future personal applications. Either way, +you might find it handy to give it a try and be familiar with Pactus-GUI and its different features.

+ +

However, there is another advantage for end users who join the Testnet. +While using the network, running a node or testing the Pactus-GUI in Testnet period, you are contributing to +the community to find improvement potentials, that’s why there are more advantages contemplated for the Testnet users; +Soon our Mainnet will be launched and also Pactus network will be announced and listed in well-known exchanges. +As an early contributor, you will have the advantage of getting some extra initial tokens at the beginning of Mainnet launch. +So that you can use it to run a validator node and earn more from staking your assets. This airdrop is considered +for every individual who installs Pactus-GUI and starts a node in Testnet.

+ +

There are other positive conditions you may experience as an early contributor.

+ +
    +
  • Advanced and very responsive support for your issues (we dedicate more time to provide you with solutions)
  • +
  • Embracing your suggestions, improvement ideas, needs and information you may require to have a better user experience.
  • +
]]>
Pactus 0.9.1 released2022-11-24T00:00:00+00:002022-11-24T00:00:00+00:00https://pactus.org/2022/11/24/release-0-9-1Overview + +

Pactus Blockchain Release Version 0.9.1 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Download

+ +

This version has been implemented for Testnet-0 and is preparing for the upcoming Mainnet launch. +To start using the Pactus Blockchain Testnet-0, +you can download the latest version from download page +and join the Testnet.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +
    +
  • Blocks can be fully decoded when queried in gRPC
  • +
  • The HTTP module now uses gRPC module, making node configuration simpler by removing the CapnP module
  • +
  • Reducing the blockchain size by saving blocks by number instead of hash
  • +
  • The wallet can hold unconfirmed transactions
  • +
  • The wallet can use different gRPC servers
  • +
  • The GUI displays committee information
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

]]>
Dev meeting2022-10-30T00:00:00+00:002022-10-30T00:00:00+00:00https://pactus.org/2022/10/30/dev-meetingMeeting Summary + +

The meeting took place on 30 October 2022, at 2:00 PM UTC via Google Meet, +with team members from different time zones joining to discuss key aspects of the Pactus project.

+ +

In memory of Mahsa Amini

+ +

The meeting started in memory of Mahsa Amini. +We in the Pactus family stand in solidarity with courageous people who are fighting for equality, equity and freedom in Iran.

+ +

Woman Life Freedom

+ +

Launching Block explorer

+ +

The beta version of the block explorer has been launched 🚀 and is now available at +https://pacscan.org.

+ +

Nagaraj explained the block explorer and some of the features.

+ +

Project road map

+ +

Project road map was discussed.

+ +

IdeaKita pitch deck

+ +

Ali presented the Pactus pitch deck for the IdeaKita in Malaysia. +The IdeaKita program, under the Malaysia Digital Economy Corporation (MDEC), is designed to +support entrepreneurs and startups in Malaysia.

+ +

Latest development progress

+ +

The latest pull requests were reviewed:

+ +]]>
\ No newline at end of file diff --git a/ar/index.html b/ar/index.html new file mode 100644 index 000000000..7ad315ba0 --- /dev/null +++ b/ar/index.html @@ -0,0 +1,445 @@ + + + + + + + + + + + + + الصفحة الرئيسية | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+
+
+
+ +
+
+
+
+
بلوكشين بكتوس
+
Building decentralized future together!
+
+ +
+
+
+ +
+
+
+

تشغيل عقدة

+ قم بتنزيل أحدث إصدار من بلوكشين بكتوس، وقم بإنشاء محفظتك وابدأ في المزامنة مع الشبكة. تم تصميم بكتوس ليكون خفيف الوزن وسهل الاستخدام، مما يجعل التشغيل بسيطًا. + + +
+
+ تشغيل عقدة +
+
+ +
+
+ احصل على بعض العملات +
+
+

احصل على بعض العملات

+ بمجرد تشغيل عقدتك وبدء تشغيلها، ستحتاج إلى الحصول على بعض العملات لتصبح مُصدِّق. يمكنك الانضمام إلى مجتمعنا واستلام بعض عملات الحصة مجانًا. + + +
+
+ +
+
+

كن مُصدِّق

+ من خلال تعيين بعض العملات، ستتحول عقدتك إلى مصدق وبالتالي، في كل مرة تقترح فيها كتلة، ستتم مكافأتك بعملة جديدة كمكافأة للكتلة. + +
+ تعلم +
+
+
+ كن مُصدِّق +
+
+ +
+
+ جعل بكتوس أفضل +
+
+

جعل بكتوس أفضل

+ هناك العديد من الطرق التي يمكنك من خلالها دعم بكتوس ومساعدته في النمو. لنعمل معًا لجعل بكتوس أفضل! + + +
+
+
+ +
+
+
+

Our Partners

+
+
+
+ + sensifia + +
+
+ + ipminter + +
+
+
+
+
+
+ + +
+ + diff --git a/ar/learn/blockchain/account/index.html b/ar/learn/blockchain/account/index.html new file mode 100644 index 000000000..490e5aecf --- /dev/null +++ b/ar/learn/blockchain/account/index.html @@ -0,0 +1,635 @@ + + + + + + + + + + + + + Account | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Account

+ +

An account is an entity that is identified by a unique address, +which can send transactions on the blockchain.

+ +

Account Structure

+ +

The account structure is 12 bytes long and consists the following fields:

+ + + + + + + + + + + + + + + + + + +
SizeField
4 bytesNumber
8 bytesBalance
+ +
    +
  • Number is a sequential and unique number assigned to each account when it is created for the first time. +The account number is used to calculate the state hash of the blockchain.
  • +
  • Balance holds the balance of the account, which is the amount of Pactus coins held by the account.
  • +
+ +

Treasury Account

+ +

The Treasury account is a special account that is defined at the genesis time. +The Treasury account holds the total supply of Pactus coins, which is fixed at 21 million coins, +and each coin is divided into 1 billion units.

+ +

In each block, one coin from the treasury account is transferred to the proposer account +as block reward.

+ +

This block reward serves as an incentive for validators to propose and validate new blocks on the blockchain. +As a result, the total number of Pactus coins in circulation increases gradually over time as new blocks +are added to the blockchain.

+ +
+
+
+ + + + + diff --git a/ar/learn/blockchain/address/index.html b/ar/learn/blockchain/address/index.html new file mode 100644 index 000000000..3909fff48 --- /dev/null +++ b/ar/learn/blockchain/address/index.html @@ -0,0 +1,637 @@ + + + + + + + + + + + + + Address | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Address

+ +

An address is a unique identifier that is used to send and receive transactions on the Pactus blockchain. +It is represented as a string of 42 alphanumeric characters and always begins with the letters “pc1”. +Here is an example of an address on the Pactus blockchain:

+ +
pc1p4e92hx0erqyx939crndvthvpn7qcdhefc9r6s7
+
+ +

Address Structure

+ +

An address in the Pactus blockchain is made up of 21 bytes and it is derived from the public key. +The first byte of the address specifies the address type, +while the remaining 20 bytes represent the hash of the public key. +The hash function used is RIPEMD-160, +which is applied after Blake2b): +The resulting byte array is then converted into a bech32m1 string.

+ +

Pactus address structure

+ +

Address Type

+ +

The address type specifies the type of the address and its defined as below:

+ +
    +
  • 0: Treasury address
  • +
  • 1: Validator address
  • +
  • 2: Account address
  • +
+ +

Treasury Address

+ +

The Treasury address on the Pactus blockchain is a fixed address that is defined as follows:

+ +
TreasuryAddress: 000000000000000000000000000000000000000000
+
+ +

The address type for the Treasury address is set to zero, which +means there is no key associated with the Treasury address. +The remaining characters of the address are all zeros.

+ + + +
+
+
+ + + + + diff --git a/ar/learn/blockchain/block/index.html b/ar/learn/blockchain/block/index.html new file mode 100644 index 000000000..ace6883fb --- /dev/null +++ b/ar/learn/blockchain/block/index.html @@ -0,0 +1,753 @@ + + + + + + + + + + + + + Block | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Block

+ +

In the Pactus, a block is a set of data that contains a header, the certificate of the previous block +and list of the transactions. +Once a block comes with a valid certificate, it is committed and added to the blockchain, and +the certificate will be included in the next block. +A committed block is immutable, and any modifications to the block will invalidate the certificate.

+ +

Pactus blockchain

+ +

Block Header

+ +

The block header is a data structure in the Pactus blockchain that contains important information about +the block.

+ +

The block header is 138 bytes long and consists the following fields:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SizeField
1 byteVersion
4 bytesTimestamp
32 bytesPrevious Block Hash
32 bytesState Hash
48 bytesSortition Seed
21 bytesProposer Address
+ +
    +
  • Version is used to track the software or protocol upgrade, and the current block version is set to 1.
  • +
  • Timestamp is the time of the block as the number of seconds since January 1, 1970 (Unix Epoch).
  • +
  • Previous Block Hash is the hash of the previous block in the blockchain.
  • +
  • State Hash is the state hash of the blockchain at this block. +The State Hash ensures that all nodes in the network have the same state.
  • +
  • Sortition Seed is a verifiable and unpredictable seed data used by +the sortition algorithm.
  • +
  • Proposer Address is the address of the validator who created and proposed the block.
  • +
+ +

Block Certificate

+ +

A block certificate is a proof of commitment for the block in the Pactus blockchain. +It is the result of the Pactus consensus algorithm and ensures that the block has been agreed upon by committee members.

+ +

The block certificate consists the following fields:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SizeField
4 bytesHeight
2 bytesRound
VariantCommitters
VariantAbsentees
48 bytesSignature
+ +
    +
  • Height is the height of the certified block.
  • +
  • Round is the consensus round in which this certificate was issued. +If a proposer fails to propose a block in one round, another validator takes over as the proposer, +and the round number is increased.
  • +
  • Committers is the list of validator numbers in the committee for the current certificate..
  • +
  • Absentees is the list of validator numbers that are absent in the committee.
  • +
  • Signature is the signature for the certificate that ensures the majority of the committee members have validated and +signed the proposed block.
  • +
+ +

Transactions

+ +

Each block in the Pactus blockchain contains a list of transactions. +The maximum number of transactions in a block is determined by the +consensus parameters, and currently set to 1000. +The first transaction in each block is the reward transaction. +Once a block is committed and added to the blockchain, all the transactions inside the block will be executed. +This means that the state of the blockchain will be updated based on the transactions in the committed block.

+ +

Block Hash

+ +

The block hash is a unique identifier for each block, which is computed by hashing the following data:

+ +
    +
  • Block header data (138 bytes)
  • +
  • Previous certificate hash (32 bytes)
  • +
  • Merkle root hash of transactions (32 bytes)
  • +
  • Number of transactions (variant)
  • +
+ +

The previous certificate hash and the Merkle root hash of transactions are included in the block hash to +ensure that they cannot be modified. +The block hash is used to link the blocks together in the blockchain.

+ +

FAQ

+ +

Is there any empty block in Pactus?

+ +

There is no completely empty block in Pactus. +Each block contains at least one transaction, which is the reward transaction.

+ +

How are certificates issued?

+ +

In the Pactus blockchain, a validator called a Proposer is responsible for collecting all transactions and +creating a block every 10 seconds. +The Proposer broadcasts the proposed block to other validators inside the committee. +Other validators verify the proposed block, and if it is valid, they cast their votes in favor of the proposed block by +signing the combination of the block hash and the consensus round. +More details about the consensus mechanism can be found in the +consensus protocol document.

+ +

To issue a valid certificate, signatures from validators who hold more than ⅔ of the stake in +the committee are required. +Once enough votes are collected, the signatures are aggregated and combined into a single signature, and +the certificate is issued.

+ +

How are certificates verified?

+ +

To verify a certificate for a block, the block hash is computed, and +the aggregated public key can be formed using the Committers and Absentees list. +Then, the signature can be verified using the aggregated public key and +the aggregated signature inside the certificate.

+ +
+
+
+ + + + + diff --git a/ar/learn/blockchain/cryptography/index.html b/ar/learn/blockchain/cryptography/index.html new file mode 100644 index 000000000..9636f91b0 --- /dev/null +++ b/ar/learn/blockchain/cryptography/index.html @@ -0,0 +1,616 @@ + + + + + + + + + + + + + Cryptography | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Cryptography

+ +

The Pactus blockchain employs various advanced cryptographic algorithms, including hashing and signature schemes, +to protect user data and transactions.

+ +

Hashing Algorithm

+ +

Pactus uses a hashing algorithm called Blake2b. +This algorithm is known for being a fast and secure way of creating unique digital fingerprints of data.

+ +

Digital Signature

+ +

To ensure secure transactions, Pactus uses a signature scheme called +BLS (Boneh–Lynn–Shacham) +threshold signature for cryptographic signing and verification.

+ +

Signature Aggregation

+ +

One of the advantages of BLS signatures is signature aggregation. BLS individual signatures can be +combined into one single aggregated signature, so that the overall size does not grow beyond one +signature.

+ +

Non-Malleability

+ +

BLS signatures have an important property called non-malleability, +which means that it is impossible to generate two valid signatures for the same message. +In other words, each message has a unique signature, and signatures cannot be altered without invalidating the signature.

+ +
+
+
+ + + + + diff --git a/ar/learn/blockchain/genesis/index.html b/ar/learn/blockchain/genesis/index.html new file mode 100644 index 000000000..5908199ef --- /dev/null +++ b/ar/learn/blockchain/genesis/index.html @@ -0,0 +1,637 @@ + + + + + + + + + + + + + Genesis | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Genesis

+ +

The Pactus blockchain starts from scratch, with no pre-existing accounts or pre-allocated tokens. +Its starting point is known as the genesis block, which is created by the bootstrap validators.

+ +

Bootstrapping

+ +

The Pactus blockchain starts with four bootstrap validators. +These bootstrap validators do not have any stake, however their voting power is set to one within the consensus algorithm. +Their primary role is to initiate the blockchain during a brief period known as the bootstrapping phase. +As the bootstrapping phase progresses, these validators are able to earn rewards, +which they can later use to invite other validators to join the network.

+ +

Once the network reaches 21 validators, the bootstrap validators will retire, and +the blockchain will be secured by other validators.

+ +

Genesis Block

+ +

The genesis block is the first block in the Pactus blockchain, and it is created by the bootstrap validators. +This block marks the beginning of the blockchain and serves as the foundation for subsequent blocks.

+ +

The previous block hash in the genesis block sets to 0, +indicating that it has no predecessor. +Additionally, the genesis block does not have a previous certificate.

+ +

Genesis Information

+ +

In Pactus, the Genesis Information is pre-defined and indicates the initial state of the network. +These parameters are hardcoded into the project and include:

+ +
    +
  • Genesis Time This is the time when the genesis block should be created. +The bootstrap validators must be operational before this time.
  • +
  • Consensus Parameters: The initial consensus parameters +are defined at genesis time and ensure that the entire network operates within the same configuration. +These consensus parameters are discussed in detail in the consensus section of the documentation.
  • +
  • Treasury Account: The treasury account +is defined at the genesis time and holds the total supply of the Pactus blockchain, +21 million coins. Each coin is divided into 1 billion units.
  • +
  • Bootstrap Validators The bootstrap validators are defined by their public keys.
  • +
+ +

FAQ

+ +

Where can I see the Genesis Information?

+ +

You can find the pre-defined Genesis Information for the Testnet of the Pactus blockchain in the genesis.json file, +which is located in the project repository, here.

+ +
+
+
+ + + + + diff --git a/ar/learn/blockchain/incentive/index.html b/ar/learn/blockchain/incentive/index.html new file mode 100644 index 000000000..128e76b7c --- /dev/null +++ b/ar/learn/blockchain/incentive/index.html @@ -0,0 +1,656 @@ + + + + + + + + + + + + + Incentive | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Incentive

+ +
+

The incentive may help encourage nodes to stay honest.

+ +

Satoshi Nakamoto

+
+ +

In Pactus, rewards are given to validators for proposing and validating new blocks on the blockchain. +These rewards serve as an incentive for validators to participate in the consensus process and +maintain the security and integrity of the network.

+ +

Flat Reward

+ +

To better understand the incentive model in Pactus, let’s compare it with the Bitcoin reward model. +This comparison will help to understand how the incentive model works in Pactus.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PactusBitcoin
Consensus engine is Proof of StakeConsensus engine is Proof of Work
Exactly every 10 seconds one block is mintedAround every 10 minutes one block is mined
Total supply is 21,000,000 coinTotal supply is 21,000,000 coin
Always one coin per blockInitial block reward is 50 coin
No halvingHalving happens every 4 years
+ +

The halving mechanism in Bitcoin rewards early contributors more significantly. +However, in a Proof-of-Stake blockchain, this mechanism can lead to wealth centralization, +as early validators gain too much power based on their staked coins.

+ +

To promote fairer block rewards, Pactus has introduced a simple and straightforward incentive model called the “Flat Reward.” +In this model, the block reward remains constant at one coin per block and does not change over time.

+ +

Rewards in Bitcoin

+ +

Rewards in Pactus

+ +

Coin Distribution

+ +

In Pactus, the coin distribution is linear. This linear distribution is a direct result of the Flat Reward system. +Unlike other blockchains that have a curved distribution, Pactus maintains a consistent coin distribution.

+ +

Coin distribution in Bitcoin

+ +

Coin distribution in Pactus

+ +
+
+
+ + + + + diff --git a/ar/learn/blockchain/serialization/index.html b/ar/learn/blockchain/serialization/index.html new file mode 100644 index 000000000..883b3b214 --- /dev/null +++ b/ar/learn/blockchain/serialization/index.html @@ -0,0 +1,741 @@ + + + + + + + + + + + + + Data Serialization | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Data Serialization

+ +

Data serialization is the process of converting data into a format that can be easily stored or transmitted over a network. +It typically involves encoding data into a sequence of bytes, which can later be decoded to +reconstruct the original data structure. +Pactus has two methods for data serialization: Deterministic serialization and CBOR serialization:

+ +

Deterministic Serialization

+ +

Pactus uses a deterministic serialization for the deterministic data like blocks and transactions. +The serialization format for different types of data is listed in the table below:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Data TypeSize (bytes)Description
uint81An 8 bits unsigned integer
int81An 8 bits signed integer
uint162A 16 bits unsigned integer
int162A 16 bits signed integer
uint324A 32 bits unsigned integer
int324A 32 bits signed signed integer
uint648A 64 bits unsigned integer
int648A 64 bits signed signed integer
VarIntVariableA compact representation of an unsigned integer.
VarByteVariableA variable length bytes
VarStringVariableA variable length string
Address2121 bytes of address data
Hash323232 bytes of hash data
+ +

VarInt

+ +

Variable length integer (VarInt) is encoded by 7-bit chunks. The MSB indicates whether there are +more octets (1) or it is the last one (0). It means 0x00 to 0x7f encoded in 1 byte, 0x80 to +0x3fff encoded in 2 bytes, …

+ +

Example:

+ +
0x0f -> 0f
+0x1000 -> 8020
+0xffff -> ffff03
+0xffffff -> ffffff07
+
+ +

VarByte

+ +

Variable length byte (VarByte) is encoded as a variable length integer (VarInt) containing the +length of the array followed by the bytes themselves: VarInt(len(bytes)) || bytes

+ +

VarString

+ +

Variable length string (VarString) is encoded as a variable length integer (VarInt) containing the +length of the string followed by the bytes that represent the string +itself:VarInt(len(str)) || str

+ +

Byte Order

+ +

All the internal number representation are in little-endian byte order.

+ +

Example

+ +

Here is an example of a block header data that encoded using deterministic serialization:

+ +
+ + +

CBOR Serialization

+ +

For non-deterministic data, such as networking messages, Pactus uses +“Concise Binary Object Representation” or CBOR. +CBOR is a binary data serialization format that is widely used in various application, +including IoT, web services, security, and automotive, due to its compact representation and efficient parsing.

+ +

CBOR Me!

+ +

cbor.me +is an online tool for encoding and decoding CBOR data, offering developers an easy way to test and +validate their CBOR data without having to set up a local environment.

+ +

Example

+ +

Here is an example of a vote message that encoded using CBOR.

+ +
+ + + +
+
+
+ + + + + diff --git a/ar/learn/blockchain/state-hash/index.html b/ar/learn/blockchain/state-hash/index.html new file mode 100644 index 000000000..c69814d47 --- /dev/null +++ b/ar/learn/blockchain/state-hash/index.html @@ -0,0 +1,648 @@ + + + + + + + + + + + + + State Hash | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

State Hash

+ +

The State Hash is used to ensure the integrity of the data in the Pactus blockchain. +It serves as a unique identifier or fingerprint of the current state of the blockchain, +allowing all nodes to verify that their data matches that of the other nodes. +This helps to prevent any tampering or inconsistencies in the data, ensuring the accuracy and consistency of the blockchain.

+ +

Merkle Tree

+ +
+

In cryptography and computer science, a hash tree or Merkle tree is a tree in which every leaf node +is labelled with the cryptographic hash of a data block, and every non-leaf node is labelled with +the cryptographic hash of the labels of its child nodes. Hash trees allow efficient and secure +verification of the contents of large data structures.

+ +

From Wikipedia

+
+ +

A Hash tree or Merkle tree is a data structure that used by many blockchains to solve this problem: +“How can data be securely stored and verified in a decentralized network?”

+ +

By using a Merkle tree, nodes can easily verify that they store the same data +without having to share the entire dataset. Additionally, this helps to prevent any tampering with the data, +as any changes made to the data would cause inconsistencies in the Merkle tree and +can be easily detected by the network.

+ +

State Merkle Trees

+ +

In Pactus, the Merkle tree is used to verify the state of the blockchain in each block. +The state hash in each block is calculated by taking the hash of two Merkle trees: +the accounts Merkle tree and the validators Merkle tree. +Each leaf in these trees contains the hash of the associated account or validator. +By using the state hash, all nodes in the network can ensure they have the same data stored.

+ +

State hash

+ +

Scalability of Merkle Tree

+ +

Using a Merkle tree to calculate the state of the blockchain can be challenging +because when the number of accounts is large, calculating the root hash can be difficult. +In other words, a simple Merkle tree may not be scalable because calculating all the leaf +and node hashes requires a significant amount of computation.

+ +

In Pactus, all accounts and validators have unique and sequential numbers. +This means that each account and validator has a dedicated account number that helps us to +calculate the hash of leaf nodes in the Merkle tree. +By using these account numbers, we can ensure that the position of the leaf nodes in +the Merkle tree is always the same. +This approach allows us to avoid rebuilding the Merkle tree whenever an account or validator’s state changes. +Instead, we can save the previous Merkle tree and recalculate the parent hashes by +fetching neighbor hashes as needed. +This helps to ensure scalability and reduces the computational resources required for recalculating the Merkle tree.

+ +

Account tree

+ +

In this example, only account 6 has been updated. +By locating the corresponding leaf node in the existing Merkle tree and +traversing the tree towards the root node, we can calculate new root hash. +This approach has a complexity of \(O(log n)\), making it efficient for large numbers of accounts.

+ +
+
+
+ + + + + diff --git a/ar/learn/blockchain/validator/index.html b/ar/learn/blockchain/validator/index.html new file mode 100644 index 000000000..b3f8b0dad --- /dev/null +++ b/ar/learn/blockchain/validator/index.html @@ -0,0 +1,644 @@ + + + + + + + + + + + + + Validator | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Validator

+ +

A Validator is an entity that participates in the consensus process by sharing its votes. +Validators get rewarded for creating new blocks, and to become a Validator, +they must “bond” or lock up a certain amount of coins as stake. +The amount of stake held by validators determines their power in the consensus.

+ +

Validator Structure

+ +

The Validator structure is 120 bytes long and consists the following fields:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SizeField
96 bytesPublic Key
4 bytesNumber
8 bytesStake
4 bytesLast Bonding Height
4 bytesUnbonding Height
4 bytesLast Joined Height
+ +
    +
  • Public Key is the Validator’s public key.
  • +
  • Number is a sequential and unique number assigned to each validator when it is created for the first time. +The validator number is used to calculate the state hash of the blockchain.
  • +
  • Stake holds the Validator’s stake or the amount of Pactus coins locked or “staked” by the Validator.
  • +
  • Bonding Height is the last block height that the validator has bonded their stake.
  • +
  • Unbonding Height is the block height that the validator’s stake is unbonded.
  • +
  • Last Joined Height is the block height that the validator joined the committee.
  • +
+ +
+
+
+ + + + + diff --git a/ar/learn/consensus/committee/index.html b/ar/learn/consensus/committee/index.html new file mode 100644 index 000000000..8b209b9f7 --- /dev/null +++ b/ar/learn/consensus/committee/index.html @@ -0,0 +1,732 @@ + + + + + + + + + + + + + Committee | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Committee

+ +

The committee is a group of 21 validators responsible for generating new blocks. +Validators in the committee participate in the consensus algorithm by casting votes, +with their voting power determined by their stake. +While in the committee, validators cannot send Bond or Unbond transactions, +meaning their voting power remains the same. +The members of the committee changes randomly over time through Sortition transactions. +Each block can contain zero or more Sortition transactions.

+ +

These rules are applied when committing sortition transactions:

+ +
    +
  1. A minimum of ⅔ of the total stake must be maintained in the committee.
  2. +
  3. If a validator is already in the committee, they will remain in the committee.
  4. +
  5. If a validator is not in the committee, the oldest validator will exit the committee.
  6. +
  7. Each validator should stay in committee at least for 21 blocks.
  8. +
+ +

Proposer Selection

+ +

Proposer selection within the committee operates on a deterministic, clockwise rotation system. +If a validator is unable to propose, for any reason, it stays within the committee, but +the proposer’s role shifts to the next validator in the committee.

+ +

Proposer selection

+ +

Adding Validators to the Committee

+ +

When a new validator joins the committee, they take a position before the current proposer. +After the addition of a new validator, the committee adjusts to maintain the total number of validators at 21. +This is achieved by removing the oldest validator from the committee, +i.e., the one that has been in the committee for the longest time.

+ +

Adding Validators to the Committee

+ +

Security of the Committee

+ +

For an adversary to take control of the committee, they would need to control more than ⅔ of the stake within the committee. +To assess the security of the committee, let’s assume all validators in the committee have the same voting power. +In this case, an adversary would need to control more than ⅔ of the validators in the committee.

+ +

Now, let’s imagine an adversary holds 10% of the total stake. +As a result, one of their validators can enter the committee every 10 blocks. +In the first 10 blocks, one of the adversary’s validators enters the committee. +In the next 10 blocks, another validator enters the committee, giving the adversary two validators within the committee. +In the subsequent 10 blocks, another validator enters, but at the same time, the first validator leaves the committee. +Therefore, an adversary with 10 10% of the total stake can have, on average, two validators in a committee of 21 validators.

+ +

Using the Poisson distribution, +we can estimate the probability of an adversary controlling ⅔ of the committee:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Adversarial StakeCommittee size⅔+ of committeeAdversarial committee membersProbability of controlling ⅔+
15%21153\(5.46 \times 10^{-07}\)
15%55357\(3.34 \times 10^{-14}\)
15%996714\(1.41 \times 10^{-24}\)
10%21152\(3.39 \times 10^{-09}\)
10%55355\(1.90 \times 10^{-18}\)
10%99679\(2.91 \times 10^{-35}\)
5%21151\(2.81 \times 10^{-13}\)
5%55352\(4.50 \times 10^{-31}\)
5%99674\(1.09 \times 10^{-56}\)
+ +

FAQ

+ +

How can one know when a validator has joined the committee?

+ +

The height at which the validator joined the committee is recorded as the “Last Joined Height” field in +the validator structure. +Once a validator enters the committee, this field is set to the current height it +evaluated the sortition proof.

+ +

Can a validator within the committee run the sortition algorithm?

+ +

A validator within the committee can run the sortition algorithm. +If they generate a valid sortition transaction, the height of their entry into the committee is set +to the current block height, allowing them to stay in the committee for a longer period.

+ +
+
+
+ + + + + diff --git a/ar/learn/consensus/parameters/index.html b/ar/learn/consensus/parameters/index.html new file mode 100644 index 000000000..30cadd3e0 --- /dev/null +++ b/ar/learn/consensus/parameters/index.html @@ -0,0 +1,630 @@ + + + + + + + + + + + + + Consensus Parameters | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Consensus Parameters

+ +

Consensus parameters are a set of configurable settings that determine how the Pactus blockchain operates. +These parameters are agreed upon by all validators in the network, +ensuring that validators behave in the same way and that the network operates consistently.

+ +

Here is the list of the consensus parameters:

+ +
    +
  • Block Version: The version number of the blockchain protocol. +This is set to 1.
  • +
  • Block Time: The time interval in seconds between the creation of two consecutive blocks. +This is set to 10 seconds, which means that a new block is created every 10 seconds.
  • +
  • Committee Size The number of validators in the committee. +This is set to 21 validators.
  • +
  • Block Reward The fixed reward amount given to the validator who successfully creates and proposes a new block. +This is set to 1,000,000,000, which is equivalent to one coin.
  • +
  • Time-to-Live Interval: The number of blocks that a transaction can remain unprocessed before +it is removed from the transaction pool. +This is set to 8640 blocks, which is almost one day.
  • +
  • Bond Interval: The minimum number of blocks that must elapse after a validator has submitted a bond transaction +before they can participate in the consensus process and join the validator committee. +This is set to 360 blocks, which is almost one hour.
  • +
  • Unbond Interval: The minimum number of blocks that must elapse after a validator has submitted +an unbond transaction before +they can withdraw their staked coins. +This is set to 181440 blocks, which is almost 21 days.
  • +
  • Sortition Interval: The maximum number of blocks that a sortition transaction can remain valid and be included +in a block. +This is set to 7 blocks.
  • +
  • Fee Fraction: The fraction of transaction value that must be paid in order for a transaction to be included in a block. +This is set to 0.0001 PAC, meaning that 0.01% of transaction value are awarded to the block proposer.
  • +
  • Minimum Fee: The minimum transaction fee that must be paid. +This is set to 1,000 (satoshi), which is equivalent to 0.000001 PAC coin.
  • +
  • Maximum Fee: The maximum transaction fee that must be paid. +This is set to 1,000,000 (satoshi), which is equivalent to 0.001 PAC coin.
  • +
  • Maximum Stake: The maximum amount of coins that can be staked by a validator. +This is set to 1,000,000,000,000 (satoshi), which is 1000 PAC coins.
  • +
  • Minimum Stake: The minimum amount of coins that can be staked by a validator. +This is set to 1,000,000,000 (satoshi), which is 1 PAC coins.
  • +
+ +
+
+
+ + + + + diff --git a/ar/learn/consensus/proof-of-stake/index.html b/ar/learn/consensus/proof-of-stake/index.html new file mode 100644 index 000000000..4f34e7006 --- /dev/null +++ b/ar/learn/consensus/proof-of-stake/index.html @@ -0,0 +1,651 @@ + + + + + + + + + + + + + Solid State Proof of Stake | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Proof of Stake

+ +

Proof of Stake is a way to secure a blockchain through requesting users to stake some amount of their coins. +These stakeholders, called validators, are responsible to collect, validate and add transactions to the blockchain. +The validators will be rewarded with native coins.

+ +

Unlike Proof of Work, which is based on competition, Proof of Stake is based on collaboration. +Validators work together to manage the expansion of the blockchain. +A Proof of Stake blockchain becomes more decentralized and secure as more validators participate in it.

+ +

An example

+ +

To understand how Proof of Stake works, imagine a community bank without any centralized authority. +In this bank, users decide to run it together. +Some of these users volunteer to collect, validate, and record transactions, +ensuring that everything runs smoothly.

+ +

These volunteers, known as validators, must temporarily lock or freeze some of their money as a stake. +This stake can’t be transferred or used. +The more money a validator stakes, the more influence they have in the system.

+ +

From time to time, one of the validators is chosen by the others to collect all the recent transactions, +bundle them together, and send a copy to the other validators. +If a supermajority of the validators agree with the proposed bundle by signing it, +the bundle will be committed to the bank’s ledger.

+ +

In this system, validators have no incentive to behave maliciously or dishonestly. +If they do, they risk harming the bank’s reputation and the value of their own stakes as well.

+ +

Delegated Proof of Stake

+ +

In Proof of Stake, if the number of validators increases, +the voting time will also increase, and this can lead to an inefficient consensus mechanism. +In our community bank example, running the bank becomes more difficult as the number of validators increases.

+ +

To solve this problem, some blockchains use the concept of “delegators”. +In Delegated Proof of Stake, users entrust their stakes to a small group of “delegates”. +These delegates are responsible for validating transactions and creating blocks. +The number of delegates is limited to ensure accountability and efficiency in the validation process.

+ +

Delegated Proof of Stake

+ +

The delegation model puts a lot of trust in the hands of a small number of delegates, +which goes against the principle of “don’t trust, verify”.

+ +

Consensus without delegation or Solid State Proof of Stake (SSPoS)

+ +

Pactus introduced a mechanism that doesn’t rely on delegation, we call it Solid State Proof of Stake. +It utilizes a dynamic committee of validators +that are responsible for creating new blocks. +The size of the committee is fixed, but the members of the committee are randomly changed. +On the other hand, the number of validators outside the committee is unlimited, allowing anyone to +become a validator by staking coins.

+ +

At each block, validators participate in a sortition algorithm +by generating a random number between zero and the total staked coins. +If the number is less than the validator’s stake, they can enter the committee and replaces the oldest committee member.

+ +

Pactus Solid State Proof of Stake

+ +

The chance of entering the committee depends on the validator’s stake and luck. +But on average, one validator should enter the committee in each block.

+ +
+
+
+ + + + + diff --git a/ar/learn/consensus/protocol/index.html b/ar/learn/consensus/protocol/index.html new file mode 100644 index 000000000..e5a633e44 --- /dev/null +++ b/ar/learn/consensus/protocol/index.html @@ -0,0 +1,852 @@ + + + + + + + + + + + + + Consensus protocol | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
+ This post is obsolete. check here for more information. +
+ +

Consensus Protocol

+ +

Pactus consensus algorithm is a state machine +replication with Byzantine fault tolerance. +The Pactus consensus algorithm starts with the block creation phase. +In this phase one validator acts as the proposer. The proposer collects all the transactions, +creates a block, and proposes it to other validators.

+ +

When a proposed block is seen by other validators, they validate the block and +cast their vote for the proposed block, moving to the “prepare” state.

+ +

If more than two-thirds (⅔) of the total stakes cast their votes, the proposed block becomes prepared, +and validators move to the “precommit” state.

+ +

If, once again, more than two-thirds (⅔) of the total stakes cast their vote for the prepared block, +the block is committed, and the next proposer is ready to propose a new block. This cycle repeats every 10 seconds.

+ +

If a proposer fails to propose in any round, other validators start the “change proposer” phase to +decide to change the proposer for this round.

+ +

Pactus consensus states

+ +

The Algorithm

+ +

There are \(R = 3f+1\) validators. where \(f\) is the maximum +number of validators that may be faulty or byzantine. For example, if there is one faulty validator, +the resiliency of the algorithm is optimal if we have at least \(3\) non-faulty +validators. So the minimum number of validators should be \(3+1=4\).

+ +

We denote a message as \(\langle m \rangle\) tuple and a signed message by node \(i\) as +\(\langle m \rangle_{\sigma_i}\).

+ +

Pactus consensus algorithms has two phases: Block creation phase and change proposer phase.

+ +

Block Creation

+ +

The block creation phase in Pactus consensus algorithm includes these three steps1: +Propose, Prepare and Precommit. +The protocol proceeds in rounds \(r = 0, 1, 2, \ldots\).

+ +

Propose Step

+ +

In each round \(r\), one validator is the proposer and the others act as validators. +The proposer \(p\) collects transactions and creates a proposal block \(B\). It signs and +broadcasts a proposal message with the proposed block piggybacked to all the validators. +Propose message has this form:

+ +\[\langle \langle \text{PROPOSE},h,r \rangle_{\sigma_p}, B \rangle\] + +

where:

+ +
    +
  • \(B\) is the proposed block
  • +
  • \(h\) indicates the block height
  • +
  • \(r\) is an assigned round number, which is zero for the first round
  • +
+ +

Prepare Step

+ +

If validator \(i\) accepts the proposal, it enters prepare step and signs and +broadcasts prepare message to all other validators. Otherwise, it does nothing. +The prepare message has this form:

+ +\[\langle \text{PREPARE},h,r,d \rangle_{\sigma_i}\] + +

where:

+ +
    +
  • \(d\) is digest or hash of proposed block \(B\)
  • +
+ +

If validator \(i\) received \(2f+1\) prepare messages from other +validators (including its own), it becomes prepared and enters to precommit step.

+ +

Precommit Step

+ +

In precommit step, validator \(i\) signs and broadcasts precommit message to +the other validators. +The precommit message has this form:

+ +\[\langle \text{PRECOMMIT},h,r,d \rangle_{\sigma_i}\] + +

Each validator executes and commits block \(b\) after receiving +\(2f+1\) precommit messages (including its own) and becomes committed.

+ +

Block Announcement

+ +

Each validator that receives a valid proposal and with \(2f+1\) precommit messages from other +validators (including its own), can create a block-announce messages and broadcasts it to the network. +The block-announce message has this form:

+ +\[\langle \text{BLOCK-ANNOUNCE} ,h ,r ,B, C \rangle\] + +

where:

+ +
    +
  • \(C\) is the quorum certificate for the precommit step.
  • +
+ +

Validators can move to the next height and clear the message logs after receiving valid +block-announce message, even if their timer has expired.

+ +

The picture below shows the operation of the algorithm in the normal case. validator 1 is the +proposer and validator 4 is faulty.

+ +

Normal execution

+ +

Change Proposer

+ +

The change-proposer provides liveness by allowing the system to make progress when the proposer fails. +The change-proposer phase is triggered by timeouts that +prevent validators from waiting indefinitely for the proposal to execute.

+ +

If the timer of a validator expires in round \(r\), the validator starts a change-proposer phase. +The change-proposer phase is an Asynchronous Byzantine Binary Agreement (ABBA) 2 that is biased toward zero (No). +It means that during this phase, even if they don’t have the proposal, honest validators may decide to vote zero +if they obtain a valid quorum Certificate for the prepare step.

+ +

If a supermajority of the validators decide to change the proposer, they move to round r+1r+1. However, +if they decide not to change the proposer, they will return to the prepare state and, +since a supermajority of the validators attested to a valid proposal, they can commit the proposed block.

+ +

The change proposer phase in Pactus consensus algorithm includes these three steps: +Pre-vote, Main-vote and Decide +The protocol proceeds in rounds \(r_{cp} = 0, 1, 2, \ldots\).

+ +

Pre-vote Step

+ +

In Pre-vote step each validator casts a pre-vote for a value \(b \in \{0, 1\}\) +and broadcasts pre-vote message to the network. +The pre-vote message has this form:

+ +\[\langle\langle \text{CP:PRE-VOTE},h,r,r_{cp},b \rangle_{\sigma_i}, justification\rangle\] + +

The first round is a special round and each validator starts with an initial value. +If the validator’s timer has expired in the prepare step, its initial value is zero, +and if the validator’s timer has expired in the precommit step, its initial value is one.

+ +\[b = \begin{cases} +1 & \text{if timer expired in prepare step,} \\ +0 & \text{if timer expired in precommit step.} +\end{cases}\] + +

In the next rounds, each validator select \(2f+1\) properly justified main-votes from round \(r − 1\) and

+ +\[b = \begin{cases} +0 & \text{if there is a main-vote for 0,} \\ +1 & \text{if there is a main-vote for 1,} \\ +0 (biased) & \text{if all main-votes are abstain.} +\end{cases}\] + +

These pre-votes must be justified with a appropriate justification. +For the first round, if the validator’s timer has expired in the prepare step, the justification is \(nil\) , +and if the validator’s timer expired in the precommit step, +the justification is the proper quorum certificate for the prepare step at round \(r\).

+ +

In the next rounds, a pre-vote for \(b\) may be justified in two ways:

+ +
    +
  • Hard: that is the quorum certificate for \(\langle \text{CP:PRE-VOTE},h,r,r_{cp}-1,b \rangle\)
  • +
  • Soft: that is the quorum certificate for \(\langle \text{CP:MAIN-VOTE},h,r,r_{cp}-1,abstain \rangle\)
  • +
+ +

Main-vote Step

+ +

After collecting \(2f+1\) valid and justified pre-votes, each validator casts a main-vote \(v \in \{0, 1, abstain\}\) +and broadcasts main-vote message to the network. +The main-vote message has this form:

+ +\[\langle\langle \text{CP:MAIN-VOTE},h,r,r_{cp},v \rangle_{\sigma_i}, justification\rangle\] + +

The main-vote value \(v\) determine as below:

+ +\[v = \begin{cases} +0 & \text{if there are 2f+1 pre-vote for 0,} \\ +1 & \text{if there are 2f+1 pre-vote for 1,} \\ +abstain & \text{if there are pre-votes for 0 and 1.} +\end{cases}\] + +

These main-votes must be justified with a appropriate justification. +A main-vote for \(v\) may be justified in two ways:

+ +
    +
  • Non-conflicting: that is the quorum certificate for \(\langle \text{CP:PRE-VOTE},h,r,r_{cp},b \rangle\)
  • +
  • Conflicting: that consists of the justifications for the two conflicting pre-votes.
  • +
+ +

Decide Step

+ +

After collecting \(2f+1\) valid and justified main-votes, each validator examines these votes. If all +votes are for a value \(b \in \{0, 1\}\), then the validator decides \(b\), but continues to +participate in the protocol for one more round. Otherwise, the validator proceeds to the next round \(r_{cp}+1\).

+ +

Comparison

+ +

Pactus consensus protocl doesn’t have any lcoking mechanism or +checkpointing and there will at most one valid proposla per round. +This ensures that each round can begin with a new proposal.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ProtocolNormal caseFaulty case
StepsComplexityLockingCheckpointing
PBFT3$$O(n^2)$$NoYes
Tendermint3$$O(n^2)$$YesNo
HotStuff4$$O(n)$$YesNo
Pactus3$$O(n^2)$$NoNo
+ +
+ +

References:

+ + + +
+
+
+ + + + + diff --git a/ar/learn/consensus/sortition/index.html b/ar/learn/consensus/sortition/index.html new file mode 100644 index 000000000..b6a1b57c2 --- /dev/null +++ b/ar/learn/consensus/sortition/index.html @@ -0,0 +1,748 @@ + + + + + + + + + + + + + Sortition Algorithm | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Sortition Algorithm

+ +

The sortition algorithm is an important part of the Pactus blockchain, responsible for the fair, transparent +and random selection of validators to join the committee. +It utilizes a Verifiable Random Function, or VRF for short, to generate a verifiable random number.

+ +

The generated random number should be in the range of 0 to the total staked coins. +If validators can prove that their generated number is less than their stake, +they can send the sortition transaction. +Once a sortition transaction is included in a block, the validator will join the committee, +and the oldest validator in the committee will leave it.

+ +

Verifiable Random Function

+ +

Verifiable Random Function is a pseudo-random function that the owner of key \(s\) can evaluate \(v = f_s(x)\) and also provides +\(proof_{x}\) efficiently proving that \(v\) is correct. We call such a mathematical +object a verifiable pseudo-random function, VRF for brevity 1.

+ +

Pactus uses the BLS signature scheme as the source of VRF. +Since BLS signatures are unique, +the hash of a BLS signature can be used to produce a secure and verifiable random number.

+ +

The VRF takes three parameters:

+ +
    +
  1. The secret key of the validator
  2. +
  3. The sortition seed
  4. +
  5. The total stake of the blockchain.
  6. +
+ +

Once the VRF is executed, it produces an index with a proof. +The index is a number between zero and the total staked coins, and the proof allows other validators to verify the correctness +of the generated index.

+ +

The pseudocode below demonstrates the evaluation of the VRF for the sortition algorithm:

+ +\[\begin{align*} +& \textbf{function} \ VRF(sk, seed, total\_stake) \\ +& \qquad pk \gets P_{BLS}(sk) \\ +& \qquad proof \gets S_{BLS}(sk, seed \| pk) \\ +& \qquad rnd \gets H(proof) \\ +& \qquad index \gets \frac{(rnd \times total\_stake)}{2^{256}} \\ +& \qquad \\ +& \qquad \textbf{return} \ index, proof \\ +& \textbf{end function} +\end{align*}\] + +

where:

+ +
    +
  • \(sk\) is the secret key of the validator
  • +
  • \(seed\) is the sortition seed
  • +
  • \(total\_stake\) is the total stake of the blockchain
  • +
  • \(P_{BLS}\) is a cryptographic function that derives the public key from the secret key for the BLS signature
  • +
  • \(S_{BLS}\) is a cryptographic function that signs a message with the secret key for the BLS signature.
  • +
  • \(H\) is a cryptographic hash function that generates a number between \(0\)to \(2 ^{256}\)
  • +
  • \(\|\) denotes the concatenation of two values
  • +
+ +

To verify a sortition proof, both the validator’s public key and stake are required:

+ +\[\begin{align*} +& \textbf{function} \ verifyVRF(pk, seed, proof, stake, total\_stake) \\ +& \qquad \textbf{if} \ V_{BLS}(pk, seed \| pk, proof) = True \ \textbf{then} \\ +& \qquad \qquad rnd \gets H(proof) \\ +& \qquad \qquad index \gets \frac{(rnd \times total\_stake)}{2^{256}} \\ +& \qquad \\ +& \qquad \qquad \textbf{return} \ index \leqslant stake \\ +& \qquad \textbf{else} \\ +& \qquad \qquad \textbf{return} \ False \\ +& \qquad \textbf{end if} \\ +& \textbf{end function} +\end{align*}\] + +

where:

+ +
    +
  • \(V_{BLS}\) is a cryptographic function used to verify a signed message using the BLS signature scheme
  • +
+ +

There is no need to send \(index\) alongside \(proof\) because the +result should be less than the validator’s stake, and the validator’s stake is known at each block.

+ +

Sortition Seed

+ +

The sortition algorithm relies on a random and publicly verifiable seed that cannot be manipulated by adversaries. +Otherwise, adversaries may select a seed that favors the selection of corrupt users.

+ +

To prevent this, the BLS signature scheme is used to generate the sortition seed. +Since BLS signatures are unique and deterministic, adversaries cannot generate more than one valid signature per block. +In each block, the block proposer generates a new sortition seed based on the previous seed using the following function:

+ +\[\begin{align*} +& \textbf{function} \ generateSeed(sk, prev\_seed) \\ +& \qquad \textbf{return} \ S_{BLS}(sk, H(prev\_seed)) \\ +& \textbf{end function} +\end{align*}\] + +

Since the proposer’s public key is known, the seed for the next block can be easily verified. +If the seed is invalid, the proposed block will be rejected. +The verification function is as follows:

+ +\[\begin{align*} +& \textbf{function} \ verifySeed(pk, prev\_seed, seed) \\ +& \qquad \textbf{return} \ V_{BLS}(pk, H(prev\_seed), seed) \\ +& \textbf{end function} +\end{align*}\] + +

The sortition seed for the genesis block set to 0.

+ +

Sortition Probability

+ +

The Sortition probability refers to the expected number of validators that may join the committee in each block, +assuming all validators are actively online and executing the sortition algorithm.

+ +

The probability of a validator \(i\) being selected depends on their stake relative to the total stake in the system:

+ +\[p_i=\frac{S_i}{S_t}\] + +

where:

+ +
    +
  • \(p_i\) is the probability of validator \(i\) being selected
  • +
  • \(S_i\)​ is the stake of validator \(i\)
  • +
  • \(S_t\)​ is the total stake of all validators.
  • +
+ +

Therefore, the expected number of validators joining the committee at each block can be represented as:

+ +\[P=\sum_{i=1}^{n}{p_i}=\sum_{i=1}^{n}{\frac{S_i}{S_t}}=\frac{S_1+S_2+\ldots+S_n}{S_t}\] + +

where \(n\) is the total number of validators. We know that \(S_t={S_1+S_2+\ldots+S_n}\). Therefore we will have:

+ +\[P=\frac{S_t}{S_t}=1\] + +

Thus, on average, we expect one validator to join the committee at each block. +In practice, the actual number of validators joining the committee in each block +may differ due to the randomness in the sortition algorithm, or the possibility of some validators being offline.

+ +

FAQ

+ +

How is the total staked coin calculated?

+ +

The total staked coin in each block is calculated by summing the staked coins of all active validators. +An active validator is a validator that has not yet unbonded.

+ +

How is the oldest validator determined?

+ +

The height at which the validator joined the committee is recorded as the “Last Joined Height” field in +the validator structure. +The validator with the lowest “Last Joined Height” is considered the oldest.

+ + + +
+
+
+ + + + + diff --git a/ar/learn/consensus/specification/index.html b/ar/learn/consensus/specification/index.html new file mode 100644 index 000000000..e121edc06 --- /dev/null +++ b/ar/learn/consensus/specification/index.html @@ -0,0 +1,628 @@ + + + + + + + + + + + + + Consensus specification | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Consensus Specification

+ +

Developing distributed and concurrent systems is a complex task that requires careful attention to the details. +Testing such systems is challenging because it’s difficult to simulate all possible states, +including those that can happen due to system failures, network latency, and other factors. +This makes it hard to ensure that the system behaves correctly in all circumstances.

+ +

Therefore it’s essential to have a proactive approach that involves modeling the system’s behavior in a formal way. +Such an approach can help identify potential issues before they occur, saving time and preventing costly flaws.

+ +

TLA+

+ +

TLA+ is a formal specification language developed by +Leslie Lamport based on the idea of +specifying systems using simple mathematics. +It is used for designing, modelling, documentation, and verification of programs, especially concurrent and +distributed systems. +TLA+ and its tools are useful for eliminating fundamental design errors, which are hard to find and +expensive to correct in code.

+ +

To know more about TLA+, check The TLA+ Home Page.

+ +

Pactus Consensus Spec

+ +

Pactus consensus specification +has written in TLA+ format. It includes all invariants that can be held +in every state of every execution that the protocol allows. The TLA+ specification is compiled into +PDF file.

+ +

Safety Proof

+ +

By defining some invariants we can ensure the safety of the consensus +protocol in any possible and +distinct state, and therefore we have the informal safety proof of the Pactus consensus protocol using TLA+.

+ +

Liveness Proof

+ +

Checking the liveness is not easy, but with defining some constraints, we have the informal proof of +liveness of Pactus consensus protocol using TLA+.

+ +
+
+
+ + + + + diff --git a/ar/learn/index.html b/ar/learn/index.html new file mode 100644 index 000000000..d2057af6d --- /dev/null +++ b/ar/learn/index.html @@ -0,0 +1,469 @@ + + + + + + + + + + + + + تعلم | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+

تعلم

+ +

هنا يمكنك العثور على الوثائق التقنية لمشروع بكتوس.

+ +

Table Of Content

+ + + +
+
+
+
+ + + + + diff --git a/ar/learn/smart-contract/storage/index.html b/ar/learn/smart-contract/storage/index.html new file mode 100644 index 000000000..f418c96da --- /dev/null +++ b/ar/learn/smart-contract/storage/index.html @@ -0,0 +1,705 @@ + + + + + + + + + + + + + Storage as file | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Storage as file

+ +

Motivation

+ +

Ethereum friendly blockchains keep storage in a separate key/value database per request. This has +some drawbacks:

+ +
    +
  • Since there is a global database that stores all storages, the storage key is a combination of +\(Key_{contract} + Key_{item}\) that is a bit messy.
  • +
  • Storage data can’t have any meta data, because they are scattered in different places in the +key/value database.
  • +
  • Storages per smart contract can’t be Merklized. Ethereum came with another solution to calculate +the hash of the whole storage. They defined a hexary Patricia tree that is quite +suboptimal.
  • +
+ +

Here we discuss how we can address the above issues by dedicating a separate file as Storage +File per smart contract. In this scenario, users should purchase the storage file with required +capacity before deploying the smart contract. Once the purchase is done, a separate empty file will +be created and dedicated for the user. The size of the file is the same as the purchase size. For +example users can purchase 10 MB or 120 MB of storage files depending on their need and renew them +yearly.

+ +

Structure

+ +

Each storage file has three parts: Header, ByteCodes and contract storage.

+ +

Storage file structure

+ +

The Header of the storage file keeps some meta data like storage file index, last payment time, +total storage size, etc. In the ByteCodes section the byte codes of the smart contract will be saved +and in the storage section, the actual storage of the smart contract will be stored.

+ +

Storage APIs

+ +

Smart contracts can only change data in storage sections. To achieve that the smart contract +executer (virtual machine) should introduce these APIs:

+ +
/// This API requests the host to read the slice of `data` from the storage file
+/// at the given `offset`.
+fn read(&self, offset: u32, data: &mut [u8]) -> Result<(), HostError>;
+
+/// This API requests the host to write the slice of `data` into the storage file
+/// at the given `offset`
+fn write(&self, offset: u32, data: &[u8]) -> Result<(), HostError>;
+
+
+ +

These APIs are similar to SLoad and SStore opcodes in Ethereum Virtual Machine (EVM). But +instead of key and value, they accept offset and data parameters.

+ +

Storage Allocation

+ +

In order to allocate storage space safely and efficiently user can use these predefined methods:

+ +
/// Allocates storage space with the specific `length` and returns the
+/// offset of allocated space in the storage file.
+pub fn allocate(&self, length: u32) -> Result<Offset, Error>;
+
+/// Deallocates the storage space at the specific `offset` and `length`
+pub fn deallocate(&self, offset: Offset, length: u32) -> Result<(), Error>;
+
+ +

Storage Stack

+ +

There is a fixed stack with 32 elements at the beginning of the storage . The first item in this +stack is reserved and used for managing deallocated storage spaces. Users can use other stack items +to keep the offset of the allocated spaces for the smart contract variables.

+ +

Storage stack

+ +

Data Collections

+ +

Usually in smart contracts developers are interested in data collections like Search Trees or Hash +Tables to look up values by the associated keys. Most programming languages come up with some +builtin collections, however we can’t use them in smart contracts because they use RAM that is +inconsistent. However we can have storage equivalent of these data collections that instead of +dealing with memory they are dealing with the storage file. You can naively consider storage as +dedicated consistent memory for the smart contract.

+ +

Right now these data collection is available to use inside the smart contract: StorageVector, +StorageString, StorageLinkedList, StorageBST and StorageHasTable.

+ + + +

Merklizing Storage

+ +

To make sure all the nodes have the same state we need to calculate the hash of all storage files. +Merkle tree can help us to easily calculate the root hash very fast. We need two Merkle trees, one +for calculating the root hash of each storage file and the second for calculating the root hash of +all storage files.

+ +

Single storage file Merkle tree

+ +

We can divide each file into small chunks of data and calculate the hash of each chunk once. Since +we know exactly which chunk has changed after executing the smart, contract we can easily +reconstruct the tree and calculate the merkle root again.

+ +

Whole storage Merkle tree

+ +

Each file has a unique index. With using that index we can make sure that the position of the leaf +nodes in the Merkle tree is always the same. The same technique we used for calculating the +state hash.

+ +

Storage Merkle tree

+ +

Example

+ +

As an example we have implemented the ERC20 smart contract based on this idea. The implementation +can be found here

+ +

Testing

+ +

One of the consequences of Storage as File is that testing smart contracts becomes easier. What we +need is only to mock the storage file.

+ +
+
+
+ + + + + diff --git a/ar/learn/transaction/bond/index.html b/ar/learn/transaction/bond/index.html new file mode 100644 index 000000000..c8c8dec6f --- /dev/null +++ b/ar/learn/transaction/bond/index.html @@ -0,0 +1,636 @@ + + + + + + + + + + + + + Bond Transaction | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Bond Transaction

+ +

Bond transaction is used to bond stake to a validator. +If the validator does not exist, it will be created. +Once a bond transaction committed, the validator cannot participate in the +sortition algorithm for 1 hour. +This is called the “bond interval” and is defined in the +consensus parameter.

+ +

Payload Structure

+ +

The bond transaction has a payload consists the following fields:

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
SizeField
21 bytesSender address
21 bytesReceiver address
96 bytes (optional)Public key
8 bytesAmount
+ +
    +
  • Sender address is the address of the sender account.
  • +
  • Receiver address is the address of the receiver validator.
  • +
  • Public key is the validator’s public key. If the validator does not exist yet, +the public key should be set, otherwise it should left empty.
  • +
  • Amount is the amount of coins that should be staked or bonded.
  • +
+ +
+
+
+ + + + + diff --git a/ar/learn/transaction/fee/index.html b/ar/learn/transaction/fee/index.html new file mode 100644 index 000000000..012c7058c --- /dev/null +++ b/ar/learn/transaction/fee/index.html @@ -0,0 +1,638 @@ + + + + + + + + + + + + + Transaction Fee | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Transaction Fee

+ +

Transaction fees in the Pactus blockchain are calculated using a percentage-based fee model. +The fee is a percentage of the transferred amount, within a minimum and maximum range. +The percentage, minimum fee, and maximum fee parameters are part of the blockchain +consensus parameters.

+ +

The formula to calculate the transaction fee is as follows:

+ + + +\[\begin{align*} +fee = amount \times percentage \\ +\\ +fee = +\begin{cases} + & fee_{min} & \textbf{ if } \ fee < fee_{min} \\ + & \\ + & fee_{max} & \textbf{ if } \ fee > fee_{max} \\ + & \\ + & fee & \textbf{otherwise} + \end{cases} +\end{align*}\] + +

Examples

+ +

Currently, the fee fraction or percentage is set to 0.01%, the minimum fee is set to 0.000,001 coin, +and the maximum fee is set to 0.001 coin.

+ +
    +
  • If Alice wants to transfer 2 coins to Bob, she needs to pay 0.000,2 coins as transaction fee.
  • +
  • If Alice wants to transfer 0.000,2 coins to Bob, she needs to pay 0.000,001 coins as transaction fee.
  • +
  • If Alice wants to transfer 20 coins to Bob, she needs to pay 0.001 coins as transaction fee.
  • +
+ +
+
+
+ + + + + diff --git a/ar/learn/transaction/format/index.html b/ar/learn/transaction/format/index.html new file mode 100644 index 000000000..78cface3f --- /dev/null +++ b/ar/learn/transaction/format/index.html @@ -0,0 +1,675 @@ + + + + + + + + + + + + + Transaction Format | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Transaction Format

+ +

Transactions in Pactus consists the following fields:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SizeField
1 byteVersion
4 bytesLock Time
8 bytesFee
VariantMemo
1 bytePayload Type
VariantPayload Data
48 bytesSignature
96 bytesPublic Key
+ +
    +
  • Version is the version of the transaction format. Different versions may have different fields or +a different layout, and the current transaction version is set to 1.
  • +
  • Lock Time specifies the block number at which the transaction can be unlocked.
  • +
  • Fee contains the fee paid by the sender to the network for processing the transaction. +The fee is calculated based on the percentage fee model.
  • +
  • Memo is an optional message that can be included in the transaction. +The message can be used to provide additional information about the transaction or to communicate with the recipient. +The maximum size of the memo is 64 characters that is defined in the +consensus parameters
  • +
  • Payload Type specifies the type of the transaction payload. +Depending on the payload type, the payload data field is decoded differently.
  • +
  • Payload Data contains the actual data payload of the transaction. +The payload data varies depending on the payload type.
  • +
  • Signature contains a cryptographic signature created by the sender using their private key. +The signature is used to ensure that the transaction has not been tampered with and that it was indeed created by the sender.
  • +
  • Public Key contains the public key of the sender. +The public key is used to verify that the sender has the authority to create the transaction. +The sender’s address should be derived from this public key.
  • +
+ +

Payload Type

+ +

The payload type field determines the format of the payload data field in the transaction. +Different payload types have different formats for the payload data. +The following are the supported transactions in Pactus blockchain:

+ +
    +
  1. Transfer transaction
  2. +
  3. Bond transaction
  4. +
  5. Sortition transaction
  6. +
  7. Unbond transaction
  8. +
  9. Withdraw transaction
  10. +
+ +

Transaction ID

+ +

The Transaction ID is a unique identifier for a transaction on the blockchain. +It is generated by taking the hash of the transaction data without including the public key and signature fields.

+ +
+
+
+ + + + + diff --git a/ar/learn/transaction/sortition/index.html b/ar/learn/transaction/sortition/index.html new file mode 100644 index 000000000..91fb783a7 --- /dev/null +++ b/ar/learn/transaction/sortition/index.html @@ -0,0 +1,626 @@ + + + + + + + + + + + + + Sortition Transaction | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Sortition Transaction

+ +

Sortition transaction is used to enter a validator +in the committee. +By committing a sortition transaction, the validator will enter the committee. +Sortition transactions are valid for 7 blocks, which is defined as “sortition interval” in the +consensus parameters.

+ +

Payload Structure

+ +

The sortition transaction has a payload consists the following fields:

+ + + + + + + + + + + + + + + + + + +
SizeField
21 bytesAddress
48 bytesSortition Proof
+ +
    +
  • Address is the address of the validator that evaluated the sortition
  • +
  • Sortition Proof is the proof of evaluating the sortition
  • +
+ +

Validators do not need to pay a fee for sortition transactions, and the fee should be set to zero.

+ +
+
+
+ + + + + diff --git a/ar/learn/transaction/transfer/index.html b/ar/learn/transaction/transfer/index.html new file mode 100644 index 000000000..4815df29e --- /dev/null +++ b/ar/learn/transaction/transfer/index.html @@ -0,0 +1,640 @@ + + + + + + + + + + + + + Transfer Transaction | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Transfer Transaction

+ +

Transfer transaction is used to transfer coins between the accounts. +If the receiver account does not exist, it will be created.

+ +

Payload Structure

+ +

The transfer transaction has a payload consists the following fields:

+ + + + + + + + + + + + + + + + + + + + + + +
SizeField
21 bytesSender address
21 bytesReceiver address
8 bytesAmount
+ +
    +
  • Sender address is the account address that transfers the amount
  • +
  • Receiver address is the account address that receives the amount
  • +
  • Amount is the amount of coins that should be transferred
  • +
+ +

Reward Transaction

+ +

The reward transaction is the first transaction in each block. There is only one reward transaction +per block, and it has the same format as a transfer transaction, but with zero fees and no signature.

+ +

The sender address is the Treasury address, +and the receiver address is defined by the block proposer. +The amount of the reward transaction should be equal to the +block reward plus transaction fees. +This amount will go to the proposer account as a block reward. +Therefore, in each block, one coin from the +Treasury account transfers to +the proposer account as a block reward.

+ +
+
+
+ + + + + diff --git a/ar/learn/transaction/unbond/index.html b/ar/learn/transaction/unbond/index.html new file mode 100644 index 000000000..a7339b6c3 --- /dev/null +++ b/ar/learn/transaction/unbond/index.html @@ -0,0 +1,617 @@ + + + + + + + + + + + + + Unbond Transaction | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Unond Transaction

+ +

Unbond transaction is used to unbond a validator. +An unbonded validator cannot participate in the sortition algorithm anymore, and after 21 days, the stake can be withdrawn. +This is called the “unbond interval” and is defined in the consensus parameter.

+ +

Payload Structure

+ +

The unbond transaction has a payload consists the following field:

+ + + + + + + + + + + + + + +
SizeField
21 bytesValidator address
+ +
    +
  • Validator address is the address of validator that is unbonded.
  • +
+ +
+
+
+ + + + + diff --git a/ar/learn/transaction/withdraw/index.html b/ar/learn/transaction/withdraw/index.html new file mode 100644 index 000000000..cf95786f9 --- /dev/null +++ b/ar/learn/transaction/withdraw/index.html @@ -0,0 +1,626 @@ + + + + + + + + + + + + + Withdraw Transaction | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

Withdraw Transaction

+ +

Withdraw transaction is used to withdraw the staked coins from an unbonded +validator

+ +

Payload Structure

+ +

The withdraw transaction has a payload consists the following fields:

+ + + + + + + + + + + + + + + + + + + + + + +
SizeField
21 bytesSender address
21 bytesReceiver address
8 bytesAmount
+ +
    +
  • Sender address is the address of the sender validator.
  • +
  • Receiver address is the address of the receiver account.
  • +
  • Amount is the amount of coins that should be withdrawn
  • +
+ +
+
+
+ + + + + diff --git a/ar/mstile-150x150.png b/ar/mstile-150x150.png new file mode 100644 index 000000000..187b08cc8 Binary files /dev/null and b/ar/mstile-150x150.png differ diff --git a/ar/robots.txt b/ar/robots.txt new file mode 100644 index 000000000..0097513b3 --- /dev/null +++ b/ar/robots.txt @@ -0,0 +1 @@ +Sitemap: https://pactus.org/sitemap.xml diff --git a/ar/safari-pinned-tab.svg b/ar/safari-pinned-tab.svg new file mode 100644 index 000000000..43c436d31 --- /dev/null +++ b/ar/safari-pinned-tab.svg @@ -0,0 +1,27 @@ + + + + +Created by potrace 1.14, written by Peter Selinger 2001-2017 + + + + + diff --git a/ar/site.webmanifest b/ar/site.webmanifest new file mode 100644 index 000000000..c00b17332 --- /dev/null +++ b/ar/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-256x256.png", + "sizes": "256x256", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/ar/sitemap.xml b/ar/sitemap.xml new file mode 100644 index 000000000..c8089a7bd --- /dev/null +++ b/ar/sitemap.xml @@ -0,0 +1,217 @@ + + + +https://pactus.org/2022/08/29/dev-meeting.html +2022-08-29T00:00:00+00:00 + + +https://pactus.org/2022/09/04/dev-meeting.html +2022-09-04T00:00:00+00:00 + + +https://pactus.org/2022/09/18/dev-meeting.html +2022-09-18T00:00:00+00:00 + + +https://pactus.org/2022/09/20/release-0-9-0.html +2022-09-20T00:00:00+00:00 + + +https://pactus.org/2022/09/24/testnet-0-launched.html +2022-09-24T00:00:00+00:00 + + +https://pactus.org/2022/10/30/dev-meeting.html +2022-10-30T00:00:00+00:00 + + +https://pactus.org/2022/11/24/release-0-9-1.html +2022-11-24T00:00:00+00:00 + + +https://pactus.org/2023/03/01/what-is-testnet.html +2023-03-01T00:00:00+00:00 + + +https://pactus.org/2023/04/21/testnet-0-concluded.html +2023-04-21T00:00:00+00:00 + + +https://pactus.org/2023/05/08/release-0-10-0.html +2023-05-08T00:00:00+00:00 + + +https://pactus.org/2023/05/09/testnet-1-launched.html +2023-05-09T00:00:00+00:00 + + +https://pactus.org/2023/05/29/release-0-11-0.html +2023-05-29T00:00:00+00:00 + + +https://pactus.org/2023/06/19/release-0-12-0.html +2023-06-19T00:00:00+00:00 + + +https://pactus.org/2023/07/01/release-0-13-0.html +2023-07-01T00:00:00+00:00 + + +https://pactus.org/2023/07/05/testnet-500-validators.html +2023-07-05T00:00:00+00:00 + + +https://pactus.org/2023/07/09/dev-meeting.html +2023-07-09T00:00:00+00:00 + + +https://pactus.org/2023/08/01/testnet-1-concluded.html +2023-08-01T00:00:00+00:00 + + +https://pactus.org/2023/08/22/dev-report.html +2023-08-22T00:00:00+00:00 + + +https://pactus.org/2023/09/04/introduction-to-pips.html +2023-09-04T00:00:00+00:00 + + +https://pactus.org/2023/09/24/dev-report-pre-testnet-2.html +2023-09-24T00:00:00+00:00 + + +https://pactus.org/2023/09/28/how-sspos-works-in-simple-word.html +2023-09-28T00:00:00+00:00 + + +https://pactus.org/2023/10/15/release-0-15-0.html +2023-10-15T00:00:00+00:00 + + +https://pactus.org/2023/10/15/testnet-2-launched.html +2023-10-15T00:00:00+00:00 + + +https://pactus.org/2023/10/21/release-0-15-1.html +2023-10-21T00:00:00+00:00 + + +https://pactus.org/2023/10/21/release-0-15-2.html +2023-10-21T00:00:00+00:00 + + +https://pactus.org/blog/ + + +https://pactus.org/ + + +https://pactus.org/contributing/ + + +https://pactus.org/community/ + + +https://pactus.org/download/ + + +https://pactus.org/learn/blockchain/cryptography/ + + +https://pactus.org/learn/blockchain/state-hash/ + + +https://pactus.org/learn/blockchain/incentive/ + + +https://pactus.org/learn/blockchain/serialization/ + + +https://pactus.org/learn/blockchain/account/ + + +https://pactus.org/learn/blockchain/block/ + + +https://pactus.org/learn/blockchain/address/ + + +https://pactus.org/learn/blockchain/genesis/ + + +https://pactus.org/learn/blockchain/validator/ + + +https://pactus.org/learn/consensus/protocol/ + + +https://pactus.org/learn/consensus/parameters/ + + +https://pactus.org/learn/consensus/committee/ + + +https://pactus.org/learn/consensus/sortition/ + + +https://pactus.org/learn/consensus/specification/ + + +https://pactus.org/learn/consensus/proof-of-stake/ + + +https://pactus.org/learn/transaction/withdraw/ + + +https://pactus.org/learn/transaction/fee/ + + +https://pactus.org/learn/transaction/transfer/ + + +https://pactus.org/learn/transaction/format/ + + +https://pactus.org/learn/transaction/sortition/ + + +https://pactus.org/learn/transaction/bond/ + + +https://pactus.org/learn/transaction/unbond/ + + +https://pactus.org/learn/smart-contract/storage/ + + +https://pactus.org/learn/ + + +https://pactus.org/user-guides/use-wallet-cli/ + + +https://pactus.org/user-guides/run-pactus-cli/ + + +https://pactus.org/user-guides/run-pactus-docker/ + + +https://pactus.org/user-guides/run-pactus-gui/ + + +https://pactus.org/user-guides/send-transactions-gui/ + + +https://pactus.org/user-guides/ + + +https://pactus.org/about/roadmap/ + + +https://pactus.org/about/faq/ + + +https://pactus.org/about/what-is-pactus/ + + diff --git a/ar/user-guides/index.html b/ar/user-guides/index.html new file mode 100644 index 000000000..6421431e0 --- /dev/null +++ b/ar/user-guides/index.html @@ -0,0 +1,358 @@ + + + + + + + + + + + + + دلائل المستخدم | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+ +
+
+
+ + + + + diff --git a/ar/user-guides/run-pactus-cli/index.html b/ar/user-guides/run-pactus-cli/index.html new file mode 100644 index 000000000..46b0f03e3 --- /dev/null +++ b/ar/user-guides/run-pactus-cli/index.html @@ -0,0 +1,511 @@ + + + + + + + + + + + + + كيفية تشغيل بكتوس في وضع سطر الأوامر؟ | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

كيفية تشغيل بكتوس في وضع سطر الأوامر؟

+ +

Preface

+ +

Pactus can be run in different modes, including the command-line interface (CLI) and the graphical user interface (GUI). +This tutorial will guide you through the steps to run Pactus in CLI mode, suitable for advanced users.

+ +

Prerequisites

+ +

Before proceeding with the steps below, ensure that you have the following:

+ +
    +
  • A computer running Windows, macOS, or Linux
  • +
  • Suitable internet connection
  • +
+ +

Download

+ +

To get started, download and extract the Pactus CLI file from +here.

+ +

Initializing the node

+ +

Now you need to create a wallet and setup a working directory for your node. +A working directory is a place where you save blockchain data and wallets. +Open the Terminal and run the following command:

+ + +
+ +
+ +
./pactus-daemon init -w ~/pactus --testnet
+
+ +

This command creates your wallet and setup the working working directory at ~/pactus.

+ + +
+ +
+ +
./pactus-daemon init -w ~/pactus --testnet
+
+ +

This command creates your wallet and setup the working working directory at ~/pactus.

+ + +
+ +
+ +
pactus-daemon.exe init -w c:\pactus --testnet
+
+ +

This command creates your wallet and setup the working working directory at c:\pactus.

+ + +
+ +
+ +

Make sure you write down your 12-word mnemonic on a piece of paper to recover your wallet in the future +in case your computer is lost, damaged, or stolen.

+ +

The working directory contains:

+ +
    +
  • Default wallet
  • +
  • Genesis file
  • +
  • Config file
  • +
+ +

Feel free to take a look at these files.

+ +

Running the node

+ +

Now you can start the node and sync with the network. Run the following command in the Terminal:

+ + +
+ +
+ +
./pactus-daemon start -w ~/pactus
+
+ + +
+ +
+ +
./pactus-daemon start -w ~/pactus
+
+ + +
+ +
+ +
pactus-daemon.exe start -w c:\pactus
+
+ + +
+ +
+ +

When the Pactus node starts running, it begins syncing with the network. +This process may take some time, as your node needs to download and verify the entire blockchain history. +Please be patient while your node syncs.

+ +

To become a validator and participate in the +consensus algorithm to earn rewards, you first need to +stake some coins. In the next +tutorial, +we will explain how to send a Bond transaction to become a validator.

+ +
+ +

By running a Pactus node, you contribute to the decentralization and security of the Pactus blockchain network. +Thank you for your participation!

+ + + + + +
+
+
+
+ + + + + diff --git a/ar/user-guides/run-pactus-docker/index.html b/ar/user-guides/run-pactus-docker/index.html new file mode 100644 index 000000000..fe96e7a28 --- /dev/null +++ b/ar/user-guides/run-pactus-docker/index.html @@ -0,0 +1,526 @@ + + + + + + + + + + + + + كيفية تشغيل بكتوس باستخدام دوكر؟ | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

كيفية تشغيل بكتوس باستخدام دوكر؟

+ + +

Preface

+ +

Docker is a tool that simplifies the process of creating, deploying, and running applications using containers. +With containers, developers can bundle all the necessary parts of an application, including libraries and dependencies, +and deploy them as a single package.

+ +

In this document, we will guide you on how to run Pactus using Docker, step by step.

+ +

Prerequisites

+ +

The only thing you need is installing docker in your machine. +If you are using Windows please make sure you have installed WSL.

+ +

Docker Images

+ +

The Pactus docker images are available at Docker Hub. +You can pull the latest image with this command:

+ +
docker pull pactus/pactus
+
+ +

Initializing the node

+ +

Now you need to create a wallet and setup a working directory for your node. +A working directory is a place where you save blockchain data and wallets. +Open the Terminal and run the following command:

+ + +
+ +
+ +
docker run -it --rm -v ~/pactus/testnet:/pactus pactus/pactus init -w /pactus --testnet
+
+ +

This command creates your wallet and setup the working working directory at ~/pactus/testnet.

+ + +
+ +
+ +
docker run -it --rm -v ~/pactus/testnet:/pactus pactus/pactus init -w /pactus --testnet
+
+ +

This command creates your wallet and setup the working working directory at ~/pactus/testnet.

+ + +
+ +
+ +
docker run -it --rm -v c:\pactus\testnet:/pactus pactus/pactus init -w /pactus --testnet
+
+ +

This command creates your wallet and setup the working working directory at c:\pactus\testnet.

+ + +
+ +
+ +

Make sure you write down your 12-word mnemonic on a piece of paper to recover your wallet in the future +in case your computer is lost, damaged, or stolen.

+ +

The working directory contains:

+ +
    +
  • Default wallet
  • +
  • Genesis file
  • +
  • Config file
  • +
+ +

Feel free to take a look at these files.

+ +

Running the node

+ +

Now you can start the node and sync with the network. Run the following command in the Terminal:

+ + +
+ +
+ +
docker run -it -v ~/pactus/testnet:/pactus -p 8080:8080 -p 21777:21777 --name pactus-testnet pactus/pactus start -w /pactus
+
+ + +
+ +
+ +
docker run -it -v ~/pactus/testnet:/pactus -p 8080:8080 -p 21777:21777 --name pactus-testnet pactus/pactus start -w /pactus
+
+ + +
+ +
+ +
docker run -it -v c:\pactus\testnet:/pactus -p 8080:8080 -p 21777:21777 --name pactus-testnet pactus/pactus start -w /pactus
+
+ + +
+ +
+ +

To run pactus-testnet in background just add a -d flag in the command.

+ +

Hint: Remember to pass in your wallet passphrase as well with -p flag after /pactus.

+ +
docker run -it -v ~/pactus/testnet:/pactus -p 8080:8080 -p 21777:21777 -d --name pactus-testnet pactus/pactus start -w /pactus -p {YOUR_PASSPHRASE}
+
+ +
docker run -it -v c:\pactus\testnet:/pactus -p 8080:8080 -p 21777:21777 -d --name pactus-testnet pactus/pactus start -w /pactus -p {YOUR_PASSPHRASE}
+
+ +

You can stop/start docker:

+ +
docker stop pactus-testnet
+docker start pactus-testnet
+
+ +

Or check the logs:

+ +
docker logs pactus-testnet --tail 1000 -f
+
+ +
+ +

By running a Pactus node, you contribute to the decentralization and security of the Pactus blockchain network. +Thank you for your participation!

+ + + + + +
+
+
+
+ + + + + diff --git a/ar/user-guides/run-pactus-gui/code_certificate_warning.png b/ar/user-guides/run-pactus-gui/code_certificate_warning.png new file mode 100644 index 000000000..029a877ff Binary files /dev/null and b/ar/user-guides/run-pactus-gui/code_certificate_warning.png differ diff --git a/ar/user-guides/run-pactus-gui/default_wallet.png b/ar/user-guides/run-pactus-gui/default_wallet.png new file mode 100644 index 000000000..c2209565b Binary files /dev/null and b/ar/user-guides/run-pactus-gui/default_wallet.png differ diff --git a/ar/user-guides/run-pactus-gui/index.html b/ar/user-guides/run-pactus-gui/index.html new file mode 100644 index 000000000..eb8cb6312 --- /dev/null +++ b/ar/user-guides/run-pactus-gui/index.html @@ -0,0 +1,491 @@ + + + + + + + + + + + + + كيفية تشغيل بكتوس في الوضع الرسومي؟ | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

كيفية تشغيل بكتوس في الوضع الرسومي؟

+ +

Preface

+ +

Pactus can be run in different modes, including the command-line interface (CLI) and the graphical user interface (GUI). +This tutorial will guide you through the steps to run Pactus in GUI mode, suitable for beginner to advanced users.

+ +

Prerequisites

+ +

Before proceeding with the steps below, ensure that you have the following:

+ +
    +
  • A computer running Windows, macOS, or Linux
  • +
  • Suitable internet connection
  • +
+ +

Download

+ +

Download the Pactus GUI installer or archived file from +here.

+ +

Code certificate issue

+ +

Windows and macOS users may encounter a warning message stating that Pactus is an untrusted application. +This is because Pactus does not have a +code signing certificate.

+ +

Code certificate issue

+ +

A code certificate is a digital signature that verifies the identity and authenticity of the software publisher. +However, obtaining a code certificate is complex and expensive process, and requires registering a company and +passing Know Your Customer (KYC) checks.

+ +

As Pactus is an open-source and community-based application, we don’t have a code certificate yet. +Therefore, you can safely ignore the warning message and proceed with installing Pactus.

+ +

Installing

+ +

To install Pactus GUI, simply follow the on-screen instructions provided by the installer. +The process is straightforward and similar to installing any other application on your computer.

+ +

Installing Pactus

+ +

Initializing

+ +

When you run Pactus for the first time, a wizard dialog will appear to guide you through the wallet creation and +initialization process. This process consists of several steps:

+ +

Initialize mode

+ +

On the first page, you will ask you how you want to create your wallet. +Select the option to “Create a new wallet from scratch” and proceed to the next page.

+ +

Initialize mode

+ +

Wallet seed

+ +

The next page will display your wallet seed phrase, which consists of 12 words. +It is essential to securely back up this seed phrase, as it is required for wallet recovery +in case your computer is lost, damaged, or stolen.

+ +

Wallet seed

+ +

Warning: Keep your wallet seed phrase private and secure. +If someone else gains access to your seed phrase, they can control your wallet and funds.

+ +

Seed confirmation

+ +

In this step, you will be asked to confirm your seed phrase. +Input the 12 words you received in the previous step into the dialog. +If the seed phrase is entered correctly, you will be able to proceed to the next page.

+ +

Seed confirmation

+ +

Wallet password

+ +

On this page, you will be asked to set a password for your wallet. +Enter a strong password in the first dialog box and confirm it in the second one. +This password will be used to encrypt your wallet and protect it from unauthorized access.

+ +

Set wallet password

+ +

Note: Choose a strong password and keep it safe. +If you forget or lose your password, you will need your seed phrase to regain access to your wallet.

+ +

Number of validators

+ +

Each node in the Pactus blockchain can run up to 32 validators, and each validator can stake up to +1000 coins. Here, you can define how many validators you want to create for your node. +Select the number of validators based on the amount of coins you want to stake.

+ +

Number of validators

+ +

If you want to stake more than 32,000 coins, you need to set up a new node.

+ +

Node information

+ +

The last page of the initialization process shows the node information, such as the working directory, validator address, +and reward address. Review this information and click “Close” to complete the initialization process.

+ +

Node information

+ +

Upon closing the wizard dialog, your Pactus node will start running. You are now ready to use Pactus in GUI mode.

+ +

Running the Pactus Node

+ +

After completing the initialization process, you are ready to run the Pactus node. +Running a Pactus node allows you to synchronize with the network, enabling you to view and manage your wallet and +sending transactions.

+ +

Syncing with the Network

+ +

When the Pactus node starts running, it begins syncing with the network. This process may take some time, +as your node needs to download and verify the entire blockchain history. +Please be patient while your node syncs.

+ +

Syncing progress

+ +

Default Wallet

+ +

You can check the “Default Wallet” tab to access your wallet information. Please note that the displayed +information may not be accurate until the syncing process is complete.

+ +

Default Wallet tab

+ +

In the “Default Wallet” tab, you can view your account details, including your balance and +address information such as the validator and reward addresses. +Your computer acts as a node and is recognized by the validator address in the Pactus network. +The reward address is the account address where you collect the +rewards earned by participating in +the consensus algorithm and proposing new blocks.

+ +

To become a validator and participate in the +consensus algorithm to earn rewards, you first need to +stake some coins. In the next +tutorial, +we will explain how to send a Bond transaction to become a validator.

+ +
+ +

By running a Pactus node, you contribute to the decentralization and security of the Pactus blockchain network. +Thank you for your participation!

+ + + + + +
+
+
+
+ + + + + diff --git a/ar/user-guides/run-pactus-gui/initialize_mode.png b/ar/user-guides/run-pactus-gui/initialize_mode.png new file mode 100644 index 000000000..757a9518c Binary files /dev/null and b/ar/user-guides/run-pactus-gui/initialize_mode.png differ diff --git a/ar/user-guides/run-pactus-gui/installing.png b/ar/user-guides/run-pactus-gui/installing.png new file mode 100644 index 000000000..9025ff728 Binary files /dev/null and b/ar/user-guides/run-pactus-gui/installing.png differ diff --git a/ar/user-guides/run-pactus-gui/node_information.png b/ar/user-guides/run-pactus-gui/node_information.png new file mode 100644 index 000000000..6c9ed7e28 Binary files /dev/null and b/ar/user-guides/run-pactus-gui/node_information.png differ diff --git a/ar/user-guides/run-pactus-gui/number_of_validators.png b/ar/user-guides/run-pactus-gui/number_of_validators.png new file mode 100644 index 000000000..4b97ca1b4 Binary files /dev/null and b/ar/user-guides/run-pactus-gui/number_of_validators.png differ diff --git a/ar/user-guides/run-pactus-gui/seed_confirmation.png b/ar/user-guides/run-pactus-gui/seed_confirmation.png new file mode 100644 index 000000000..f6a644547 Binary files /dev/null and b/ar/user-guides/run-pactus-gui/seed_confirmation.png differ diff --git a/ar/user-guides/run-pactus-gui/syncing_progress.png b/ar/user-guides/run-pactus-gui/syncing_progress.png new file mode 100644 index 000000000..1ec329253 Binary files /dev/null and b/ar/user-guides/run-pactus-gui/syncing_progress.png differ diff --git a/ar/user-guides/run-pactus-gui/wallet_password.png b/ar/user-guides/run-pactus-gui/wallet_password.png new file mode 100644 index 000000000..c17c3b30c Binary files /dev/null and b/ar/user-guides/run-pactus-gui/wallet_password.png differ diff --git a/ar/user-guides/run-pactus-gui/wallet_seed.png b/ar/user-guides/run-pactus-gui/wallet_seed.png new file mode 100644 index 000000000..9f000acd8 Binary files /dev/null and b/ar/user-guides/run-pactus-gui/wallet_seed.png differ diff --git a/ar/user-guides/send-transactions-gui/bond-transaction-dialog.png b/ar/user-guides/send-transactions-gui/bond-transaction-dialog.png new file mode 100644 index 000000000..4c06bcea4 Binary files /dev/null and b/ar/user-guides/send-transactions-gui/bond-transaction-dialog.png differ diff --git a/ar/user-guides/send-transactions-gui/index.html b/ar/user-guides/send-transactions-gui/index.html new file mode 100644 index 000000000..fc2199698 --- /dev/null +++ b/ar/user-guides/send-transactions-gui/index.html @@ -0,0 +1,396 @@ + + + + + + + + + + + + + كيفية إرسال المعاملات في الوضع الرسومي؟ | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

كيفية إرسال المعاملات في الوضع الرسومي؟

+ +

Preface

+ +

The Pactus Blockchain offers a Graphical User Interface (GUI) that comes with a built-in wallet to create, +sign and broadcast transactions. +This tutorial aims to guide you step-by-step on how to use the GUI application to send transactions to the Pactus blockchain. +Whether you are a beginner or an advanced user, this tutorial is suitable for you.

+ +

Prerequisites

+ +

Before we begin, you’ll need to run the Pactus GUI application and ensure that it is synced with the network. +You can find detailed instructions on how to do this in the following tutorial.

+ +

Sending a Transfer Transaction

+ +

To send a transfer transaction, click on the “Transaction” menu and +select “Transfer.” +This will bring up a new window where you can select the +account address from which you wish to send the transfer, +as well as the recipient’s account address and the amount you wish to send.

+ +

After reviewing the transaction details and ensuring that they are correct, +click on the “Send” button to sign and broadcast the transaction to the Pactus blockchain.

+ +

Transfer Transaction Dialog

+ +

It’s important to note that the transaction fee +will be calculated based on the amount you’re sending.

+ +

Sending a Bond Transaction

+ +

To send a bond transaction, navigate to the “Transaction” menu +and select “Bond.” +A new window will appear where you can select the account address from which you wish to send the bond transaction, +as well as the validator address of the recipient and +the amount you wish to stake.

+ +

If the validator address is not already registered on the Pactus blockchain, you will need to provide the +validator’s public key as the first staking transaction will create the validator on the Pactus blockchain. +To obtain the public key, you can right-click on the validator’s address in your wallet +and select “Details.”

+ +

Bond Transaction Dialog

+ +

It’s important to note that the transaction fee +will be calculated based on the amount you’re sending.

+ + + + + +
+
+
+
+ + + + + diff --git a/ar/user-guides/send-transactions-gui/transfer-transaction-dialog.png b/ar/user-guides/send-transactions-gui/transfer-transaction-dialog.png new file mode 100644 index 000000000..3dddf68a3 Binary files /dev/null and b/ar/user-guides/send-transactions-gui/transfer-transaction-dialog.png differ diff --git a/ar/user-guides/use-wallet-cli/index.html b/ar/user-guides/use-wallet-cli/index.html new file mode 100644 index 000000000..ea293a239 --- /dev/null +++ b/ar/user-guides/use-wallet-cli/index.html @@ -0,0 +1,1111 @@ + + + + + + + + + + + + + كيفية استخدام المحفظة في وضع سطر الأوامر؟ | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

كيفية استخدام المحفظة في وضع سطر الأوامر؟

+ +

Preface

+ +

The Pactus Blockchain provides a wallet application that allows users to interact with the Pactus blockchain +without the need to run a node. +This is ideal for users who do not wish to operate a node but still want to create a personal wallet to manage their funds. +This tutorial will guide you step-by-step on how to use the wallet application.

+ +

Download

+ +

To get started, download and extract the Pactus CLI file from +here.

+ +
+ +

Wallet commands

+ +

In this section, we will explore various wallet commands that help you create, manage, +and recover your Pactus wallet.

+ +

Create a wallet

+ +

First, you need to create a wallet. To create a new wallet, run the following command:

+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 create
+
+ +

This command creates a new wallet and store it in the ~/pactus/wallets/wallet_1.

+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 create
+
+ +

This command creates a new wallet and store it in the ~/pactus/wallets/wallet_1.

+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\wallet_1 create --testnet
+
+ +

This command creates a new wallet and save it in the c:\pactus\wallets\wallet_1 directory. +This command creates a new wallet and store it in the c:\pactus\wallets\wallet_1.

+ + +
+ +
+ +

Don’t forget to back up your wallet seed, as it allows you to recover your wallet if you lose it.

+ +

Wallet password

+ +

You can change the wallet password by tunning this command:

+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 password
+
+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 password
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\wallet_1 password
+
+ + +
+ +
+ +

If you forget your password, you can still recover your wallet using the wallet seed.

+ +

Wallet seed

+ +

You can obtain the wallet seed by running this command:

+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 seed
+
+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 seed
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\wallet_1 seed
+
+ + +
+ +
+ +

The wallet seed is encrypted within your wallet, and +you’ll need to enter the wallet password to access it.

+ +

Recovering Wallet

+ +

If you lose your wallet, you can recover it by running this command:

+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/recovered_wallet recover
+
+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/recovered_wallet recover
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\recovered_wallet recover
+
+ + +
+ +
+ +

Please note that if you lose your seed, there is no way to recover your wallet.

+ +
+ +

Address commands

+ +

In this section, we’ll cover address commands that help you manage your wallet addresses.

+ +

Creating new address

+ +

You can create a new address by running this command:

+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 address new
+
+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 address new
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\wallet_1 address new
+
+ + +
+ +
+ +

You can also assign a label to your address to better organize your address book.

+ +

List of addresses

+ +

To view the list of wallet addresses, use this command:

+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 address all
+
+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 address all
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\wallet_1 address all
+
+ + +
+ +
+ +

Get Public key

+ +

To obtain the public key for a specific address, run this command:

+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 address pub <ADDRESS>
+
+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 address pub <ADDRESS>
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\wallet_1 address pub <ADDRESS>
+
+ + +
+ +
+ +

Replace <ADDRESS> with the address for which you want to retrieve its public key.

+ +

Get Private key

+ +

You can get the public key of your address by this command:

+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 address pub <ADDRESS>
+
+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 address pub <ADDRESS>
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\wallet_1 address pub <ADDRESS>
+
+ + +
+ +
+ +

Replace <ADDRESS> with the address for which you want to retrieve its private key. +Keep your private key secure. If someone gains access to your private key, +they will have full control over that address.

+ +
+ +

Transaction commands

+ +

In this section, we’ll cover transaction commands that help you create, sign, and +broadcast transactions on the Pactus Blockchain. +You’ll need to provide the password to sign the transaction. +Please note that once a transaction is broadcasted, it cannot be reversed.

+ +

Sending Transfer transaction

+ +

To create, sign, and broadcast a +Transfer transaction, use the following command:

+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 tx transfer <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 tx transfer <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\wallet_1 tx transfer <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +

In this command, <FROM> should be one of the addresses in your wallet as the sender address, +and <TO> is the receiver address.

+ +

Sending Bond transaction

+ +

To create, sign, and broadcast a +Bond transaction, use the following command:

+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 tx bond <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 tx bond <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\wallet_1 tx bond <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +

In this command, <FROM> should be one of the addresses in your wallet as the sender address, +and <TO> is the receiver validator address.

+ +

If the validator associated with this address does not exist yet, +you need to provide the public key to create it:

+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 tx bond --pub <PUBLIC_KEY> <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 --pub <PUBLIC_KEY> <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\wallet_1 --pub <PUBLIC_KEY> <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +

Replace <PUBLIC_KEY> with the validator’s public key, +which is the public key of the <TO> address.

+ +

Sending Unbond transaction

+ +

To create, sign, and broadcast a +Unbond transaction, use the following command:

+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 tx unbond <ADDRESS>
+
+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 tx unbond <ADDRESS>
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\wallet_1 tx unbond <ADDRESS>
+
+ + +
+ +
+ +

In this command, <ADDRESS> is the address of the validator that you want to unbond.

+ +

Sending Withdraw transaction

+ +

To create, sign, and broadcast a +Withdraw transaction, use the following command:

+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 tx unbond <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 tx unbond <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\wallet_1 tx withdraw <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ + + + + +
+
+
+
+ + + + + diff --git a/assets/css/bootstrap.min.css b/assets/css/bootstrap.min.css new file mode 100644 index 000000000..cfed17b55 --- /dev/null +++ b/assets/css/bootstrap.min.css @@ -0,0 +1,6 @@ +@charset "UTF-8";/*! + * Bootstrap v5.2.1 (https://getbootstrap.com/) + * Copyright 2011-2022 The Bootstrap Authors + * Copyright 2011-2022 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-body-color-rgb:33,37,41;--bs-body-bg-rgb:255,255,255;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-bg:#fff;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-2xl:2rem;--bs-border-radius-pill:50rem;--bs-link-color:#0d6efd;--bs-link-hover-color:#0a58ca;--bs-code-color:#d63384;--bs-highlight-bg:#fff3cd}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;border:0;border-top:1px solid;opacity:.25}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.1875em;background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:var(--bs-link-color);text-decoration:underline}a:hover{color:var(--bs-link-hover-color)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:var(--bs-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:.875em;color:var(--bs-body-bg);background-color:var(--bs-body-color);border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid var(--bs-border-color);border-radius:.375rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:#6c757d}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-color:var(--bs-body-color);--bs-table-bg:transparent;--bs-table-border-color:var(--bs-border-color);--bs-table-accent-bg:transparent;--bs-table-striped-color:var(--bs-body-color);--bs-table-striped-bg:rgba(0, 0, 0, 0.05);--bs-table-active-color:var(--bs-body-color);--bs-table-active-bg:rgba(0, 0, 0, 0.1);--bs-table-hover-color:var(--bs-body-color);--bs-table-hover-bg:rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;color:var(--bs-table-color);vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:2px solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-striped-columns>:not(caption)>tr>:nth-child(2n){--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg:var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover>*{--bs-table-accent-bg:var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-color:#000;--bs-table-bg:#cfe2ff;--bs-table-border-color:#bacbe6;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color:#000;--bs-table-bg:#e2e3e5;--bs-table-border-color:#cbccce;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color:#000;--bs-table-bg:#d1e7dd;--bs-table-border-color:#bcd0c7;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color:#000;--bs-table-bg:#cff4fc;--bs-table-border-color:#badce3;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color:#000;--bs-table-bg:#fff3cd;--bs-table-border-color:#e6dbb9;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color:#000;--bs-table-bg:#f8d7da;--bs-table-border-color:#dfc2c4;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color:#000;--bs-table-bg:#f8f9fa;--bs-table-border-color:#dfe0e1;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color:#fff;--bs-table-bg:#212529;--bs-table-border-color:#373b3e;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:#6c757d}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.375rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled{background-color:#e9ecef;opacity:1}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;border-radius:.25rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + 2px)}textarea.form-control-sm{min-height:calc(1.5em + .5rem + 2px)}textarea.form-control-lg{min-height:calc(1.5em + 1rem + 2px)}.form-control-color{width:3rem;height:calc(1.5em + .75rem + 2px);padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0!important;border-radius:.375rem}.form-control-color::-webkit-color-swatch{border-radius:.375rem}.form-control-color.form-control-sm{height:calc(1.5em + .5rem + 2px)}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + 2px)}.form-select{display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;-moz-padding-start:calc(0.75rem - 3px);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #ced4da;border-radius:.375rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem;border-radius:.25rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:.5rem}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-reverse{padding-right:1.5em;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:-1.5em;margin-left:0}.form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,.25);-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact;print-color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{cursor:default;opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#0d6efd;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#0d6efd;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + 2px);line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;width:100%;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control-plaintext::-moz-placeholder,.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control-plaintext::placeholder,.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control-plaintext:not(:-moz-placeholder-shown),.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown),.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:-webkit-autofill,.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label,.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label{border-width:1px 0}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-floating,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-floating:focus-within,.input-group>.form-select:focus{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.375rem}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:.25rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select,.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select,.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#198754}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(25,135,84,.9);border-radius:.375rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#198754;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:#198754}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-control-color.is-valid,.was-validated .form-control-color:valid{width:calc(3rem + calc(1.5em + .75rem))}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:#198754}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:#198754}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#198754}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-valid,.input-group>.form-floating:not(:focus-within).is-valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-control:not(:focus):valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.was-validated .input-group>.form-select:not(:focus):valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.375rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:#dc3545}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-control-color.is-invalid,.was-validated .form-control-color:invalid{width:calc(3rem + calc(1.5em + .75rem))}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:#dc3545}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:#dc3545}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-invalid,.input-group>.form-floating:not(:focus-within).is-invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-control:not(:focus):invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.was-validated .input-group>.form-select:not(:focus):invalid{z-index:4}.btn{--bs-btn-padding-x:0.75rem;--bs-btn-padding-y:0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight:400;--bs-btn-line-height:1.5;--bs-btn-color:#212529;--bs-btn-bg:transparent;--bs-btn-border-width:1px;--bs-btn-border-color:transparent;--bs-btn-border-radius:0.375rem;--bs-btn-hover-border-color:transparent;--bs-btn-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.15),0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity:0.65;--bs-btn-focus-box-shadow:0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:first-child:hover,:not(.btn-check)+.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,.btn.active,.btn.show,.btn:first-child:active,:not(.btn-check)+.btn:active{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible,.btn:first-child:active:focus-visible,:not(.btn-check)+.btn:active:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0b5ed7;--bs-btn-hover-border-color:#0a58ca;--bs-btn-focus-shadow-rgb:49,132,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0a58ca;--bs-btn-active-border-color:#0a53be;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#0d6efd;--bs-btn-disabled-border-color:#0d6efd}.btn-secondary{--bs-btn-color:#fff;--bs-btn-bg:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#5c636a;--bs-btn-hover-border-color:#565e64;--bs-btn-focus-shadow-rgb:130,138,145;--bs-btn-active-color:#fff;--bs-btn-active-bg:#565e64;--bs-btn-active-border-color:#51585e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#6c757d;--bs-btn-disabled-border-color:#6c757d}.btn-success{--bs-btn-color:#fff;--bs-btn-bg:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#157347;--bs-btn-hover-border-color:#146c43;--bs-btn-focus-shadow-rgb:60,153,110;--bs-btn-active-color:#fff;--bs-btn-active-bg:#146c43;--bs-btn-active-border-color:#13653f;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#198754;--bs-btn-disabled-border-color:#198754}.btn-info{--bs-btn-color:#000;--bs-btn-bg:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#31d2f2;--bs-btn-hover-border-color:#25cff2;--bs-btn-focus-shadow-rgb:11,172,204;--bs-btn-active-color:#000;--bs-btn-active-bg:#3dd5f3;--bs-btn-active-border-color:#25cff2;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#0dcaf0;--bs-btn-disabled-border-color:#0dcaf0}.btn-warning{--bs-btn-color:#000;--bs-btn-bg:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffca2c;--bs-btn-hover-border-color:#ffc720;--bs-btn-focus-shadow-rgb:217,164,6;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffcd39;--bs-btn-active-border-color:#ffc720;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#ffc107;--bs-btn-disabled-border-color:#ffc107}.btn-danger{--bs-btn-color:#fff;--bs-btn-bg:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#bb2d3b;--bs-btn-hover-border-color:#b02a37;--bs-btn-focus-shadow-rgb:225,83,97;--bs-btn-active-color:#fff;--bs-btn-active-bg:#b02a37;--bs-btn-active-border-color:#a52834;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#dc3545;--bs-btn-disabled-border-color:#dc3545}.btn-light{--bs-btn-color:#000;--bs-btn-bg:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#d3d4d5;--bs-btn-hover-border-color:#c6c7c8;--bs-btn-focus-shadow-rgb:211,212,213;--bs-btn-active-color:#000;--bs-btn-active-bg:#c6c7c8;--bs-btn-active-border-color:#babbbc;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#f8f9fa;--bs-btn-disabled-border-color:#f8f9fa}.btn-dark{--bs-btn-color:#fff;--bs-btn-bg:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#424649;--bs-btn-hover-border-color:#373b3e;--bs-btn-focus-shadow-rgb:66,70,73;--bs-btn-active-color:#fff;--bs-btn-active-bg:#4d5154;--bs-btn-active-border-color:#373b3e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#212529;--bs-btn-disabled-border-color:#212529}.btn-outline-primary{--bs-btn-color:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0d6efd;--bs-btn-hover-border-color:#0d6efd;--bs-btn-focus-shadow-rgb:13,110,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0d6efd;--bs-btn-active-border-color:#0d6efd;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#0d6efd;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0d6efd;--bs-gradient:none}.btn-outline-secondary{--bs-btn-color:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#6c757d;--bs-btn-hover-border-color:#6c757d;--bs-btn-focus-shadow-rgb:108,117,125;--bs-btn-active-color:#fff;--bs-btn-active-bg:#6c757d;--bs-btn-active-border-color:#6c757d;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#6c757d;--bs-gradient:none}.btn-outline-success{--bs-btn-color:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#198754;--bs-btn-hover-border-color:#198754;--bs-btn-focus-shadow-rgb:25,135,84;--bs-btn-active-color:#fff;--bs-btn-active-bg:#198754;--bs-btn-active-border-color:#198754;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#198754;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#198754;--bs-gradient:none}.btn-outline-info{--bs-btn-color:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#0dcaf0;--bs-btn-hover-border-color:#0dcaf0;--bs-btn-focus-shadow-rgb:13,202,240;--bs-btn-active-color:#000;--bs-btn-active-bg:#0dcaf0;--bs-btn-active-border-color:#0dcaf0;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#0dcaf0;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0dcaf0;--bs-gradient:none}.btn-outline-warning{--bs-btn-color:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffc107;--bs-btn-hover-border-color:#ffc107;--bs-btn-focus-shadow-rgb:255,193,7;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffc107;--bs-btn-active-border-color:#ffc107;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#ffc107;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#ffc107;--bs-gradient:none}.btn-outline-danger{--bs-btn-color:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#dc3545;--bs-btn-hover-border-color:#dc3545;--bs-btn-focus-shadow-rgb:220,53,69;--bs-btn-active-color:#fff;--bs-btn-active-bg:#dc3545;--bs-btn-active-border-color:#dc3545;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#dc3545;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#dc3545;--bs-gradient:none}.btn-outline-light{--bs-btn-color:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#f8f9fa;--bs-btn-hover-border-color:#f8f9fa;--bs-btn-focus-shadow-rgb:248,249,250;--bs-btn-active-color:#000;--bs-btn-active-bg:#f8f9fa;--bs-btn-active-border-color:#f8f9fa;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#f8f9fa;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#f8f9fa;--bs-gradient:none}.btn-outline-dark{--bs-btn-color:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#212529;--bs-btn-hover-border-color:#212529;--bs-btn-focus-shadow-rgb:33,37,41;--bs-btn-active-color:#fff;--bs-btn-active-bg:#212529;--bs-btn-active-border-color:#212529;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#212529;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#212529;--bs-gradient:none}.btn-link{--bs-btn-font-weight:400;--bs-btn-color:var(--bs-link-color);--bs-btn-bg:transparent;--bs-btn-border-color:transparent;--bs-btn-hover-color:var(--bs-link-hover-color);--bs-btn-hover-border-color:transparent;--bs-btn-active-color:var(--bs-link-hover-color);--bs-btn-active-border-color:transparent;--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-border-color:transparent;--bs-btn-box-shadow:none;--bs-btn-focus-shadow-rgb:49,132,253;text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-group-lg>.btn,.btn-lg{--bs-btn-padding-y:0.5rem;--bs-btn-padding-x:1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius:0.5rem}.btn-group-sm>.btn,.btn-sm{--bs-btn-padding-y:0.25rem;--bs-btn-padding-x:0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius:0.25rem}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropdown-center,.dropend,.dropstart,.dropup,.dropup-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex:1000;--bs-dropdown-min-width:10rem;--bs-dropdown-padding-x:0;--bs-dropdown-padding-y:0.5rem;--bs-dropdown-spacer:0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color:#212529;--bs-dropdown-bg:#fff;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-border-radius:0.375rem;--bs-dropdown-border-width:1px;--bs-dropdown-inner-border-radius:calc(0.375rem - 1px);--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-divider-margin-y:0.5rem;--bs-dropdown-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-dropdown-link-color:#212529;--bs-dropdown-link-hover-color:#1e2125;--bs-dropdown-link-hover-bg:#e9ecef;--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-item-padding-x:1rem;--bs-dropdown-item-padding-y:0.25rem;--bs-dropdown-header-color:#6c757d;--bs-dropdown-header-padding-x:1rem;--bs-dropdown-header-padding-y:0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color:#dee2e6;--bs-dropdown-bg:#343a40;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color:#dee2e6;--bs-dropdown-link-hover-color:#fff;--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-link-hover-bg:rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-header-color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:.375rem}.btn-group>.btn-group:not(:first-child),.btn-group>:not(.btn-check:first-child)+.btn{margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x:1rem;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-link-color);--bs-nav-link-hover-color:var(--bs-link-hover-color);--bs-nav-link-disabled-color:#6c757d;display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:var(--bs-nav-link-hover-color)}.nav-link.disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width:1px;--bs-nav-tabs-border-color:#dee2e6;--bs-nav-tabs-border-radius:0.375rem;--bs-nav-tabs-link-hover-border-color:#e9ecef #e9ecef #dee2e6;--bs-nav-tabs-link-active-color:#495057;--bs-nav-tabs-link-active-bg:#fff;--bs-nav-tabs-link-active-border-color:#dee2e6 #dee2e6 #fff;border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1 * var(--bs-nav-tabs-border-width));background:0 0;border:var(--bs-nav-tabs-border-width) solid transparent;border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.disabled,.nav-tabs .nav-link:disabled{color:var(--bs-nav-link-disabled-color);background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1 * var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius:0.375rem;--bs-nav-pills-link-active-color:#fff;--bs-nav-pills-link-active-bg:#0d6efd}.nav-pills .nav-link{background:0 0;border:0;border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link:disabled{color:var(--bs-nav-link-disabled-color);background-color:transparent;border-color:transparent}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x:0;--bs-navbar-padding-y:0.5rem;--bs-navbar-color:rgba(0, 0, 0, 0.55);--bs-navbar-hover-color:rgba(0, 0, 0, 0.7);--bs-navbar-disabled-color:rgba(0, 0, 0, 0.3);--bs-navbar-active-color:rgba(0, 0, 0, 0.9);--bs-navbar-brand-padding-y:0.3125rem;--bs-navbar-brand-margin-end:1rem;--bs-navbar-brand-font-size:1.25rem;--bs-navbar-brand-color:rgba(0, 0, 0, 0.9);--bs-navbar-brand-hover-color:rgba(0, 0, 0, 0.9);--bs-navbar-nav-link-padding-x:0.5rem;--bs-navbar-toggler-padding-y:0.25rem;--bs-navbar-toggler-padding-x:0.75rem;--bs-navbar-toggler-font-size:1.25rem;--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color:rgba(0, 0, 0, 0.1);--bs-navbar-toggler-border-radius:0.375rem;--bs-navbar-toggler-focus-width:0.25rem;--bs-navbar-toggler-transition:box-shadow 0.15s ease-in-out;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x:0;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-navbar-color);--bs-nav-link-hover-color:var(--bs-navbar-hover-color);--bs-nav-link-disabled-color:var(--bs-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .show>.nav-link{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:focus,.navbar-text a:hover{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:transparent;border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-dark{--bs-navbar-color:rgba(255, 255, 255, 0.55);--bs-navbar-hover-color:rgba(255, 255, 255, 0.75);--bs-navbar-disabled-color:rgba(255, 255, 255, 0.25);--bs-navbar-active-color:#fff;--bs-navbar-brand-color:#fff;--bs-navbar-brand-hover-color:#fff;--bs-navbar-toggler-border-color:rgba(255, 255, 255, 0.1);--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y:1rem;--bs-card-spacer-x:1rem;--bs-card-title-spacer-y:0.5rem;--bs-card-border-width:1px;--bs-card-border-color:var(--bs-border-color-translucent);--bs-card-border-radius:0.375rem;--bs-card-box-shadow: ;--bs-card-inner-border-radius:calc(0.375rem - 1px);--bs-card-cap-padding-y:0.5rem;--bs-card-cap-padding-x:1rem;--bs-card-cap-bg:rgba(0, 0, 0, 0.03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg:#fff;--bs-card-img-overlay-padding:1rem;--bs-card-group-margin:0.75rem;position:relative;display:flex;flex-direction:column;min-width:0;height:var(--bs-card-height);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y)}.card-subtitle{margin-top:calc(-.5 * var(--bs-card-title-spacer-y));margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-bottom:calc(-1 * var(--bs-card-cap-padding-y));margin-left:calc(-.5 * var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-left:calc(-.5 * var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.accordion{--bs-accordion-color:var(--bs-body-color);--bs-accordion-bg:#fff;--bs-accordion-transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out,border-radius 0.15s ease;--bs-accordion-border-color:var(--bs-border-color);--bs-accordion-border-width:1px;--bs-accordion-border-radius:0.375rem;--bs-accordion-inner-border-radius:calc(0.375rem - 1px);--bs-accordion-btn-padding-x:1.25rem;--bs-accordion-btn-padding-y:1rem;--bs-accordion-btn-color:var(--bs-body-color);--bs-accordion-btn-bg:var(--bs-accordion-bg);--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='var%28--bs-body-color%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width:1.25rem;--bs-accordion-btn-icon-transform:rotate(-180deg);--bs-accordion-btn-icon-transition:transform 0.2s ease-in-out;--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-focus-border-color:#86b7fe;--bs-accordion-btn-focus-box-shadow:0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-accordion-body-padding-x:1.25rem;--bs-accordion-body-padding-y:1rem;--bs-accordion-active-color:#0c63e4;--bs-accordion-active-bg:#e7f1ff}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--bs-accordion-btn-focus-border-color);outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button,.accordion-flush .accordion-item .accordion-button.collapsed{border-radius:0}.breadcrumb{--bs-breadcrumb-padding-x:0;--bs-breadcrumb-padding-y:0;--bs-breadcrumb-margin-bottom:1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color:#6c757d;--bs-breadcrumb-item-padding-x:0.5rem;--bs-breadcrumb-item-active-color:#6c757d;display:flex;flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x:0.75rem;--bs-pagination-padding-y:0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color:var(--bs-link-color);--bs-pagination-bg:#fff;--bs-pagination-border-width:1px;--bs-pagination-border-color:#dee2e6;--bs-pagination-border-radius:0.375rem;--bs-pagination-hover-color:var(--bs-link-hover-color);--bs-pagination-hover-bg:#e9ecef;--bs-pagination-hover-border-color:#dee2e6;--bs-pagination-focus-color:var(--bs-link-hover-color);--bs-pagination-focus-bg:#e9ecef;--bs-pagination-focus-box-shadow:0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-pagination-active-color:#fff;--bs-pagination-active-bg:#0d6efd;--bs-pagination-active-border-color:#0d6efd;--bs-pagination-disabled-color:#6c757d;--bs-pagination-disabled-bg:#fff;--bs-pagination-disabled-border-color:#dee2e6;display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.active>.page-link,.page-link.active{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.disabled>.page-link,.page-link.disabled{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x:1.5rem;--bs-pagination-padding-y:0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius:0.5rem}.pagination-sm{--bs-pagination-padding-x:0.5rem;--bs-pagination-padding-y:0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius:0.25rem}.badge{--bs-badge-padding-x:0.65em;--bs-badge-padding-y:0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight:700;--bs-badge-color:#fff;--bs-badge-border-radius:0.375rem;display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg:transparent;--bs-alert-padding-x:1rem;--bs-alert-padding-y:1rem;--bs-alert-margin-bottom:1rem;--bs-alert-color:inherit;--bs-alert-border-color:transparent;--bs-alert-border:1px solid var(--bs-alert-border-color);--bs-alert-border-radius:0.375rem;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{--bs-alert-color:#084298;--bs-alert-bg:#cfe2ff;--bs-alert-border-color:#b6d4fe}.alert-primary .alert-link{color:#06357a}.alert-secondary{--bs-alert-color:#41464b;--bs-alert-bg:#e2e3e5;--bs-alert-border-color:#d3d6d8}.alert-secondary .alert-link{color:#34383c}.alert-success{--bs-alert-color:#0f5132;--bs-alert-bg:#d1e7dd;--bs-alert-border-color:#badbcc}.alert-success .alert-link{color:#0c4128}.alert-info{--bs-alert-color:#055160;--bs-alert-bg:#cff4fc;--bs-alert-border-color:#b6effb}.alert-info .alert-link{color:#04414d}.alert-warning{--bs-alert-color:#664d03;--bs-alert-bg:#fff3cd;--bs-alert-border-color:#ffecb5}.alert-warning .alert-link{color:#523e02}.alert-danger{--bs-alert-color:#842029;--bs-alert-bg:#f8d7da;--bs-alert-border-color:#f5c2c7}.alert-danger .alert-link{color:#6a1a21}.alert-light{--bs-alert-color:#636464;--bs-alert-bg:#fefefe;--bs-alert-border-color:#fdfdfe}.alert-light .alert-link{color:#4f5050}.alert-dark{--bs-alert-color:#141619;--bs-alert-bg:#d3d3d4;--bs-alert-border-color:#bcbebf}.alert-dark .alert-link{color:#101214}@-webkit-keyframes progress-bar-stripes{0%{background-position-x:1rem}}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{--bs-progress-height:1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg:#e9ecef;--bs-progress-border-radius:0.375rem;--bs-progress-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-progress-bar-color:#fff;--bs-progress-bar-bg:#0d6efd;--bs-progress-bar-transition:width 0.6s ease;display:flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-bar-animated{-webkit-animation:1s linear infinite progress-bar-stripes;animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.list-group{--bs-list-group-color:#212529;--bs-list-group-bg:#fff;--bs-list-group-border-color:rgba(0, 0, 0, 0.125);--bs-list-group-border-width:1px;--bs-list-group-border-radius:0.375rem;--bs-list-group-item-padding-x:1rem;--bs-list-group-item-padding-y:0.5rem;--bs-list-group-action-color:#495057;--bs-list-group-action-hover-color:#495057;--bs-list-group-action-hover-bg:#f8f9fa;--bs-list-group-action-active-color:#212529;--bs-list-group-action-active-bg:#e9ecef;--bs-list-group-disabled-color:#6c757d;--bs-list-group-disabled-bg:#fff;--bs-list-group-active-color:#fff;--bs-list-group-active-bg:#0d6efd;--bs-list-group-active-border-color:#0d6efd;display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1 * var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#084298;background-color:#cfe2ff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#084298;background-color:#bacbe6}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#084298;border-color:#084298}.list-group-item-secondary{color:#41464b;background-color:#e2e3e5}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#41464b;background-color:#cbccce}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#41464b;border-color:#41464b}.list-group-item-success{color:#0f5132;background-color:#d1e7dd}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#0f5132;background-color:#bcd0c7}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}.list-group-item-info{color:#055160;background-color:#cff4fc}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#055160;background-color:#badce3}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#055160;border-color:#055160}.list-group-item-warning{color:#664d03;background-color:#fff3cd}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#664d03;background-color:#e6dbb9}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}.list-group-item-danger{color:#842029;background-color:#f8d7da}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#842029;background-color:#dfc2c4}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}.list-group-item-light{color:#636464;background-color:#fefefe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#636464;background-color:#e5e5e5}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#636464;border-color:#636464}.list-group-item-dark{color:#141619;background-color:#d3d3d4}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#141619;background-color:#bebebf}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#141619;border-color:#141619}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:#000;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:.375rem;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25);opacity:1}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{--bs-toast-zindex:1090;--bs-toast-padding-x:0.75rem;--bs-toast-padding-y:0.5rem;--bs-toast-spacing:1.5rem;--bs-toast-max-width:350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg:rgba(255, 255, 255, 0.85);--bs-toast-border-width:1px;--bs-toast-border-color:var(--bs-border-color-translucent);--bs-toast-border-radius:0.375rem;--bs-toast-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-toast-header-color:#6c757d;--bs-toast-header-bg:rgba(255, 255, 255, 0.85);--bs-toast-header-border-color:rgba(0, 0, 0, 0.05);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{position:absolute;z-index:var(--bs-toast-zindex);width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-right:calc(-.5 * var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex:1055;--bs-modal-width:500px;--bs-modal-padding:1rem;--bs-modal-margin:0.5rem;--bs-modal-color: ;--bs-modal-bg:#fff;--bs-modal-border-color:var(--bs-border-color-translucent);--bs-modal-border-width:1px;--bs-modal-border-radius:0.5rem;--bs-modal-box-shadow:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-modal-inner-border-radius:calc(0.5rem - 1px);--bs-modal-header-padding-x:1rem;--bs-modal-header-padding-y:1rem;--bs-modal-header-padding:1rem 1rem;--bs-modal-header-border-color:var(--bs-border-color);--bs-modal-header-border-width:1px;--bs-modal-title-line-height:1.5;--bs-modal-footer-gap:0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color:var(--bs-border-color);--bs-modal-footer-border-width:1px;position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin) * 2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - var(--bs-modal-margin) * 2)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-backdrop{--bs-backdrop-zindex:1050;--bs-backdrop-bg:#000;--bs-backdrop-opacity:0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y) * .5) calc(var(--bs-modal-header-padding-x) * .5);margin:calc(-.5 * var(--bs-modal-header-padding-y)) calc(-.5 * var(--bs-modal-header-padding-x)) calc(-.5 * var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;flex-shrink:0;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * .5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap) * .5)}@media (min-width:576px){.modal{--bs-modal-margin:1.75rem;--bs-modal-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{--bs-modal-width:800px}}@media (min-width:1200px){.modal-xl{--bs-modal-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-footer,.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-footer,.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-footer,.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-footer,.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-footer,.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-footer,.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex:1080;--bs-tooltip-max-width:200px;--bs-tooltip-padding-x:0.5rem;--bs-tooltip-padding-y:0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color:#fff;--bs-tooltip-bg:#000;--bs-tooltip-border-radius:0.375rem;--bs-tooltip-opacity:0.9;--bs-tooltip-arrow-width:0.8rem;--bs-tooltip-arrow-height:0.4rem;z-index:var(--bs-tooltip-zindex);display:block;padding:var(--bs-tooltip-arrow-height);margin:var(--bs-tooltip-margin);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:0;width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:0;width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex:1070;--bs-popover-max-width:276px;--bs-popover-font-size:0.875rem;--bs-popover-bg:#fff;--bs-popover-border-width:1px;--bs-popover-border-color:var(--bs-border-color-translucent);--bs-popover-border-radius:0.5rem;--bs-popover-inner-border-radius:calc(0.5rem - 1px);--bs-popover-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-popover-header-padding-x:1rem;--bs-popover-header-padding-y:0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color: ;--bs-popover-header-bg:#f0f0f0;--bs-popover-body-padding-x:1rem;--bs-popover-body-padding-y:1rem;--bs-popover-body-color:#212529;--bs-popover-arrow-width:1rem;--bs-popover-arrow-height:0.5rem;--bs-popover-arrow-border:var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid;border-width:0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-top>.popover-arrow::before{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-end>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::before{border-width:0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-.5 * var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-start>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) 0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}.spinner-border,.spinner-grow{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;-webkit-animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name);animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@-webkit-keyframes spinner-border{to{transform:rotate(360deg)}}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-border-width:0.25em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:transparent}.spinner-border-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem;--bs-spinner-border-width:0.2em}@-webkit-keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed:1.5s}}.offcanvas,.offcanvas-lg,.offcanvas-md,.offcanvas-sm,.offcanvas-xl,.offcanvas-xxl{--bs-offcanvas-zindex:1045;--bs-offcanvas-width:400px;--bs-offcanvas-height:30vh;--bs-offcanvas-padding-x:1rem;--bs-offcanvas-padding-y:1rem;--bs-offcanvas-color: ;--bs-offcanvas-bg:#fff;--bs-offcanvas-border-width:1px;--bs-offcanvas-border-color:var(--bs-border-color-translucent);--bs-offcanvas-box-shadow:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075)}@media (max-width:575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:575.98px) and (prefers-reduced-motion:reduce){.offcanvas-sm{transition:none}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:575.98px){.offcanvas-sm.show:not(.hiding),.offcanvas-sm.showing{transform:none}}@media (max-width:575.98px){.offcanvas-sm.hiding,.offcanvas-sm.show,.offcanvas-sm.showing{visibility:visible}}@media (min-width:576px){.offcanvas-sm{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:767.98px) and (prefers-reduced-motion:reduce){.offcanvas-md{transition:none}}@media (max-width:767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:767.98px){.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:767.98px){.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:767.98px){.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:767.98px){.offcanvas-md.show:not(.hiding),.offcanvas-md.showing{transform:none}}@media (max-width:767.98px){.offcanvas-md.hiding,.offcanvas-md.show,.offcanvas-md.showing{visibility:visible}}@media (min-width:768px){.offcanvas-md{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:991.98px) and (prefers-reduced-motion:reduce){.offcanvas-lg{transition:none}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:991.98px){.offcanvas-lg.show:not(.hiding),.offcanvas-lg.showing{transform:none}}@media (max-width:991.98px){.offcanvas-lg.hiding,.offcanvas-lg.show,.offcanvas-lg.showing{visibility:visible}}@media (min-width:992px){.offcanvas-lg{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:1199.98px) and (prefers-reduced-motion:reduce){.offcanvas-xl{transition:none}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:1199.98px){.offcanvas-xl.show:not(.hiding),.offcanvas-xl.showing{transform:none}}@media (max-width:1199.98px){.offcanvas-xl.hiding,.offcanvas-xl.show,.offcanvas-xl.showing{visibility:visible}}@media (min-width:1200px){.offcanvas-xl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:1399.98px) and (prefers-reduced-motion:reduce){.offcanvas-xxl{transition:none}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:1399.98px){.offcanvas-xxl.show:not(.hiding),.offcanvas-xxl.showing{transform:none}}@media (max-width:1399.98px){.offcanvas-xxl.hiding,.offcanvas-xxl.show,.offcanvas-xxl.showing{visibility:visible}}@media (min-width:1400px){.offcanvas-xxl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.show:not(.hiding),.offcanvas.showing{transform:none}.offcanvas.hiding,.offcanvas.show,.offcanvas.showing{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y) * .5) calc(var(--bs-offcanvas-padding-x) * .5);margin-top:calc(-.5 * var(--bs-offcanvas-padding-y));margin-right:calc(-.5 * var(--bs-offcanvas-padding-x));margin-bottom:calc(-.5 * var(--bs-offcanvas-padding-y))}.offcanvas-title{margin-bottom:0;line-height:1.5}.offcanvas-body{flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{-webkit-animation:placeholder-glow 2s ease-in-out infinite;animation:placeholder-glow 2s ease-in-out infinite}@-webkit-keyframes placeholder-glow{50%{opacity:.2}}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%;-webkit-animation:placeholder-wave 2s linear infinite;animation:placeholder-wave 2s linear infinite}@-webkit-keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}@keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-primary{color:#fff!important;background-color:RGBA(13,110,253,var(--bs-bg-opacity,1))!important}.text-bg-secondary{color:#fff!important;background-color:RGBA(108,117,125,var(--bs-bg-opacity,1))!important}.text-bg-success{color:#fff!important;background-color:RGBA(25,135,84,var(--bs-bg-opacity,1))!important}.text-bg-info{color:#000!important;background-color:RGBA(13,202,240,var(--bs-bg-opacity,1))!important}.text-bg-warning{color:#000!important;background-color:RGBA(255,193,7,var(--bs-bg-opacity,1))!important}.text-bg-danger{color:#fff!important;background-color:RGBA(220,53,69,var(--bs-bg-opacity,1))!important}.text-bg-light{color:#000!important;background-color:RGBA(248,249,250,var(--bs-bg-opacity,1))!important}.text-bg-dark{color:#fff!important;background-color:RGBA(33,37,41,var(--bs-bg-opacity,1))!important}.link-primary{color:#0d6efd!important}.link-primary:focus,.link-primary:hover{color:#0a58ca!important}.link-secondary{color:#6c757d!important}.link-secondary:focus,.link-secondary:hover{color:#565e64!important}.link-success{color:#198754!important}.link-success:focus,.link-success:hover{color:#146c43!important}.link-info{color:#0dcaf0!important}.link-info:focus,.link-info:hover{color:#3dd5f3!important}.link-warning{color:#ffc107!important}.link-warning:focus,.link-warning:hover{color:#ffcd39!important}.link-danger{color:#dc3545!important}.link-danger:focus,.link-danger:hover{color:#b02a37!important}.link-light{color:#f8f9fa!important}.link-light:focus,.link-light:hover{color:#f9fafb!important}.link-dark{color:#212529!important}.link-dark:focus,.link-dark:hover{color:#1a1e21!important}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:75%}.ratio-16x9{--bs-aspect-ratio:56.25%}.ratio-21x9{--bs-aspect-ratio:42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:1px;min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-0{border:0!important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-top-0{border-top:0!important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-start-0{border-left:0!important}.border-primary{--bs-border-opacity:1;border-color:rgba(var(--bs-primary-rgb),var(--bs-border-opacity))!important}.border-secondary{--bs-border-opacity:1;border-color:rgba(var(--bs-secondary-rgb),var(--bs-border-opacity))!important}.border-success{--bs-border-opacity:1;border-color:rgba(var(--bs-success-rgb),var(--bs-border-opacity))!important}.border-info{--bs-border-opacity:1;border-color:rgba(var(--bs-info-rgb),var(--bs-border-opacity))!important}.border-warning{--bs-border-opacity:1;border-color:rgba(var(--bs-warning-rgb),var(--bs-border-opacity))!important}.border-danger{--bs-border-opacity:1;border-color:rgba(var(--bs-danger-rgb),var(--bs-border-opacity))!important}.border-light{--bs-border-opacity:1;border-color:rgba(var(--bs-light-rgb),var(--bs-border-opacity))!important}.border-dark{--bs-border-opacity:1;border-color:rgba(var(--bs-dark-rgb),var(--bs-border-opacity))!important}.border-white{--bs-border-opacity:1;border-color:rgba(var(--bs-white-rgb),var(--bs-border-opacity))!important}.border-1{--bs-border-width:1px}.border-2{--bs-border-width:2px}.border-3{--bs-border-width:3px}.border-4{--bs-border-width:4px}.border-5{--bs-border-width:5px}.border-opacity-10{--bs-border-opacity:0.1}.border-opacity-25{--bs-border-opacity:0.25}.border-opacity-50{--bs-border-opacity:0.5}.border-opacity-75{--bs-border-opacity:0.75}.border-opacity-100{--bs-border-opacity:1}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:300!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!important}.fw-bold{font-weight:700!important}.fw-semibold{font-weight:600!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-color-rgb),var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:#6c757d!important}.text-black-50{--bs-text-opacity:1;color:rgba(0,0,0,.5)!important}.text-white-50{--bs-text-opacity:1;color:rgba(255,255,255,.5)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:0.25}.text-opacity-50{--bs-text-opacity:0.5}.text-opacity-75{--bs-text-opacity:0.75}.text-opacity-100{--bs-text-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-bg-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:transparent!important}.bg-opacity-10{--bs-bg-opacity:0.1}.bg-opacity-25{--bs-bg-opacity:0.25}.bg-opacity-50{--bs-bg-opacity:0.5}.bg-opacity-75{--bs-bg-opacity:0.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:var(--bs-border-radius)!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:var(--bs-border-radius-sm)!important}.rounded-2{border-radius:var(--bs-border-radius)!important}.rounded-3{border-radius:var(--bs-border-radius-lg)!important}.rounded-4{border-radius:var(--bs-border-radius-xl)!important}.rounded-5{border-radius:var(--bs-border-radius-2xl)!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:var(--bs-border-radius-pill)!important}.rounded-top{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-end{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}} diff --git a/assets/css/bootstrap.rtl.min.css b/assets/css/bootstrap.rtl.min.css new file mode 100644 index 000000000..65955bffe --- /dev/null +++ b/assets/css/bootstrap.rtl.min.css @@ -0,0 +1,6 @@ +@charset "UTF-8";/*! + * Bootstrap v5.2.1 (https://getbootstrap.com/) + * Copyright 2011-2022 The Bootstrap Authors + * Copyright 2011-2022 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-body-color-rgb:33,37,41;--bs-body-bg-rgb:255,255,255;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-bg:#fff;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-2xl:2rem;--bs-border-radius-pill:50rem;--bs-link-color:#0d6efd;--bs-link-hover-color:#0a58ca;--bs-code-color:#d63384;--bs-highlight-bg:#fff3cd}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;border:0;border-top:1px solid;opacity:.25}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-right:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-right:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.1875em;background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:var(--bs-link-color);text-decoration:underline}a:hover{color:var(--bs-link-hover-color)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:var(--bs-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:.875em;color:var(--bs-body-bg);background-color:var(--bs-body-color);border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:right}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:right;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:right}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}[type=email],[type=number],[type=tel],[type=url]{direction:ltr}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-right:0;list-style:none}.list-inline{padding-right:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-left:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid var(--bs-border-color);border-radius:.375rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:#6c757d}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-left:calc(var(--bs-gutter-x) * .5);padding-right:calc(var(--bs-gutter-x) * .5);margin-left:auto;margin-right:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-left:calc(-.5 * var(--bs-gutter-x));margin-right:calc(-.5 * var(--bs-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-left:calc(var(--bs-gutter-x) * .5);padding-right:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-right:8.33333333%}.offset-2{margin-right:16.66666667%}.offset-3{margin-right:25%}.offset-4{margin-right:33.33333333%}.offset-5{margin-right:41.66666667%}.offset-6{margin-right:50%}.offset-7{margin-right:58.33333333%}.offset-8{margin-right:66.66666667%}.offset-9{margin-right:75%}.offset-10{margin-right:83.33333333%}.offset-11{margin-right:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-right:0}.offset-sm-1{margin-right:8.33333333%}.offset-sm-2{margin-right:16.66666667%}.offset-sm-3{margin-right:25%}.offset-sm-4{margin-right:33.33333333%}.offset-sm-5{margin-right:41.66666667%}.offset-sm-6{margin-right:50%}.offset-sm-7{margin-right:58.33333333%}.offset-sm-8{margin-right:66.66666667%}.offset-sm-9{margin-right:75%}.offset-sm-10{margin-right:83.33333333%}.offset-sm-11{margin-right:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-right:0}.offset-md-1{margin-right:8.33333333%}.offset-md-2{margin-right:16.66666667%}.offset-md-3{margin-right:25%}.offset-md-4{margin-right:33.33333333%}.offset-md-5{margin-right:41.66666667%}.offset-md-6{margin-right:50%}.offset-md-7{margin-right:58.33333333%}.offset-md-8{margin-right:66.66666667%}.offset-md-9{margin-right:75%}.offset-md-10{margin-right:83.33333333%}.offset-md-11{margin-right:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-right:0}.offset-lg-1{margin-right:8.33333333%}.offset-lg-2{margin-right:16.66666667%}.offset-lg-3{margin-right:25%}.offset-lg-4{margin-right:33.33333333%}.offset-lg-5{margin-right:41.66666667%}.offset-lg-6{margin-right:50%}.offset-lg-7{margin-right:58.33333333%}.offset-lg-8{margin-right:66.66666667%}.offset-lg-9{margin-right:75%}.offset-lg-10{margin-right:83.33333333%}.offset-lg-11{margin-right:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-right:0}.offset-xl-1{margin-right:8.33333333%}.offset-xl-2{margin-right:16.66666667%}.offset-xl-3{margin-right:25%}.offset-xl-4{margin-right:33.33333333%}.offset-xl-5{margin-right:41.66666667%}.offset-xl-6{margin-right:50%}.offset-xl-7{margin-right:58.33333333%}.offset-xl-8{margin-right:66.66666667%}.offset-xl-9{margin-right:75%}.offset-xl-10{margin-right:83.33333333%}.offset-xl-11{margin-right:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-right:0}.offset-xxl-1{margin-right:8.33333333%}.offset-xxl-2{margin-right:16.66666667%}.offset-xxl-3{margin-right:25%}.offset-xxl-4{margin-right:33.33333333%}.offset-xxl-5{margin-right:41.66666667%}.offset-xxl-6{margin-right:50%}.offset-xxl-7{margin-right:58.33333333%}.offset-xxl-8{margin-right:66.66666667%}.offset-xxl-9{margin-right:75%}.offset-xxl-10{margin-right:83.33333333%}.offset-xxl-11{margin-right:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-color:var(--bs-body-color);--bs-table-bg:transparent;--bs-table-border-color:var(--bs-border-color);--bs-table-accent-bg:transparent;--bs-table-striped-color:var(--bs-body-color);--bs-table-striped-bg:rgba(0, 0, 0, 0.05);--bs-table-active-color:var(--bs-body-color);--bs-table-active-bg:rgba(0, 0, 0, 0.1);--bs-table-hover-color:var(--bs-body-color);--bs-table-hover-bg:rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;color:var(--bs-table-color);vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:2px solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-striped-columns>:not(caption)>tr>:nth-child(2n){--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg:var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover>*{--bs-table-accent-bg:var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-color:#000;--bs-table-bg:#cfe2ff;--bs-table-border-color:#bacbe6;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color:#000;--bs-table-bg:#e2e3e5;--bs-table-border-color:#cbccce;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color:#000;--bs-table-bg:#d1e7dd;--bs-table-border-color:#bcd0c7;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color:#000;--bs-table-bg:#cff4fc;--bs-table-border-color:#badce3;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color:#000;--bs-table-bg:#fff3cd;--bs-table-border-color:#e6dbb9;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color:#000;--bs-table-bg:#f8d7da;--bs-table-border-color:#dfc2c4;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color:#000;--bs-table-bg:#f8f9fa;--bs-table-border-color:#dfe0e1;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color:#fff;--bs-table-bg:#212529;--bs-table-border-color:#373b3e;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:#6c757d}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.375rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled{background-color:#e9ecef;opacity:1}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-left:0;padding-right:0}.form-control-sm{min-height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;border-radius:.25rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + 2px)}textarea.form-control-sm{min-height:calc(1.5em + .5rem + 2px)}textarea.form-control-lg{min-height:calc(1.5em + 1rem + 2px)}.form-control-color{width:3rem;height:calc(1.5em + .75rem + 2px);padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0!important;border-radius:.375rem}.form-control-color::-webkit-color-swatch{border-radius:.375rem}.form-control-color.form-control-sm{height:calc(1.5em + .5rem + 2px)}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + 2px)}.form-select{display:block;width:100%;padding:.375rem .75rem .375rem 2.25rem;-moz-padding-start:calc(0.75rem - 3px);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:left .75rem center;background-size:16px 12px;border:1px solid #ced4da;border-radius:.375rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-left:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-right:.5rem;font-size:.875rem;border-radius:.25rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-right:1rem;font-size:1.25rem;border-radius:.5rem}.form-check{display:block;min-height:1.5rem;padding-right:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:right;margin-right:-1.5em}.form-check-reverse{padding-left:1.5em;padding-right:0;text-align:left}.form-check-reverse .form-check-input{float:left;margin-left:-1.5em;margin-right:0}.form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,.25);-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact;print-color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{cursor:default;opacity:.5}.form-switch{padding-right:2.5em}.form-switch .form-check-input{width:2em;margin-right:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:right center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:left center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-left:2.5em;padding-right:0}.form-switch.form-check-reverse .form-check-input{margin-left:-2.5em;margin-right:0}.form-check-inline{display:inline-block;margin-left:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#0d6efd;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#0d6efd;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + 2px);line-height:1.25}.form-floating>label{position:absolute;top:0;right:0;width:100%;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:1px solid transparent;transform-origin:100% 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control-plaintext::-moz-placeholder,.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control-plaintext::placeholder,.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control-plaintext:not(:-moz-placeholder-shown),.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown),.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:-webkit-autofill,.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(-.15rem)}.form-floating>.form-control-plaintext~label,.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(-.15rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(-.15rem)}.form-floating>.form-control-plaintext~label{border-width:1px 0}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-floating,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-floating:focus-within,.input-group>.form-select:focus{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.375rem}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:.25rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-left:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select,.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-left-radius:0;border-bottom-left-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select,.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-right:-1px;border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#198754}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(25,135,84,.9);border-radius:.375rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#198754;padding-left:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:left calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-left:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) left calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:#198754}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{padding-left:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:left .75rem center,center left 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-control-color.is-valid,.was-validated .form-control-color:valid{width:calc(3rem + calc(1.5em + .75rem))}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:#198754}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:#198754}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#198754}.form-check-inline .form-check-input~.valid-feedback{margin-right:.5em}.input-group>.form-control:not(:focus).is-valid,.input-group>.form-floating:not(:focus-within).is-valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-control:not(:focus):valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.was-validated .input-group>.form-select:not(:focus):valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.375rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-left:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:left calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-left:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) left calc(.375em + .1875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:#dc3545}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{padding-left:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:left .75rem center,center left 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-control-color.is-invalid,.was-validated .form-control-color:invalid{width:calc(3rem + calc(1.5em + .75rem))}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:#dc3545}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:#dc3545}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-inline .form-check-input~.invalid-feedback{margin-right:.5em}.input-group>.form-control:not(:focus).is-invalid,.input-group>.form-floating:not(:focus-within).is-invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-control:not(:focus):invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.was-validated .input-group>.form-select:not(:focus):invalid{z-index:4}.btn{--bs-btn-padding-x:0.75rem;--bs-btn-padding-y:0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight:400;--bs-btn-line-height:1.5;--bs-btn-color:#212529;--bs-btn-bg:transparent;--bs-btn-border-width:1px;--bs-btn-border-color:transparent;--bs-btn-border-radius:0.375rem;--bs-btn-hover-border-color:transparent;--bs-btn-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.15),0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity:0.65;--bs-btn-focus-box-shadow:0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:first-child:hover,:not(.btn-check)+.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,.btn.active,.btn.show,.btn:first-child:active,:not(.btn-check)+.btn:active{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible,.btn:first-child:active:focus-visible,:not(.btn-check)+.btn:active:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0b5ed7;--bs-btn-hover-border-color:#0a58ca;--bs-btn-focus-shadow-rgb:49,132,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0a58ca;--bs-btn-active-border-color:#0a53be;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#0d6efd;--bs-btn-disabled-border-color:#0d6efd}.btn-secondary{--bs-btn-color:#fff;--bs-btn-bg:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#5c636a;--bs-btn-hover-border-color:#565e64;--bs-btn-focus-shadow-rgb:130,138,145;--bs-btn-active-color:#fff;--bs-btn-active-bg:#565e64;--bs-btn-active-border-color:#51585e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#6c757d;--bs-btn-disabled-border-color:#6c757d}.btn-success{--bs-btn-color:#fff;--bs-btn-bg:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#157347;--bs-btn-hover-border-color:#146c43;--bs-btn-focus-shadow-rgb:60,153,110;--bs-btn-active-color:#fff;--bs-btn-active-bg:#146c43;--bs-btn-active-border-color:#13653f;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#198754;--bs-btn-disabled-border-color:#198754}.btn-info{--bs-btn-color:#000;--bs-btn-bg:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#31d2f2;--bs-btn-hover-border-color:#25cff2;--bs-btn-focus-shadow-rgb:11,172,204;--bs-btn-active-color:#000;--bs-btn-active-bg:#3dd5f3;--bs-btn-active-border-color:#25cff2;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#0dcaf0;--bs-btn-disabled-border-color:#0dcaf0}.btn-warning{--bs-btn-color:#000;--bs-btn-bg:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffca2c;--bs-btn-hover-border-color:#ffc720;--bs-btn-focus-shadow-rgb:217,164,6;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffcd39;--bs-btn-active-border-color:#ffc720;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#ffc107;--bs-btn-disabled-border-color:#ffc107}.btn-danger{--bs-btn-color:#fff;--bs-btn-bg:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#bb2d3b;--bs-btn-hover-border-color:#b02a37;--bs-btn-focus-shadow-rgb:225,83,97;--bs-btn-active-color:#fff;--bs-btn-active-bg:#b02a37;--bs-btn-active-border-color:#a52834;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#dc3545;--bs-btn-disabled-border-color:#dc3545}.btn-light{--bs-btn-color:#000;--bs-btn-bg:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#d3d4d5;--bs-btn-hover-border-color:#c6c7c8;--bs-btn-focus-shadow-rgb:211,212,213;--bs-btn-active-color:#000;--bs-btn-active-bg:#c6c7c8;--bs-btn-active-border-color:#babbbc;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#f8f9fa;--bs-btn-disabled-border-color:#f8f9fa}.btn-dark{--bs-btn-color:#fff;--bs-btn-bg:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#424649;--bs-btn-hover-border-color:#373b3e;--bs-btn-focus-shadow-rgb:66,70,73;--bs-btn-active-color:#fff;--bs-btn-active-bg:#4d5154;--bs-btn-active-border-color:#373b3e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#212529;--bs-btn-disabled-border-color:#212529}.btn-outline-primary{--bs-btn-color:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0d6efd;--bs-btn-hover-border-color:#0d6efd;--bs-btn-focus-shadow-rgb:13,110,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0d6efd;--bs-btn-active-border-color:#0d6efd;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#0d6efd;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0d6efd;--bs-gradient:none}.btn-outline-secondary{--bs-btn-color:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#6c757d;--bs-btn-hover-border-color:#6c757d;--bs-btn-focus-shadow-rgb:108,117,125;--bs-btn-active-color:#fff;--bs-btn-active-bg:#6c757d;--bs-btn-active-border-color:#6c757d;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#6c757d;--bs-gradient:none}.btn-outline-success{--bs-btn-color:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#198754;--bs-btn-hover-border-color:#198754;--bs-btn-focus-shadow-rgb:25,135,84;--bs-btn-active-color:#fff;--bs-btn-active-bg:#198754;--bs-btn-active-border-color:#198754;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#198754;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#198754;--bs-gradient:none}.btn-outline-info{--bs-btn-color:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#0dcaf0;--bs-btn-hover-border-color:#0dcaf0;--bs-btn-focus-shadow-rgb:13,202,240;--bs-btn-active-color:#000;--bs-btn-active-bg:#0dcaf0;--bs-btn-active-border-color:#0dcaf0;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#0dcaf0;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0dcaf0;--bs-gradient:none}.btn-outline-warning{--bs-btn-color:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffc107;--bs-btn-hover-border-color:#ffc107;--bs-btn-focus-shadow-rgb:255,193,7;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffc107;--bs-btn-active-border-color:#ffc107;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#ffc107;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#ffc107;--bs-gradient:none}.btn-outline-danger{--bs-btn-color:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#dc3545;--bs-btn-hover-border-color:#dc3545;--bs-btn-focus-shadow-rgb:220,53,69;--bs-btn-active-color:#fff;--bs-btn-active-bg:#dc3545;--bs-btn-active-border-color:#dc3545;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#dc3545;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#dc3545;--bs-gradient:none}.btn-outline-light{--bs-btn-color:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#f8f9fa;--bs-btn-hover-border-color:#f8f9fa;--bs-btn-focus-shadow-rgb:248,249,250;--bs-btn-active-color:#000;--bs-btn-active-bg:#f8f9fa;--bs-btn-active-border-color:#f8f9fa;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#f8f9fa;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#f8f9fa;--bs-gradient:none}.btn-outline-dark{--bs-btn-color:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#212529;--bs-btn-hover-border-color:#212529;--bs-btn-focus-shadow-rgb:33,37,41;--bs-btn-active-color:#fff;--bs-btn-active-bg:#212529;--bs-btn-active-border-color:#212529;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#212529;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#212529;--bs-gradient:none}.btn-link{--bs-btn-font-weight:400;--bs-btn-color:var(--bs-link-color);--bs-btn-bg:transparent;--bs-btn-border-color:transparent;--bs-btn-hover-color:var(--bs-link-hover-color);--bs-btn-hover-border-color:transparent;--bs-btn-active-color:var(--bs-link-hover-color);--bs-btn-active-border-color:transparent;--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-border-color:transparent;--bs-btn-box-shadow:none;--bs-btn-focus-shadow-rgb:49,132,253;text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-group-lg>.btn,.btn-lg{--bs-btn-padding-y:0.5rem;--bs-btn-padding-x:1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius:0.5rem}.btn-group-sm>.btn,.btn-sm{--bs-btn-padding-y:0.25rem;--bs-btn-padding-x:0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius:0.25rem}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropdown-center,.dropend,.dropstart,.dropup,.dropup-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-left:.3em solid transparent;border-bottom:0;border-right:.3em solid transparent}.dropdown-toggle:empty::after{margin-right:0}.dropdown-menu{--bs-dropdown-zindex:1000;--bs-dropdown-min-width:10rem;--bs-dropdown-padding-x:0;--bs-dropdown-padding-y:0.5rem;--bs-dropdown-spacer:0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color:#212529;--bs-dropdown-bg:#fff;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-border-radius:0.375rem;--bs-dropdown-border-width:1px;--bs-dropdown-inner-border-radius:calc(0.375rem - 1px);--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-divider-margin-y:0.5rem;--bs-dropdown-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-dropdown-link-color:#212529;--bs-dropdown-link-hover-color:#1e2125;--bs-dropdown-link-hover-bg:#e9ecef;--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-item-padding-x:1rem;--bs-dropdown-item-padding-y:0.25rem;--bs-dropdown-header-color:#6c757d;--bs-dropdown-header-padding-x:1rem;--bs-dropdown-header-padding-y:0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:right;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;right:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{left:auto;right:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{left:0;right:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{left:auto;right:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{left:0;right:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{left:auto;right:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{left:0;right:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{left:auto;right:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{left:0;right:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{left:auto;right:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{left:0;right:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{left:auto;right:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{left:0;right:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:0;border-left:.3em solid transparent;border-bottom:.3em solid;border-right:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-right:0}.dropend .dropdown-menu[data-bs-popper]{top:0;left:auto;right:100%;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-left:0;border-bottom:.3em solid transparent;border-right:.3em solid}.dropend .dropdown-toggle:empty::after{margin-right:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;left:100%;right:auto;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-right:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-left:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-right:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color:#dee2e6;--bs-dropdown-bg:#343a40;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color:#dee2e6;--bs-dropdown-link-hover-color:#fff;--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-link-hover-bg:rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-header-color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:.375rem}.btn-group>.btn-group:not(:first-child),.btn-group>:not(.btn-check:first-child)+.btn{margin-right:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-right-radius:0;border-bottom-right-radius:0}.dropdown-toggle-split{padding-left:.5625rem;padding-right:.5625rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-right:0}.dropstart .dropdown-toggle-split::before{margin-left:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-left:.375rem;padding-right:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-left:.75rem;padding-right:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-left-radius:0;border-bottom-right-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-right-radius:0;border-top-left-radius:0}.nav{--bs-nav-link-padding-x:1rem;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-link-color);--bs-nav-link-hover-color:var(--bs-link-hover-color);--bs-nav-link-disabled-color:#6c757d;display:flex;flex-wrap:wrap;padding-right:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:var(--bs-nav-link-hover-color)}.nav-link.disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width:1px;--bs-nav-tabs-border-color:#dee2e6;--bs-nav-tabs-border-radius:0.375rem;--bs-nav-tabs-link-hover-border-color:#e9ecef #e9ecef #dee2e6;--bs-nav-tabs-link-active-color:#495057;--bs-nav-tabs-link-active-bg:#fff;--bs-nav-tabs-link-active-border-color:#dee2e6 #dee2e6 #fff;border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1 * var(--bs-nav-tabs-border-width));background:0 0;border:var(--bs-nav-tabs-border-width) solid transparent;border-top-right-radius:var(--bs-nav-tabs-border-radius);border-top-left-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.disabled,.nav-tabs .nav-link:disabled{color:var(--bs-nav-link-disabled-color);background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1 * var(--bs-nav-tabs-border-width));border-top-right-radius:0;border-top-left-radius:0}.nav-pills{--bs-nav-pills-border-radius:0.375rem;--bs-nav-pills-link-active-color:#fff;--bs-nav-pills-link-active-bg:#0d6efd}.nav-pills .nav-link{background:0 0;border:0;border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link:disabled{color:var(--bs-nav-link-disabled-color);background-color:transparent;border-color:transparent}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x:0;--bs-navbar-padding-y:0.5rem;--bs-navbar-color:rgba(0, 0, 0, 0.55);--bs-navbar-hover-color:rgba(0, 0, 0, 0.7);--bs-navbar-disabled-color:rgba(0, 0, 0, 0.3);--bs-navbar-active-color:rgba(0, 0, 0, 0.9);--bs-navbar-brand-padding-y:0.3125rem;--bs-navbar-brand-margin-end:1rem;--bs-navbar-brand-font-size:1.25rem;--bs-navbar-brand-color:rgba(0, 0, 0, 0.9);--bs-navbar-brand-hover-color:rgba(0, 0, 0, 0.9);--bs-navbar-nav-link-padding-x:0.5rem;--bs-navbar-toggler-padding-y:0.25rem;--bs-navbar-toggler-padding-x:0.75rem;--bs-navbar-toggler-font-size:1.25rem;--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color:rgba(0, 0, 0, 0.1);--bs-navbar-toggler-border-radius:0.375rem;--bs-navbar-toggler-focus-width:0.25rem;--bs-navbar-toggler-transition:box-shadow 0.15s ease-in-out;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-left:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x:0;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-navbar-color);--bs-nav-link-hover-color:var(--bs-navbar-hover-color);--bs-nav-link-disabled-color:var(--bs-navbar-disabled-color);display:flex;flex-direction:column;padding-right:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .show>.nav-link{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:focus,.navbar-text a:hover{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:transparent;border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-left:var(--bs-navbar-nav-link-padding-x);padding-right:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-left:var(--bs-navbar-nav-link-padding-x);padding-right:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-left:var(--bs-navbar-nav-link-padding-x);padding-right:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-left:var(--bs-navbar-nav-link-padding-x);padding-right:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-left:var(--bs-navbar-nav-link-padding-x);padding-right:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-left:var(--bs-navbar-nav-link-padding-x);padding-right:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-dark{--bs-navbar-color:rgba(255, 255, 255, 0.55);--bs-navbar-hover-color:rgba(255, 255, 255, 0.75);--bs-navbar-disabled-color:rgba(255, 255, 255, 0.25);--bs-navbar-active-color:#fff;--bs-navbar-brand-color:#fff;--bs-navbar-brand-hover-color:#fff;--bs-navbar-toggler-border-color:rgba(255, 255, 255, 0.1);--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y:1rem;--bs-card-spacer-x:1rem;--bs-card-title-spacer-y:0.5rem;--bs-card-border-width:1px;--bs-card-border-color:var(--bs-border-color-translucent);--bs-card-border-radius:0.375rem;--bs-card-box-shadow: ;--bs-card-inner-border-radius:calc(0.375rem - 1px);--bs-card-cap-padding-y:0.5rem;--bs-card-cap-padding-x:1rem;--bs-card-cap-bg:rgba(0, 0, 0, 0.03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg:#fff;--bs-card-img-overlay-padding:1rem;--bs-card-group-margin:0.75rem;position:relative;display:flex;flex-direction:column;min-width:0;height:var(--bs-card-height);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card>hr{margin-left:0;margin-right:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-right-radius:var(--bs-card-inner-border-radius);border-top-left-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-left-radius:var(--bs-card-inner-border-radius);border-bottom-right-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y)}.card-subtitle{margin-top:calc(-.5 * var(--bs-card-title-spacer-y));margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-right:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-left:calc(-.5 * var(--bs-card-cap-padding-x));margin-bottom:calc(-1 * var(--bs-card-cap-padding-y));margin-right:calc(-.5 * var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-left:calc(-.5 * var(--bs-card-cap-padding-x));margin-right:calc(-.5 * var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;left:0;bottom:0;right:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-right-radius:var(--bs-card-inner-border-radius);border-top-left-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-left-radius:var(--bs-card-inner-border-radius);border-bottom-right-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-right:0;border-right:0}.card-group>.card:not(:last-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-left-radius:0}.card-group>.card:not(:first-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-right-radius:0}}.accordion{--bs-accordion-color:var(--bs-body-color);--bs-accordion-bg:#fff;--bs-accordion-transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out,border-radius 0.15s ease;--bs-accordion-border-color:var(--bs-border-color);--bs-accordion-border-width:1px;--bs-accordion-border-radius:0.375rem;--bs-accordion-inner-border-radius:calc(0.375rem - 1px);--bs-accordion-btn-padding-x:1.25rem;--bs-accordion-btn-padding-y:1rem;--bs-accordion-btn-color:var(--bs-body-color);--bs-accordion-btn-bg:var(--bs-accordion-bg);--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='var%28--bs-body-color%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width:1.25rem;--bs-accordion-btn-icon-transform:rotate(-180deg);--bs-accordion-btn-icon-transition:transform 0.2s ease-in-out;--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-focus-border-color:#86b7fe;--bs-accordion-btn-focus-box-shadow:0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-accordion-body-padding-x:1.25rem;--bs-accordion-body-padding-y:1rem;--bs-accordion-active-color:#0c63e4;--bs-accordion-active-bg:#e7f1ff}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:right;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-right:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--bs-accordion-btn-focus-border-color);outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-right-radius:var(--bs-accordion-border-radius);border-top-left-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type .accordion-button{border-top-right-radius:var(--bs-accordion-inner-border-radius);border-top-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-left-radius:var(--bs-accordion-border-radius);border-bottom-right-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-left-radius:var(--bs-accordion-inner-border-radius);border-bottom-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type .accordion-collapse{border-bottom-left-radius:var(--bs-accordion-border-radius);border-bottom-right-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-left:0;border-right:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button,.accordion-flush .accordion-item .accordion-button.collapsed{border-radius:0}.breadcrumb{--bs-breadcrumb-padding-x:0;--bs-breadcrumb-padding-y:0;--bs-breadcrumb-margin-bottom:1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color:#6c757d;--bs-breadcrumb-item-padding-x:0.5rem;--bs-breadcrumb-item-active-color:#6c757d;display:flex;flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-right:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:right;padding-left:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x:0.75rem;--bs-pagination-padding-y:0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color:var(--bs-link-color);--bs-pagination-bg:#fff;--bs-pagination-border-width:1px;--bs-pagination-border-color:#dee2e6;--bs-pagination-border-radius:0.375rem;--bs-pagination-hover-color:var(--bs-link-hover-color);--bs-pagination-hover-bg:#e9ecef;--bs-pagination-hover-border-color:#dee2e6;--bs-pagination-focus-color:var(--bs-link-hover-color);--bs-pagination-focus-bg:#e9ecef;--bs-pagination-focus-box-shadow:0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-pagination-active-color:#fff;--bs-pagination-active-bg:#0d6efd;--bs-pagination-active-border-color:#0d6efd;--bs-pagination-disabled-color:#6c757d;--bs-pagination-disabled-bg:#fff;--bs-pagination-disabled-border-color:#dee2e6;display:flex;padding-right:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.active>.page-link,.page-link.active{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.disabled>.page-link,.page-link.disabled{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-right:-1px}.page-item:first-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x:1.5rem;--bs-pagination-padding-y:0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius:0.5rem}.pagination-sm{--bs-pagination-padding-x:0.5rem;--bs-pagination-padding-y:0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius:0.25rem}.badge{--bs-badge-padding-x:0.65em;--bs-badge-padding-y:0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight:700;--bs-badge-color:#fff;--bs-badge-border-radius:0.375rem;display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg:transparent;--bs-alert-padding-x:1rem;--bs-alert-padding-y:1rem;--bs-alert-margin-bottom:1rem;--bs-alert-color:inherit;--bs-alert-border-color:transparent;--bs-alert-border:1px solid var(--bs-alert-border-color);--bs-alert-border-radius:0.375rem;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-left:3rem}.alert-dismissible .btn-close{position:absolute;top:0;left:0;z-index:2;padding:1.25rem 1rem}.alert-primary{--bs-alert-color:#084298;--bs-alert-bg:#cfe2ff;--bs-alert-border-color:#b6d4fe}.alert-primary .alert-link{color:#06357a}.alert-secondary{--bs-alert-color:#41464b;--bs-alert-bg:#e2e3e5;--bs-alert-border-color:#d3d6d8}.alert-secondary .alert-link{color:#34383c}.alert-success{--bs-alert-color:#0f5132;--bs-alert-bg:#d1e7dd;--bs-alert-border-color:#badbcc}.alert-success .alert-link{color:#0c4128}.alert-info{--bs-alert-color:#055160;--bs-alert-bg:#cff4fc;--bs-alert-border-color:#b6effb}.alert-info .alert-link{color:#04414d}.alert-warning{--bs-alert-color:#664d03;--bs-alert-bg:#fff3cd;--bs-alert-border-color:#ffecb5}.alert-warning .alert-link{color:#523e02}.alert-danger{--bs-alert-color:#842029;--bs-alert-bg:#f8d7da;--bs-alert-border-color:#f5c2c7}.alert-danger .alert-link{color:#6a1a21}.alert-light{--bs-alert-color:#636464;--bs-alert-bg:#fefefe;--bs-alert-border-color:#fdfdfe}.alert-light .alert-link{color:#4f5050}.alert-dark{--bs-alert-color:#141619;--bs-alert-bg:#d3d3d4;--bs-alert-border-color:#bcbebf}.alert-dark .alert-link{color:#101214}@-webkit-keyframes progress-bar-stripes{0%{background-position-x:1rem}}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{--bs-progress-height:1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg:#e9ecef;--bs-progress-border-radius:0.375rem;--bs-progress-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-progress-bar-color:#fff;--bs-progress-bar-bg:#0d6efd;--bs-progress-bar-transition:width 0.6s ease;display:flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(-45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-bar-animated{-webkit-animation:1s linear infinite progress-bar-stripes;animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.list-group{--bs-list-group-color:#212529;--bs-list-group-bg:#fff;--bs-list-group-border-color:rgba(0, 0, 0, 0.125);--bs-list-group-border-width:1px;--bs-list-group-border-radius:0.375rem;--bs-list-group-item-padding-x:1rem;--bs-list-group-item-padding-y:0.5rem;--bs-list-group-action-color:#495057;--bs-list-group-action-hover-color:#495057;--bs-list-group-action-hover-bg:#f8f9fa;--bs-list-group-action-active-color:#212529;--bs-list-group-action-active-bg:#e9ecef;--bs-list-group-disabled-color:#6c757d;--bs-list-group-disabled-bg:#fff;--bs-list-group-active-color:#fff;--bs-list-group-active-bg:#0d6efd;--bs-list-group-active-border-color:#0d6efd;display:flex;flex-direction:column;padding-right:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-right-radius:inherit;border-top-left-radius:inherit}.list-group-item:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1 * var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-right-radius:var(--bs-list-group-border-radius);border-top-left-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-left-radius:var(--bs-list-group-border-radius);border-bottom-right-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-right-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-right:calc(-1 * var(--bs-list-group-border-width));border-right-width:var(--bs-list-group-border-width)}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-right-radius:var(--bs-list-group-border-radius);border-top-left-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-left-radius:var(--bs-list-group-border-radius);border-bottom-right-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-right-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-right:calc(-1 * var(--bs-list-group-border-width));border-right-width:var(--bs-list-group-border-width)}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-right-radius:var(--bs-list-group-border-radius);border-top-left-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-left-radius:var(--bs-list-group-border-radius);border-bottom-right-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-right-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-right:calc(-1 * var(--bs-list-group-border-width));border-right-width:var(--bs-list-group-border-width)}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-right-radius:var(--bs-list-group-border-radius);border-top-left-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-left-radius:var(--bs-list-group-border-radius);border-bottom-right-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-right-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-right:calc(-1 * var(--bs-list-group-border-width));border-right-width:var(--bs-list-group-border-width)}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-right-radius:var(--bs-list-group-border-radius);border-top-left-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-left-radius:var(--bs-list-group-border-radius);border-bottom-right-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-right-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-right:calc(-1 * var(--bs-list-group-border-width));border-right-width:var(--bs-list-group-border-width)}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-right-radius:var(--bs-list-group-border-radius);border-top-left-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-left-radius:var(--bs-list-group-border-radius);border-bottom-right-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-right-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-right:calc(-1 * var(--bs-list-group-border-width));border-right-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#084298;background-color:#cfe2ff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#084298;background-color:#bacbe6}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#084298;border-color:#084298}.list-group-item-secondary{color:#41464b;background-color:#e2e3e5}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#41464b;background-color:#cbccce}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#41464b;border-color:#41464b}.list-group-item-success{color:#0f5132;background-color:#d1e7dd}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#0f5132;background-color:#bcd0c7}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}.list-group-item-info{color:#055160;background-color:#cff4fc}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#055160;background-color:#badce3}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#055160;border-color:#055160}.list-group-item-warning{color:#664d03;background-color:#fff3cd}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#664d03;background-color:#e6dbb9}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}.list-group-item-danger{color:#842029;background-color:#f8d7da}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#842029;background-color:#dfc2c4}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}.list-group-item-light{color:#636464;background-color:#fefefe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#636464;background-color:#e5e5e5}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#636464;border-color:#636464}.list-group-item-dark{color:#141619;background-color:#d3d3d4}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#141619;background-color:#bebebf}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#141619;border-color:#141619}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:#000;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:.375rem;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25);opacity:1}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{--bs-toast-zindex:1090;--bs-toast-padding-x:0.75rem;--bs-toast-padding-y:0.5rem;--bs-toast-spacing:1.5rem;--bs-toast-max-width:350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg:rgba(255, 255, 255, 0.85);--bs-toast-border-width:1px;--bs-toast-border-color:var(--bs-border-color-translucent);--bs-toast-border-radius:0.375rem;--bs-toast-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-toast-header-color:#6c757d;--bs-toast-header-bg:rgba(255, 255, 255, 0.85);--bs-toast-header-border-color:rgba(0, 0, 0, 0.05);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{position:absolute;z-index:var(--bs-toast-zindex);width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-left:calc(-.5 * var(--bs-toast-padding-x));margin-right:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex:1055;--bs-modal-width:500px;--bs-modal-padding:1rem;--bs-modal-margin:0.5rem;--bs-modal-color: ;--bs-modal-bg:#fff;--bs-modal-border-color:var(--bs-border-color-translucent);--bs-modal-border-width:1px;--bs-modal-border-radius:0.5rem;--bs-modal-box-shadow:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-modal-inner-border-radius:calc(0.5rem - 1px);--bs-modal-header-padding-x:1rem;--bs-modal-header-padding-y:1rem;--bs-modal-header-padding:1rem 1rem;--bs-modal-header-border-color:var(--bs-border-color);--bs-modal-header-border-width:1px;--bs-modal-title-line-height:1.5;--bs-modal-footer-gap:0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color:var(--bs-border-color);--bs-modal-footer-border-width:1px;position:fixed;top:0;right:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin) * 2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - var(--bs-modal-margin) * 2)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-backdrop{--bs-backdrop-zindex:1050;--bs-backdrop-bg:#000;--bs-backdrop-opacity:0.5;position:fixed;top:0;right:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-right-radius:var(--bs-modal-inner-border-radius);border-top-left-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y) * .5) calc(var(--bs-modal-header-padding-x) * .5);margin:calc(-.5 * var(--bs-modal-header-padding-y)) auto calc(-.5 * var(--bs-modal-header-padding-y)) calc(-.5 * var(--bs-modal-header-padding-x))}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;flex-shrink:0;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * .5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-left-radius:var(--bs-modal-inner-border-radius);border-bottom-right-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap) * .5)}@media (min-width:576px){.modal{--bs-modal-margin:1.75rem;--bs-modal-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15)}.modal-dialog{max-width:var(--bs-modal-width);margin-left:auto;margin-right:auto}.modal-sm{--bs-modal-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{--bs-modal-width:800px}}@media (min-width:1200px){.modal-xl{--bs-modal-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-footer,.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-footer,.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-footer,.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-footer,.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-footer,.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-footer,.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex:1080;--bs-tooltip-max-width:200px;--bs-tooltip-padding-x:0.5rem;--bs-tooltip-padding-y:0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color:#fff;--bs-tooltip-bg:#000;--bs-tooltip-border-radius:0.375rem;--bs-tooltip-opacity:0.9;--bs-tooltip-arrow-width:0.8rem;--bs-tooltip-arrow-height:0.4rem;z-index:var(--bs-tooltip-zindex);display:block;padding:var(--bs-tooltip-arrow-height);margin:var(--bs-tooltip-margin);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:right;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:0;width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:0;width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex:1070;--bs-popover-max-width:276px;--bs-popover-font-size:0.875rem;--bs-popover-bg:#fff;--bs-popover-border-width:1px;--bs-popover-border-color:var(--bs-border-color-translucent);--bs-popover-border-radius:0.5rem;--bs-popover-inner-border-radius:calc(0.5rem - 1px);--bs-popover-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-popover-header-padding-x:1rem;--bs-popover-header-padding-y:0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color: ;--bs-popover-header-bg:#f0f0f0;--bs-popover-body-padding-x:1rem;--bs-popover-body-padding-y:1rem;--bs-popover-body-color:#212529;--bs-popover-arrow-width:1rem;--bs-popover-arrow-height:0.5rem;--bs-popover-arrow-border:var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:right;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid;border-width:0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-top>.popover-arrow::before{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-end>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::before{border-width:0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;right:50%;display:block;width:var(--bs-popover-arrow-width);margin-right:calc(-.5 * var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-start>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) 0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-right-radius:var(--bs-popover-inner-border-radius);border-top-left-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:right;width:100%;margin-left:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{right:0}.carousel-control-next{left:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;left:0;bottom:0;right:0;z-index:2;display:flex;justify-content:center;padding:0;margin-left:15%;margin-bottom:1rem;margin-right:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-left:3px;margin-right:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;left:15%;bottom:1.25rem;right:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}.spinner-border,.spinner-grow{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;-webkit-animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name);animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@-webkit-keyframes spinner-border{to{transform:rotate(360deg)}}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-border-width:0.25em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-left-color:transparent}.spinner-border-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem;--bs-spinner-border-width:0.2em}@-webkit-keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed:1.5s}}.offcanvas,.offcanvas-lg,.offcanvas-md,.offcanvas-sm,.offcanvas-xl,.offcanvas-xxl{--bs-offcanvas-zindex:1045;--bs-offcanvas-width:400px;--bs-offcanvas-height:30vh;--bs-offcanvas-padding-x:1rem;--bs-offcanvas-padding-y:1rem;--bs-offcanvas-color: ;--bs-offcanvas-bg:#fff;--bs-offcanvas-border-width:1px;--bs-offcanvas-border-color:var(--bs-border-color-translucent);--bs-offcanvas-box-shadow:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075)}@media (max-width:575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:575.98px) and (prefers-reduced-motion:reduce){.offcanvas-sm{transition:none}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-start{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-end{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-top{top:0;left:0;right:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-bottom{left:0;right:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:575.98px){.offcanvas-sm.show:not(.hiding),.offcanvas-sm.showing{transform:none}}@media (max-width:575.98px){.offcanvas-sm.hiding,.offcanvas-sm.show,.offcanvas-sm.showing{visibility:visible}}@media (min-width:576px){.offcanvas-sm{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:767.98px) and (prefers-reduced-motion:reduce){.offcanvas-md{transition:none}}@media (max-width:767.98px){.offcanvas-md.offcanvas-start{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:767.98px){.offcanvas-md.offcanvas-end{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:767.98px){.offcanvas-md.offcanvas-top{top:0;left:0;right:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:767.98px){.offcanvas-md.offcanvas-bottom{left:0;right:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:767.98px){.offcanvas-md.show:not(.hiding),.offcanvas-md.showing{transform:none}}@media (max-width:767.98px){.offcanvas-md.hiding,.offcanvas-md.show,.offcanvas-md.showing{visibility:visible}}@media (min-width:768px){.offcanvas-md{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:991.98px) and (prefers-reduced-motion:reduce){.offcanvas-lg{transition:none}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-start{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-end{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-top{top:0;left:0;right:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-bottom{left:0;right:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:991.98px){.offcanvas-lg.show:not(.hiding),.offcanvas-lg.showing{transform:none}}@media (max-width:991.98px){.offcanvas-lg.hiding,.offcanvas-lg.show,.offcanvas-lg.showing{visibility:visible}}@media (min-width:992px){.offcanvas-lg{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:1199.98px) and (prefers-reduced-motion:reduce){.offcanvas-xl{transition:none}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-start{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-end{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-top{top:0;left:0;right:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-bottom{left:0;right:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:1199.98px){.offcanvas-xl.show:not(.hiding),.offcanvas-xl.showing{transform:none}}@media (max-width:1199.98px){.offcanvas-xl.hiding,.offcanvas-xl.show,.offcanvas-xl.showing{visibility:visible}}@media (min-width:1200px){.offcanvas-xl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:1399.98px) and (prefers-reduced-motion:reduce){.offcanvas-xxl{transition:none}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-start{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-end{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-top{top:0;left:0;right:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-bottom{left:0;right:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:1399.98px){.offcanvas-xxl.show:not(.hiding),.offcanvas-xxl.showing{transform:none}}@media (max-width:1399.98px){.offcanvas-xxl.hiding,.offcanvas-xxl.show,.offcanvas-xxl.showing{visibility:visible}}@media (min-width:1400px){.offcanvas-xxl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-end{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-top{top:0;left:0;right:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{left:0;right:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.show:not(.hiding),.offcanvas.showing{transform:none}.offcanvas.hiding,.offcanvas.show,.offcanvas.showing{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;right:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y) * .5) calc(var(--bs-offcanvas-padding-x) * .5);margin-top:calc(-.5 * var(--bs-offcanvas-padding-y));margin-left:calc(-.5 * var(--bs-offcanvas-padding-x));margin-bottom:calc(-.5 * var(--bs-offcanvas-padding-y))}.offcanvas-title{margin-bottom:0;line-height:1.5}.offcanvas-body{flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{-webkit-animation:placeholder-glow 2s ease-in-out infinite;animation:placeholder-glow 2s ease-in-out infinite}@-webkit-keyframes placeholder-glow{50%{opacity:.2}}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%;-webkit-animation:placeholder-wave 2s linear infinite;animation:placeholder-wave 2s linear infinite}@-webkit-keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}@keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-primary{color:#fff!important;background-color:RGBA(13,110,253,var(--bs-bg-opacity,1))!important}.text-bg-secondary{color:#fff!important;background-color:RGBA(108,117,125,var(--bs-bg-opacity,1))!important}.text-bg-success{color:#fff!important;background-color:RGBA(25,135,84,var(--bs-bg-opacity,1))!important}.text-bg-info{color:#000!important;background-color:RGBA(13,202,240,var(--bs-bg-opacity,1))!important}.text-bg-warning{color:#000!important;background-color:RGBA(255,193,7,var(--bs-bg-opacity,1))!important}.text-bg-danger{color:#fff!important;background-color:RGBA(220,53,69,var(--bs-bg-opacity,1))!important}.text-bg-light{color:#000!important;background-color:RGBA(248,249,250,var(--bs-bg-opacity,1))!important}.text-bg-dark{color:#fff!important;background-color:RGBA(33,37,41,var(--bs-bg-opacity,1))!important}.link-primary{color:#0d6efd!important}.link-primary:focus,.link-primary:hover{color:#0a58ca!important}.link-secondary{color:#6c757d!important}.link-secondary:focus,.link-secondary:hover{color:#565e64!important}.link-success{color:#198754!important}.link-success:focus,.link-success:hover{color:#146c43!important}.link-info{color:#0dcaf0!important}.link-info:focus,.link-info:hover{color:#3dd5f3!important}.link-warning{color:#ffc107!important}.link-warning:focus,.link-warning:hover{color:#ffcd39!important}.link-danger{color:#dc3545!important}.link-danger:focus,.link-danger:hover{color:#b02a37!important}.link-light{color:#f8f9fa!important}.link-light:focus,.link-light:hover{color:#f9fafb!important}.link-dark{color:#212529!important}.link-dark:focus,.link-dark:hover{color:#1a1e21!important}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;right:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:75%}.ratio-16x9{--bs-aspect-ratio:56.25%}.ratio-21x9{--bs-aspect-ratio:42.8571428571%}.fixed-top{position:fixed;top:0;left:0;right:0;z-index:1030}.fixed-bottom{position:fixed;left:0;bottom:0;right:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.stretched-link::after{position:absolute;top:0;left:0;bottom:0;right:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:1px;min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:right!important}.float-end{float:left!important}.float-none{float:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{right:0!important}.start-50{right:50%!important}.start-100{right:100%!important}.end-0{left:0!important}.end-50{left:50%!important}.end-100{left:100%!important}.translate-middle{transform:translate(50%,-50%)!important}.translate-middle-x{transform:translateX(50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-0{border:0!important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-top-0{border-top:0!important}.border-end{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-end-0{border-left:0!important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-bottom-0{border-bottom:0!important}.border-start{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-start-0{border-right:0!important}.border-primary{--bs-border-opacity:1;border-color:rgba(var(--bs-primary-rgb),var(--bs-border-opacity))!important}.border-secondary{--bs-border-opacity:1;border-color:rgba(var(--bs-secondary-rgb),var(--bs-border-opacity))!important}.border-success{--bs-border-opacity:1;border-color:rgba(var(--bs-success-rgb),var(--bs-border-opacity))!important}.border-info{--bs-border-opacity:1;border-color:rgba(var(--bs-info-rgb),var(--bs-border-opacity))!important}.border-warning{--bs-border-opacity:1;border-color:rgba(var(--bs-warning-rgb),var(--bs-border-opacity))!important}.border-danger{--bs-border-opacity:1;border-color:rgba(var(--bs-danger-rgb),var(--bs-border-opacity))!important}.border-light{--bs-border-opacity:1;border-color:rgba(var(--bs-light-rgb),var(--bs-border-opacity))!important}.border-dark{--bs-border-opacity:1;border-color:rgba(var(--bs-dark-rgb),var(--bs-border-opacity))!important}.border-white{--bs-border-opacity:1;border-color:rgba(var(--bs-white-rgb),var(--bs-border-opacity))!important}.border-1{--bs-border-width:1px}.border-2{--bs-border-width:2px}.border-3{--bs-border-width:3px}.border-4{--bs-border-width:4px}.border-5{--bs-border-width:5px}.border-opacity-10{--bs-border-opacity:0.1}.border-opacity-25{--bs-border-opacity:0.25}.border-opacity-50{--bs-border-opacity:0.5}.border-opacity-75{--bs-border-opacity:0.75}.border-opacity-100{--bs-border-opacity:1}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-left:0!important;margin-right:0!important}.mx-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-3{margin-left:1rem!important;margin-right:1rem!important}.mx-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-5{margin-left:3rem!important;margin-right:3rem!important}.mx-auto{margin-left:auto!important;margin-right:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-left:0!important}.me-1{margin-left:.25rem!important}.me-2{margin-left:.5rem!important}.me-3{margin-left:1rem!important}.me-4{margin-left:1.5rem!important}.me-5{margin-left:3rem!important}.me-auto{margin-left:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-right:0!important}.ms-1{margin-right:.25rem!important}.ms-2{margin-right:.5rem!important}.ms-3{margin-right:1rem!important}.ms-4{margin-right:1.5rem!important}.ms-5{margin-right:3rem!important}.ms-auto{margin-right:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-left:0!important;padding-right:0!important}.px-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-3{padding-left:1rem!important;padding-right:1rem!important}.px-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-5{padding-left:3rem!important;padding-right:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-left:0!important}.pe-1{padding-left:.25rem!important}.pe-2{padding-left:.5rem!important}.pe-3{padding-left:1rem!important}.pe-4{padding-left:1.5rem!important}.pe-5{padding-left:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-right:0!important}.ps-1{padding-right:.25rem!important}.ps-2{padding-right:.5rem!important}.ps-3{padding-right:1rem!important}.ps-4{padding-right:1.5rem!important}.ps-5{padding-right:3rem!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:300!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!important}.fw-bold{font-weight:700!important}.fw-semibold{font-weight:600!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:right!important}.text-end{text-align:left!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-color-rgb),var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:#6c757d!important}.text-black-50{--bs-text-opacity:1;color:rgba(0,0,0,.5)!important}.text-white-50{--bs-text-opacity:1;color:rgba(255,255,255,.5)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:0.25}.text-opacity-50{--bs-text-opacity:0.5}.text-opacity-75{--bs-text-opacity:0.75}.text-opacity-100{--bs-text-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-bg-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:transparent!important}.bg-opacity-10{--bs-bg-opacity:0.1}.bg-opacity-25{--bs-bg-opacity:0.25}.bg-opacity-50{--bs-bg-opacity:0.5}.bg-opacity-75{--bs-bg-opacity:0.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:var(--bs-border-radius)!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:var(--bs-border-radius-sm)!important}.rounded-2{border-radius:var(--bs-border-radius)!important}.rounded-3{border-radius:var(--bs-border-radius-lg)!important}.rounded-4{border-radius:var(--bs-border-radius-xl)!important}.rounded-5{border-radius:var(--bs-border-radius-2xl)!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:var(--bs-border-radius-pill)!important}.rounded-top{border-top-right-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-end{border-top-left-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom{border-bottom-left-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-start{border-bottom-right-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media (min-width:576px){.float-sm-start{float:right!important}.float-sm-end{float:left!important}.float-sm-none{float:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-left:0!important;margin-right:0!important}.mx-sm-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-sm-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-sm-3{margin-left:1rem!important;margin-right:1rem!important}.mx-sm-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-sm-5{margin-left:3rem!important;margin-right:3rem!important}.mx-sm-auto{margin-left:auto!important;margin-right:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-left:0!important}.me-sm-1{margin-left:.25rem!important}.me-sm-2{margin-left:.5rem!important}.me-sm-3{margin-left:1rem!important}.me-sm-4{margin-left:1.5rem!important}.me-sm-5{margin-left:3rem!important}.me-sm-auto{margin-left:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-right:0!important}.ms-sm-1{margin-right:.25rem!important}.ms-sm-2{margin-right:.5rem!important}.ms-sm-3{margin-right:1rem!important}.ms-sm-4{margin-right:1.5rem!important}.ms-sm-5{margin-right:3rem!important}.ms-sm-auto{margin-right:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-left:0!important;padding-right:0!important}.px-sm-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-sm-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-sm-3{padding-left:1rem!important;padding-right:1rem!important}.px-sm-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-sm-5{padding-left:3rem!important;padding-right:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-left:0!important}.pe-sm-1{padding-left:.25rem!important}.pe-sm-2{padding-left:.5rem!important}.pe-sm-3{padding-left:1rem!important}.pe-sm-4{padding-left:1.5rem!important}.pe-sm-5{padding-left:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-right:0!important}.ps-sm-1{padding-right:.25rem!important}.ps-sm-2{padding-right:.5rem!important}.ps-sm-3{padding-right:1rem!important}.ps-sm-4{padding-right:1.5rem!important}.ps-sm-5{padding-right:3rem!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.text-sm-start{text-align:right!important}.text-sm-end{text-align:left!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:right!important}.float-md-end{float:left!important}.float-md-none{float:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-left:0!important;margin-right:0!important}.mx-md-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-md-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-md-3{margin-left:1rem!important;margin-right:1rem!important}.mx-md-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-md-5{margin-left:3rem!important;margin-right:3rem!important}.mx-md-auto{margin-left:auto!important;margin-right:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-left:0!important}.me-md-1{margin-left:.25rem!important}.me-md-2{margin-left:.5rem!important}.me-md-3{margin-left:1rem!important}.me-md-4{margin-left:1.5rem!important}.me-md-5{margin-left:3rem!important}.me-md-auto{margin-left:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-right:0!important}.ms-md-1{margin-right:.25rem!important}.ms-md-2{margin-right:.5rem!important}.ms-md-3{margin-right:1rem!important}.ms-md-4{margin-right:1.5rem!important}.ms-md-5{margin-right:3rem!important}.ms-md-auto{margin-right:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-left:0!important;padding-right:0!important}.px-md-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-md-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-md-3{padding-left:1rem!important;padding-right:1rem!important}.px-md-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-md-5{padding-left:3rem!important;padding-right:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-left:0!important}.pe-md-1{padding-left:.25rem!important}.pe-md-2{padding-left:.5rem!important}.pe-md-3{padding-left:1rem!important}.pe-md-4{padding-left:1.5rem!important}.pe-md-5{padding-left:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-right:0!important}.ps-md-1{padding-right:.25rem!important}.ps-md-2{padding-right:.5rem!important}.ps-md-3{padding-right:1rem!important}.ps-md-4{padding-right:1.5rem!important}.ps-md-5{padding-right:3rem!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.text-md-start{text-align:right!important}.text-md-end{text-align:left!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:right!important}.float-lg-end{float:left!important}.float-lg-none{float:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-left:0!important;margin-right:0!important}.mx-lg-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-lg-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-lg-3{margin-left:1rem!important;margin-right:1rem!important}.mx-lg-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-lg-5{margin-left:3rem!important;margin-right:3rem!important}.mx-lg-auto{margin-left:auto!important;margin-right:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-left:0!important}.me-lg-1{margin-left:.25rem!important}.me-lg-2{margin-left:.5rem!important}.me-lg-3{margin-left:1rem!important}.me-lg-4{margin-left:1.5rem!important}.me-lg-5{margin-left:3rem!important}.me-lg-auto{margin-left:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-right:0!important}.ms-lg-1{margin-right:.25rem!important}.ms-lg-2{margin-right:.5rem!important}.ms-lg-3{margin-right:1rem!important}.ms-lg-4{margin-right:1.5rem!important}.ms-lg-5{margin-right:3rem!important}.ms-lg-auto{margin-right:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-left:0!important;padding-right:0!important}.px-lg-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-lg-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-lg-3{padding-left:1rem!important;padding-right:1rem!important}.px-lg-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-lg-5{padding-left:3rem!important;padding-right:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-left:0!important}.pe-lg-1{padding-left:.25rem!important}.pe-lg-2{padding-left:.5rem!important}.pe-lg-3{padding-left:1rem!important}.pe-lg-4{padding-left:1.5rem!important}.pe-lg-5{padding-left:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-right:0!important}.ps-lg-1{padding-right:.25rem!important}.ps-lg-2{padding-right:.5rem!important}.ps-lg-3{padding-right:1rem!important}.ps-lg-4{padding-right:1.5rem!important}.ps-lg-5{padding-right:3rem!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.text-lg-start{text-align:right!important}.text-lg-end{text-align:left!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:right!important}.float-xl-end{float:left!important}.float-xl-none{float:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-left:0!important;margin-right:0!important}.mx-xl-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-xl-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-xl-3{margin-left:1rem!important;margin-right:1rem!important}.mx-xl-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-xl-5{margin-left:3rem!important;margin-right:3rem!important}.mx-xl-auto{margin-left:auto!important;margin-right:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-left:0!important}.me-xl-1{margin-left:.25rem!important}.me-xl-2{margin-left:.5rem!important}.me-xl-3{margin-left:1rem!important}.me-xl-4{margin-left:1.5rem!important}.me-xl-5{margin-left:3rem!important}.me-xl-auto{margin-left:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-right:0!important}.ms-xl-1{margin-right:.25rem!important}.ms-xl-2{margin-right:.5rem!important}.ms-xl-3{margin-right:1rem!important}.ms-xl-4{margin-right:1.5rem!important}.ms-xl-5{margin-right:3rem!important}.ms-xl-auto{margin-right:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-left:0!important;padding-right:0!important}.px-xl-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-xl-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-xl-3{padding-left:1rem!important;padding-right:1rem!important}.px-xl-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-xl-5{padding-left:3rem!important;padding-right:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-left:0!important}.pe-xl-1{padding-left:.25rem!important}.pe-xl-2{padding-left:.5rem!important}.pe-xl-3{padding-left:1rem!important}.pe-xl-4{padding-left:1.5rem!important}.pe-xl-5{padding-left:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-right:0!important}.ps-xl-1{padding-right:.25rem!important}.ps-xl-2{padding-right:.5rem!important}.ps-xl-3{padding-right:1rem!important}.ps-xl-4{padding-right:1.5rem!important}.ps-xl-5{padding-right:3rem!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.text-xl-start{text-align:right!important}.text-xl-end{text-align:left!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:right!important}.float-xxl-end{float:left!important}.float-xxl-none{float:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-left:0!important;margin-right:0!important}.mx-xxl-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-xxl-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-xxl-3{margin-left:1rem!important;margin-right:1rem!important}.mx-xxl-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-xxl-5{margin-left:3rem!important;margin-right:3rem!important}.mx-xxl-auto{margin-left:auto!important;margin-right:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-left:0!important}.me-xxl-1{margin-left:.25rem!important}.me-xxl-2{margin-left:.5rem!important}.me-xxl-3{margin-left:1rem!important}.me-xxl-4{margin-left:1.5rem!important}.me-xxl-5{margin-left:3rem!important}.me-xxl-auto{margin-left:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-right:0!important}.ms-xxl-1{margin-right:.25rem!important}.ms-xxl-2{margin-right:.5rem!important}.ms-xxl-3{margin-right:1rem!important}.ms-xxl-4{margin-right:1.5rem!important}.ms-xxl-5{margin-right:3rem!important}.ms-xxl-auto{margin-right:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-left:0!important;padding-right:0!important}.px-xxl-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-xxl-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-xxl-3{padding-left:1rem!important;padding-right:1rem!important}.px-xxl-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-xxl-5{padding-left:3rem!important;padding-right:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-left:0!important}.pe-xxl-1{padding-left:.25rem!important}.pe-xxl-2{padding-left:.5rem!important}.pe-xxl-3{padding-left:1rem!important}.pe-xxl-4{padding-left:1.5rem!important}.pe-xxl-5{padding-left:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-right:0!important}.ps-xxl-1{padding-right:.25rem!important}.ps-xxl-2{padding-right:.5rem!important}.ps-xxl-3{padding-right:1rem!important}.ps-xxl-4{padding-right:1.5rem!important}.ps-xxl-5{padding-right:3rem!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.text-xxl-start{text-align:right!important}.text-xxl-end{text-align:left!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}} diff --git a/assets/css/custom.css b/assets/css/custom.css new file mode 100644 index 000000000..6ce37f1d7 --- /dev/null +++ b/assets/css/custom.css @@ -0,0 +1 @@ +body{font-family:"Open Sans",sans-serif;font-weight:400;color:#4c4c4c;background-color:#edeef0;max-width:1200px;margin:0 auto}.navbar .nav-top{height:86px}.navbar .fixed-menu{width:220px}.navbar .logo img{width:200px}a{text-decoration:none}a a:hover:not(.btn){color:#021a34 !important}h1,h2{font-weight:500;line-height:1.25;padding-bottom:12px;padding-top:14px}h1{font-weight:600}.motto .title{font-weight:600;font-size:32px;padding-top:18px}.motto .motto{font-weight:500;font-size:21px}.btn-fixed{border-width:2px;border-style:solid;width:220px;height:46px;text-transform:uppercase;font-weight:700;border-radius:0%;vertical-align:middle !important;line-height:46px;padding:0;margin:16px}.btn-fixed.btn-more{color:#021a34;border-color:#021a34}.btn-fixed.btn-more:hover{background-color:#021a34;color:#edeef0 !important}.btn-fixed.btn-faq{border-color:#021a34;background-color:#021a34;color:#edeef0}.btn-fixed.btn-faq:hover{background-color:#021a34;color:#edeef0 !important}.btn-fixed.btn-community{border-color:#e03c3c;background-color:#e03c3c;color:#edeef0 !important}.btn-fixed.btn-community:hover{background-color:#e03c3c;color:#edeef0 !important}.footer .text-muted{color:#edeef0 !important;font-size:12px}.footer .text-muted a{color:#edeef0 !important}.pactus-video video{max-width:100%;width:100%;margin-left:auto;margin-right:auto;display:block}.highlighter-rouge .highlight pre{padding:32px 12px 12px 12px;color:#edeef0;position:relative;overflow:auto;direction:ltr}.highlighter-rouge .highlight pre button{position:absolute;top:6px;right:8px;padding:2px;background-color:gray;color:#404040;border-radius:5px;border:ridge 1px gray}.highlighter-rouge .highlight pre button:hover{cursor:pointer;background-color:#bcbabb}.nav-tabs{border-color:#404040 !important}.nav-tabs a{color:#404040}.nav-tabs .nav-link{border-width:0 !important}.nav-tabs .nav-link:not(.active):hover{background-color:gray !important;color:#edeef0 !important}.nav-tabs .active{color:#edeef0 !important;background-color:#404040 !important}table tbody tr:nth-child(2n+1) td{background-color:#eee}blockquote{background:#eee;border-left:10px solid #ccc;padding:16px;quotes:"“" "”" "‘" "’"}blockquote:before{color:#ccc;content:open-quote;font-size:64px;line-height:.1em;vertical-align:-0.4em}blockquote p{margin-top:16px}blockquote p:first-child{display:inline;padding-bottom:160px;margin-bottom:160px}.footer{background-color:#021a34 !important;color:#edeef0 !important}.footer .section{font-size:1.75rem;font-weight:500;line-height:1.25;padding-bottom:20px}.footer li{padding-bottom:8px !important}.footer.anchor a{color:#fff}.footer.anchor a:link{color:#eff1ef;background-color:rgba(0,0,0,0) !important;text-decoration:none !important}.footer.anchor a:hover{color:#eff1ef !important}.community img{margin:4px}#btn-back-to-top{background-color:#021a34;color:#edeef0;position:fixed;bottom:20px;right:20px;display:none}.edit-bar{padding-top:30px}.edit-bar .edit-btn,.edit-bar .edit-btn>a:hover{color:#4c4c4c;text-decoration:none}.all-posts .post-link{padding-bottom:8px}.blog-post .post-date{padding-bottom:10px;color:gray}.blog-post .content{padding-top:22px;min-height:600px}.partners img{padding-top:24px}.hexdump{font-family:monospace;font-size:12px;padding-bottom:1rem}.hexdump .offset{border-right:2px solid #708090;color:#789}.hexdump .ascii{color:dimgray}.faq h3{margin-top:20px;padding-top:16px;border-top:1px solid #4c4c4c}.faq a{text-decoration:none}.faq .group{padding-top:16px}.faq .group .col{font-weight:600;padding-bottom:10px}.faq .separator{padding-top:12px;padding-bottom:12px}.toc .btn,.toc a{color:#4c4c4c !important}.toc .btn-section{padding:.25rem .5rem;font-weight:600;background-color:rgba(0,0,0,0)}.toc .btn-section:hover,.toc .btn-section:focus{background-color:#d2f4ea}.toc .btn-section::before{width:1.25em;line-height:0;content:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='rgba%280,0,0,.5%29' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 14l6-6-6-6'/%3e%3c/svg%3e");transition:transform .35s ease;transform-origin:.5em 50%}.toc .btn-page a{padding:.1875rem .5rem;margin-top:.125rem;margin-left:1.25rem}.toc .btn-page a:hover,.toc .btn-page a:focus,.toc .btn-page .selected{background-color:#d2f4ea}.timeline{position:relative}.timeline::after{content:"";position:absolute;width:6px;background-color:#939597;top:0;bottom:0;left:50%;margin-left:-3px}.timeline-card{position:relative;background-color:inherit;width:50%}.timeline-card .card-title{padding-bottom:12px;font-size:1.3rem;font-weight:500}.timeline-card::after{line-height:38px;font-size:24px;position:absolute;text-align:center;width:48px;height:48px;right:-24px;top:15px;border-radius:50%;z-index:1}.timeline-card.completed::after{content:"✅";background-color:#eee;border:5px solid #77b255}.timeline-card.ongoing::after{content:"🚧";background-color:#eee;border:5px solid #ffcb4b}.timeline-card.upcoming::after{content:"⏳";background-color:#eee;border:5px solid #478ec2}.timeline-card.left{padding:0px 50px 20px 0px;left:0}.timeline-card.right{padding:0px 0px 20px 50px;left:50%}.timeline-card.left::before{content:"";position:absolute;height:20px;width:20px;background:#fff;box-sizing:border-box;transform:rotate(45deg) translate(-50%);top:34px;z-index:0;right:34px;border:1px solid rgba(0,0,0,.175)}.timeline-card.right::before{content:"";position:absolute;height:20px;width:20px;background:#fff;box-sizing:border-box;transform:rotate(45deg) translate(-50%);top:34px;z-index:0;left:48px;border:1px solid rgba(0,0,0,.175)}.timeline-card.right::after{left:-24px}@media screen and (max-width: 600px){.timeline::after{left:31px}.timeline-card{width:100%;padding-left:80px !important;padding-right:25px !important}.timeline-card::before{left:80px !important}.timeline-card.left::after,.timeline-card.right::after{left:8px !important}.timeline-card.left::before{right:auto}.timeline-card.right{left:0%}}.learn h2{border-top:1px solid gray}/*# sourceMappingURL=custom.css.map */ \ No newline at end of file diff --git a/assets/css/custom.css.map b/assets/css/custom.css.map new file mode 100644 index 000000000..4131e3d24 --- /dev/null +++ b/assets/css/custom.css.map @@ -0,0 +1 @@ +{"version":3,"sourceRoot":"","sources":["../../_sass/_styles.scss","../../_sass/_vars.scss","../../_sass/_hexdump.scss","../../_sass/_faq.scss","../../_sass/_toc.scss","../../_sass/_roadmap.scss","../../_sass/_learn.scss"],"names":[],"mappings":"CAEA,KACE,mCACA,gBACA,MCFW,QDGX,iBCJS,QDKT,iBACA,cAIA,iBACE,YAGF,oBACE,YAGF,kBACE,YAIJ,EACE,qBAEA,oBACE,yBAIJ,MAEE,gBACA,iBACA,oBACA,iBAGF,GACE,gBAIA,cACE,gBACA,eACA,iBAGF,cACE,gBACA,eAKJ,WACE,iBACA,mBACA,YACA,YACA,yBACA,gBACA,iBACA,iCACA,iBACA,UACA,YAEA,oBACE,MCzEY,QD0EZ,aC1EY,QD4EZ,0BACE,iBC7EU,QD8EV,yBAIJ,mBACE,aCnFY,QDoFZ,iBCpFY,QDqFZ,MCnFO,QDqFP,yBACE,iBCxFU,QDyFV,yBAIJ,yBACE,aC1Fc,QD2Fd,iBC3Fc,QD4Fd,yBAEA,+BACE,iBC/FY,QDgGZ,yBAMJ,oBACE,yBACA,eAEA,sBACE,yBAMJ,oBACE,eACA,WACA,iBACA,kBACA,cAIJ,kCACE,4BACA,MC9HS,QD+HT,kBACA,cACA,cAEA,yCACE,kBACA,QACA,UAEA,YACA,sBACA,cACA,kBACA,sBAEA,+CACE,eACA,yBAKN,UACE,gCAEA,YACE,cAGF,oBACE,0BAEA,uCACE,iCACA,yBAIJ,kBACE,yBACA,oCAKF,kCACE,sBAIJ,WACE,gBACA,4BACA,aACA,uBAEA,kBACE,WACA,mBACA,eACA,iBACA,sBAGF,aACE,gBAGF,yBACE,eACA,qBACA,oBAIJ,QACE,oCACA,yBAEA,iBACE,kBACA,gBACA,iBACA,oBAGF,WACE,8BAIA,iBACE,WAGF,sBACE,cACA,0CACA,gCAGF,uBACE,yBAMJ,eACE,WAIJ,iBACE,iBCnPc,QDoPd,MClPS,QDmPT,eACA,YACA,WACA,aAGF,UACE,iBAGA,gDAEE,MC9PS,QD+PT,qBAKF,sBACE,mBAKF,sBACE,oBACA,WAEF,oBACE,iBACA,iBAKF,cACE,iBEzRJ,SACE,sBACA,eACA,oBAGF,iBACE,+BACA,WAEF,gBACE,cCRA,QACE,gBACA,iBACA,6BAGF,OACE,qBAGF,YACE,iBAEA,iBACE,gBACA,oBAIJ,gBACE,iBACA,oBCrBF,iBAEE,yBAGF,kBACE,qBACA,gBACA,+BAGF,gDAEE,yBAGF,0BACE,aACA,cACA,yQACA,+BACA,0BAGF,iBACE,uBACA,mBACA,oBAGF,uEAGE,yBCjCJ,UACE,kBAGA,iBACE,WACA,kBACA,UACA,iBAXS,QAYT,MACA,SACA,SACA,iBAKJ,eACE,kBACA,yBACA,UAEA,2BACE,oBACA,iBACA,gBAGF,sBACE,iBACA,eACA,kBACA,kBACA,WACA,YACA,YACA,SACA,kBACA,UAGF,gCACE,YACA,sBACA,yBAGF,8BACE,aACA,sBACA,yBAGF,+BACE,YACA,sBACA,yBAIF,oBACE,0BACA,OAIF,qBACE,0BACA,SAIF,4BACE,WACA,kBACA,YACA,WACA,gBACA,sBACA,wCACA,SACA,UACA,WACA,kCAIF,6BACE,WACA,kBACA,YACA,WACA,gBACA,sBACA,wCACA,SACA,UACA,UACA,kCAIF,4BACE,WAKJ,qCAEE,iBACE,UAIF,eACE,WACA,6BACA,8BAGA,uBACE,qBAIF,uDAEE,oBAGF,4BACE,WAIF,qBACE,SCzIJ,UACE,WLCS","sourcesContent":["@import \"vars\";\n\nbody {\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n color: $font-color;\n background-color: $bg-color;\n max-width: 1200px;\n margin: 0 auto;\n}\n\n.navbar {\n .nav-top {\n height: 86px;\n }\n\n .fixed-menu {\n width: 220px;\n }\n\n .logo img {\n width: 200px;\n }\n}\n\na {\n text-decoration: none;\n\n a:hover:not(.btn) {\n color: $primary-color !important;\n }\n}\n\nh1,\nh2 {\n font-weight: 500;\n line-height: 1.25;\n padding-bottom: 12px;\n padding-top: 14px;\n}\n\nh1 {\n font-weight: 600;\n}\n\n.motto {\n .title {\n font-weight: 600;\n font-size: 32px;\n padding-top: 18px;\n }\n\n .motto {\n font-weight: 500;\n font-size: 21px;\n }\n\n}\n\n.btn-fixed {\n border-width: 2px;\n border-style: solid;\n width: 220px;\n height: 46px;\n text-transform: uppercase;\n font-weight: 700;\n border-radius: 0%;\n vertical-align: middle !important;\n line-height: 46px;\n padding: 0;\n margin: 16px;\n\n &.btn-more {\n color: $primary-color;\n border-color: $primary-color;\n\n &:hover {\n background-color: $primary-color;\n color: $bg-color !important;\n }\n }\n\n &.btn-faq {\n border-color: $primary-color;\n background-color: $primary-color;\n color: $bg-color;\n\n &:hover {\n background-color: $primary-color;\n color: $bg-color !important;\n }\n }\n\n &.btn-community {\n border-color: $community-color;\n background-color: $community-color;\n color: $bg-color !important;\n\n &:hover {\n background-color: $community-color;\n color: $bg-color !important;\n }\n }\n}\n\n.footer {\n .text-muted {\n color: $bg-color !important;\n font-size: 12px;\n\n a {\n color: $bg-color !important;\n }\n }\n}\n\n.pactus-video {\n video {\n max-width: 100%;\n width: 100%;\n margin-left: auto;\n margin-right: auto;\n display: block;\n }\n}\n\n.highlighter-rouge .highlight pre {\n padding: 32px 12px 12px 12px;\n color: $bg-color;\n position: relative;\n overflow: auto;\n direction: ltr;\n\n button {\n position: absolute;\n top: 6px;\n right: 8px;\n\n padding: 2px;\n background-color: #808080;\n color: #404040;\n border-radius: 5px;\n border: ridge 1px #808080;\n\n &:hover {\n cursor: pointer;\n background-color: #bcbabb;\n }\n }\n}\n\n.nav-tabs {\n border-color: #404040 !important;\n\n a {\n color: #404040;\n }\n\n .nav-link {\n border-width: 0 !important;\n\n &:not(.active):hover {\n background-color: #808080 !important;\n color: $bg-color !important;\n }\n }\n\n .active {\n color: $bg-color !important;\n background-color: #404040 !important;\n }\n}\n\ntable {\n tbody tr:nth-child(2n + 1) td {\n background-color: #eee;\n }\n}\n\nblockquote {\n background: #eee;\n border-left: 10px solid #ccc;\n padding: 16px;\n quotes: \"\\201C\"\"\\201D\"\"\\2018\"\"\\2019\";\n\n &:before {\n color: #ccc;\n content: open-quote;\n font-size: 64px;\n line-height: 0.1em;\n vertical-align: -0.4em;\n }\n\n p {\n margin-top: 16px;\n }\n\n & p:first-child {\n display: inline;\n padding-bottom: 160px;\n margin-bottom: 160px;\n }\n}\n\n.footer {\n background-color: $primary-color !important;\n color: $bg-color !important;\n\n .section {\n font-size: 1.75rem;\n font-weight: 500;\n line-height: 1.25;\n padding-bottom: 20px;\n }\n\n li {\n padding-bottom: 8px !important;\n }\n\n &.anchor {\n a {\n color: #ffffff;\n }\n\n a:link {\n color: rgb(239, 241, 239);\n background-color: transparent !important;\n text-decoration: none !important;\n }\n\n a:hover {\n color: rgb(239, 241, 239) !important;\n }\n }\n}\n\n.community {\n img {\n margin: 4px;\n }\n}\n\n#btn-back-to-top {\n background-color: $primary-color;\n color: $bg-color;\n position: fixed;\n bottom: 20px;\n right: 20px;\n display: none;\n}\n\n.edit-bar {\n padding-top: 30px;\n // border-top: $border-top;\n\n .edit-btn,\n .edit-btn>a:hover {\n color: $font-color;\n text-decoration: none;\n }\n}\n\n.all-posts {\n .post-link {\n padding-bottom: 8px;\n }\n}\n\n.blog-post {\n .post-date {\n padding-bottom: 10px;\n color: #808080;\n }\n .content {\n padding-top: 22px;\n min-height: 600px;\n }\n}\n\n.partners {\n img {\n padding-top: 24px;\n }\n}\n","$primary-color: #021a34;\n$secondary-color: #23547b;\n$bg-color: #edeef0;\n$font-color: #4c4c4c;\n$community-color: #e03c3c;\n$border-top: 1px solid gray;\n",".hexdump {\n font-family: monospace;\n font-size: 12px;\n padding-bottom: 1rem;\n}\n\n.hexdump .offset {\n border-right: 2px solid #708090;\n color: #778899;\n}\n.hexdump .ascii {\n color: #696969;\n}\n","@import \"vars\";\n\n.faq {\n h3 {\n margin-top: 20px;\n padding-top: 16px;\n border-top: 1px solid $font-color;\n }\n\n a {\n text-decoration: none;\n }\n\n .group {\n padding-top: 16px;\n\n .col {\n font-weight: 600;\n padding-bottom: 10px;\n }\n }\n\n .separator {\n padding-top: 12px;\n padding-bottom: 12px;\n }\n}\n","@import \"vars\";\n\n.toc {\n .btn,\n a {\n color: $font-color !important;\n }\n\n .btn-section {\n padding: 0.25rem 0.5rem;\n font-weight: 600;\n background-color: transparent;\n }\n\n .btn-section:hover,\n .btn-section:focus {\n background-color: #d2f4ea;\n }\n\n .btn-section::before {\n width: 1.25em;\n line-height: 0;\n content: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='rgba%280,0,0,.5%29' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 14l6-6-6-6'/%3e%3c/svg%3e\");\n transition: transform 0.35s ease;\n transform-origin: 0.5em 50%;\n }\n\n .btn-page a {\n padding: 0.1875rem 0.5rem;\n margin-top: 0.125rem;\n margin-left: 1.25rem;\n }\n\n .btn-page a:hover,\n .btn-page a:focus,\n .btn-page .selected {\n background-color: #d2f4ea;\n }\n}\n","$line-color: #939597;\n\n/* The actual timeline (the vertical ruler) */\n.timeline {\n position: relative;\n\n /* The actual timeline (the vertical ruler) */\n &::after {\n content: \"\";\n position: absolute;\n width: 6px;\n background-color: $line-color;\n top: 0;\n bottom: 0;\n left: 50%;\n margin-left: -3px;\n }\n}\n\n/* Container around content */\n.timeline-card {\n position: relative;\n background-color: inherit;\n width: 50%;\n\n .card-title {\n padding-bottom: 12px;\n font-size: 1.3rem;\n font-weight: 500;\n }\n /* The circles on the timeline */\n &::after {\n line-height: 38px;\n font-size: 24px;\n position: absolute;\n text-align: center;\n width: 48px;\n height: 48px;\n right: -24px;\n top: 15px;\n border-radius: 50%;\n z-index: 1;\n }\n\n &.completed::after {\n content: \"✅\";\n background-color: #eeeeee;\n border: 5px solid #77b255;\n }\n\n &.ongoing::after {\n content: \"🚧\";\n background-color: #eeeeee;\n border: 5px solid #ffcb4b;\n }\n\n &.upcoming::after {\n content: \"⏳\";\n background-color: #eeeeee;\n border: 5px solid #478ec2;\n }\n\n /* Place the container to the left */\n &.left {\n padding: 0px 50px 20px 0px;\n left: 0;\n }\n\n /* Place the container to the right */\n &.right {\n padding: 0px 0px 20px 50px;\n left: 50%;\n }\n\n /* Add arrows to the left container (pointing right) */\n &.left::before {\n content: \"\";\n position: absolute;\n height: 20px;\n width: 20px;\n background: white;\n box-sizing: border-box;\n transform: rotate(45deg) translate(-50%);\n top: 34px;\n z-index: 0;\n right: 34px;\n border: 1px solid rgba(0, 0, 0, 0.175);\n }\n\n /* Add arrows to the right container (pointing left) */\n &.right::before {\n content: \"\";\n position: absolute;\n height: 20px;\n width: 20px;\n background: white;\n box-sizing: border-box;\n transform: rotate(45deg) translate(-50%);\n top: 34px;\n z-index: 0;\n left: 48px;\n border: 1px solid rgba(0, 0, 0, 0.175);\n }\n\n /* Fix the circle for containers on the right side */\n &.right::after {\n left: -24px;\n }\n}\n\n/* Media queries - Responsive timeline on screens less than 600px wide */\n@media screen and (max-width: 600px) {\n /* Place the timeline to the left */\n .timeline::after {\n left: 31px;\n }\n\n /* Full-width containers */\n .timeline-card {\n width: 100%;\n padding-left: 80px !important;\n padding-right: 25px !important;\n\n /* Make sure that all arrows are pointing leftwards */\n &::before {\n left: 80px !important;\n }\n\n /* Make sure all circles are at the same spot */\n &.left::after,\n &.right::after {\n left: 8px !important;\n }\n\n &.left::before {\n right: auto;\n }\n\n /* Make all right containers behave like the left ones */\n &.right {\n left: 0%;\n }\n }\n}\n","@import \"vars\";\n\n.learn {\n h2 {\n border-top: $border-top;\n }\n}\n"],"file":"custom.css"} \ No newline at end of file diff --git a/assets/css/fontawesome.min.css b/assets/css/fontawesome.min.css new file mode 100644 index 000000000..5dddbd50c --- /dev/null +++ b/assets/css/fontawesome.min.css @@ -0,0 +1,6 @@ +/*! + * Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2022 Fonticons, Inc. + */ +.fa{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-classic,.fa-regular,.fa-sharp,.fa-solid,.fab,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-classic,.fa-regular,.fa-solid,.far,.fas{font-family:"Font Awesome 6 Free"}.fa-brands,.fab{font-family:"Font Awesome 6 Brands"}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{-webkit-animation-name:fa-beat;animation-name:fa-beat;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{-webkit-animation-name:fa-bounce;animation-name:fa-bounce;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{-webkit-animation-name:fa-fade;animation-name:fa-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{-webkit-animation-name:fa-beat-fade;animation-name:fa-beat-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{-webkit-animation-name:fa-flip;animation-name:fa-flip;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{-webkit-animation-name:fa-shake;animation-name:fa-shake;-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-duration:var(--fa-animation-duration,2s);animation-duration:var(--fa-animation-duration,2s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,steps(8));animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{-webkit-animation-delay:-1ms;animation-delay:-1ms;-webkit-animation-duration:1ms;animation-duration:1ms;-webkit-animation-iteration-count:1;animation-iteration-count:1;transition-delay:0s;transition-duration:0s}}@-webkit-keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@-webkit-keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@-webkit-keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@-webkit-keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@-webkit-keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@-webkit-keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}.fa-rotate-by{-webkit-transform:rotate(var(--fa-rotate-angle,none));transform:rotate(var(--fa-rotate-angle,none))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)}.fa-0:before{content:"\30"}.fa-1:before{content:"\31"}.fa-2:before{content:"\32"}.fa-3:before{content:"\33"}.fa-4:before{content:"\34"}.fa-5:before{content:"\35"}.fa-6:before{content:"\36"}.fa-7:before{content:"\37"}.fa-8:before{content:"\38"}.fa-9:before{content:"\39"}.fa-fill-drip:before{content:"\f576"}.fa-arrows-to-circle:before{content:"\e4bd"}.fa-chevron-circle-right:before,.fa-circle-chevron-right:before{content:"\f138"}.fa-at:before{content:"\40"}.fa-trash-alt:before,.fa-trash-can:before{content:"\f2ed"}.fa-text-height:before{content:"\f034"}.fa-user-times:before,.fa-user-xmark:before{content:"\f235"}.fa-stethoscope:before{content:"\f0f1"}.fa-comment-alt:before,.fa-message:before{content:"\f27a"}.fa-info:before{content:"\f129"}.fa-compress-alt:before,.fa-down-left-and-up-right-to-center:before{content:"\f422"}.fa-explosion:before{content:"\e4e9"}.fa-file-alt:before,.fa-file-lines:before,.fa-file-text:before{content:"\f15c"}.fa-wave-square:before{content:"\f83e"}.fa-ring:before{content:"\f70b"}.fa-building-un:before{content:"\e4d9"}.fa-dice-three:before{content:"\f527"}.fa-calendar-alt:before,.fa-calendar-days:before{content:"\f073"}.fa-anchor-circle-check:before{content:"\e4aa"}.fa-building-circle-arrow-right:before{content:"\e4d1"}.fa-volleyball-ball:before,.fa-volleyball:before{content:"\f45f"}.fa-arrows-up-to-line:before{content:"\e4c2"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-circle-minus:before,.fa-minus-circle:before{content:"\f056"}.fa-door-open:before{content:"\f52b"}.fa-right-from-bracket:before,.fa-sign-out-alt:before{content:"\f2f5"}.fa-atom:before{content:"\f5d2"}.fa-soap:before{content:"\e06e"}.fa-heart-music-camera-bolt:before,.fa-icons:before{content:"\f86d"}.fa-microphone-alt-slash:before,.fa-microphone-lines-slash:before{content:"\f539"}.fa-bridge-circle-check:before{content:"\e4c9"}.fa-pump-medical:before{content:"\e06a"}.fa-fingerprint:before{content:"\f577"}.fa-hand-point-right:before{content:"\f0a4"}.fa-magnifying-glass-location:before,.fa-search-location:before{content:"\f689"}.fa-forward-step:before,.fa-step-forward:before{content:"\f051"}.fa-face-smile-beam:before,.fa-smile-beam:before{content:"\f5b8"}.fa-flag-checkered:before{content:"\f11e"}.fa-football-ball:before,.fa-football:before{content:"\f44e"}.fa-school-circle-exclamation:before{content:"\e56c"}.fa-crop:before{content:"\f125"}.fa-angle-double-down:before,.fa-angles-down:before{content:"\f103"}.fa-users-rectangle:before{content:"\e594"}.fa-people-roof:before{content:"\e537"}.fa-people-line:before{content:"\e534"}.fa-beer-mug-empty:before,.fa-beer:before{content:"\f0fc"}.fa-diagram-predecessor:before{content:"\e477"}.fa-arrow-up-long:before,.fa-long-arrow-up:before{content:"\f176"}.fa-burn:before,.fa-fire-flame-simple:before{content:"\f46a"}.fa-male:before,.fa-person:before{content:"\f183"}.fa-laptop:before{content:"\f109"}.fa-file-csv:before{content:"\f6dd"}.fa-menorah:before{content:"\f676"}.fa-truck-plane:before{content:"\e58f"}.fa-record-vinyl:before{content:"\f8d9"}.fa-face-grin-stars:before,.fa-grin-stars:before{content:"\f587"}.fa-bong:before{content:"\f55c"}.fa-pastafarianism:before,.fa-spaghetti-monster-flying:before{content:"\f67b"}.fa-arrow-down-up-across-line:before{content:"\e4af"}.fa-spoon:before,.fa-utensil-spoon:before{content:"\f2e5"}.fa-jar-wheat:before{content:"\e517"}.fa-envelopes-bulk:before,.fa-mail-bulk:before{content:"\f674"}.fa-file-circle-exclamation:before{content:"\e4eb"}.fa-circle-h:before,.fa-hospital-symbol:before{content:"\f47e"}.fa-pager:before{content:"\f815"}.fa-address-book:before,.fa-contact-book:before{content:"\f2b9"}.fa-strikethrough:before{content:"\f0cc"}.fa-k:before{content:"\4b"}.fa-landmark-flag:before{content:"\e51c"}.fa-pencil-alt:before,.fa-pencil:before{content:"\f303"}.fa-backward:before{content:"\f04a"}.fa-caret-right:before{content:"\f0da"}.fa-comments:before{content:"\f086"}.fa-file-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-code-pull-request:before{content:"\e13c"}.fa-clipboard-list:before{content:"\f46d"}.fa-truck-loading:before,.fa-truck-ramp-box:before{content:"\f4de"}.fa-user-check:before{content:"\f4fc"}.fa-vial-virus:before{content:"\e597"}.fa-sheet-plastic:before{content:"\e571"}.fa-blog:before{content:"\f781"}.fa-user-ninja:before{content:"\f504"}.fa-person-arrow-up-from-line:before{content:"\e539"}.fa-scroll-torah:before,.fa-torah:before{content:"\f6a0"}.fa-broom-ball:before,.fa-quidditch-broom-ball:before,.fa-quidditch:before{content:"\f458"}.fa-toggle-off:before{content:"\f204"}.fa-archive:before,.fa-box-archive:before{content:"\f187"}.fa-person-drowning:before{content:"\e545"}.fa-arrow-down-9-1:before,.fa-sort-numeric-desc:before,.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-face-grin-tongue-squint:before,.fa-grin-tongue-squint:before{content:"\f58a"}.fa-spray-can:before{content:"\f5bd"}.fa-truck-monster:before{content:"\f63b"}.fa-w:before{content:"\57"}.fa-earth-africa:before,.fa-globe-africa:before{content:"\f57c"}.fa-rainbow:before{content:"\f75b"}.fa-circle-notch:before{content:"\f1ce"}.fa-tablet-alt:before,.fa-tablet-screen-button:before{content:"\f3fa"}.fa-paw:before{content:"\f1b0"}.fa-cloud:before{content:"\f0c2"}.fa-trowel-bricks:before{content:"\e58a"}.fa-face-flushed:before,.fa-flushed:before{content:"\f579"}.fa-hospital-user:before{content:"\f80d"}.fa-tent-arrow-left-right:before{content:"\e57f"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-binoculars:before{content:"\f1e5"}.fa-microphone-slash:before{content:"\f131"}.fa-box-tissue:before{content:"\e05b"}.fa-motorcycle:before{content:"\f21c"}.fa-bell-concierge:before,.fa-concierge-bell:before{content:"\f562"}.fa-pen-ruler:before,.fa-pencil-ruler:before{content:"\f5ae"}.fa-people-arrows-left-right:before,.fa-people-arrows:before{content:"\e068"}.fa-mars-and-venus-burst:before{content:"\e523"}.fa-caret-square-right:before,.fa-square-caret-right:before{content:"\f152"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-sun-plant-wilt:before{content:"\e57a"}.fa-toilets-portable:before{content:"\e584"}.fa-hockey-puck:before{content:"\f453"}.fa-table:before{content:"\f0ce"}.fa-magnifying-glass-arrow-right:before{content:"\e521"}.fa-digital-tachograph:before,.fa-tachograph-digital:before{content:"\f566"}.fa-users-slash:before{content:"\e073"}.fa-clover:before{content:"\e139"}.fa-mail-reply:before,.fa-reply:before{content:"\f3e5"}.fa-star-and-crescent:before{content:"\f699"}.fa-house-fire:before{content:"\e50c"}.fa-minus-square:before,.fa-square-minus:before{content:"\f146"}.fa-helicopter:before{content:"\f533"}.fa-compass:before{content:"\f14e"}.fa-caret-square-down:before,.fa-square-caret-down:before{content:"\f150"}.fa-file-circle-question:before{content:"\e4ef"}.fa-laptop-code:before{content:"\f5fc"}.fa-swatchbook:before{content:"\f5c3"}.fa-prescription-bottle:before{content:"\f485"}.fa-bars:before,.fa-navicon:before{content:"\f0c9"}.fa-people-group:before{content:"\e533"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-heart-broken:before,.fa-heart-crack:before{content:"\f7a9"}.fa-external-link-square-alt:before,.fa-square-up-right:before{content:"\f360"}.fa-face-kiss-beam:before,.fa-kiss-beam:before{content:"\f597"}.fa-film:before{content:"\f008"}.fa-ruler-horizontal:before{content:"\f547"}.fa-people-robbery:before{content:"\e536"}.fa-lightbulb:before{content:"\f0eb"}.fa-caret-left:before{content:"\f0d9"}.fa-circle-exclamation:before,.fa-exclamation-circle:before{content:"\f06a"}.fa-school-circle-xmark:before{content:"\e56d"}.fa-arrow-right-from-bracket:before,.fa-sign-out:before{content:"\f08b"}.fa-chevron-circle-down:before,.fa-circle-chevron-down:before{content:"\f13a"}.fa-unlock-alt:before,.fa-unlock-keyhole:before{content:"\f13e"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-headphones-alt:before,.fa-headphones-simple:before{content:"\f58f"}.fa-sitemap:before{content:"\f0e8"}.fa-circle-dollar-to-slot:before,.fa-donate:before{content:"\f4b9"}.fa-memory:before{content:"\f538"}.fa-road-spikes:before{content:"\e568"}.fa-fire-burner:before{content:"\e4f1"}.fa-flag:before{content:"\f024"}.fa-hanukiah:before{content:"\f6e6"}.fa-feather:before{content:"\f52d"}.fa-volume-down:before,.fa-volume-low:before{content:"\f027"}.fa-comment-slash:before{content:"\f4b3"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-compress:before{content:"\f066"}.fa-wheat-alt:before,.fa-wheat-awn:before{content:"\e2cd"}.fa-ankh:before{content:"\f644"}.fa-hands-holding-child:before{content:"\e4fa"}.fa-asterisk:before{content:"\2a"}.fa-check-square:before,.fa-square-check:before{content:"\f14a"}.fa-peseta-sign:before{content:"\e221"}.fa-header:before,.fa-heading:before{content:"\f1dc"}.fa-ghost:before{content:"\f6e2"}.fa-list-squares:before,.fa-list:before{content:"\f03a"}.fa-phone-square-alt:before,.fa-square-phone-flip:before{content:"\f87b"}.fa-cart-plus:before{content:"\f217"}.fa-gamepad:before{content:"\f11b"}.fa-circle-dot:before,.fa-dot-circle:before{content:"\f192"}.fa-dizzy:before,.fa-face-dizzy:before{content:"\f567"}.fa-egg:before{content:"\f7fb"}.fa-house-medical-circle-xmark:before{content:"\e513"}.fa-campground:before{content:"\f6bb"}.fa-folder-plus:before{content:"\f65e"}.fa-futbol-ball:before,.fa-futbol:before,.fa-soccer-ball:before{content:"\f1e3"}.fa-paint-brush:before,.fa-paintbrush:before{content:"\f1fc"}.fa-lock:before{content:"\f023"}.fa-gas-pump:before{content:"\f52f"}.fa-hot-tub-person:before,.fa-hot-tub:before{content:"\f593"}.fa-map-location:before,.fa-map-marked:before{content:"\f59f"}.fa-house-flood-water:before{content:"\e50e"}.fa-tree:before{content:"\f1bb"}.fa-bridge-lock:before{content:"\e4cc"}.fa-sack-dollar:before{content:"\f81d"}.fa-edit:before,.fa-pen-to-square:before{content:"\f044"}.fa-car-side:before{content:"\f5e4"}.fa-share-alt:before,.fa-share-nodes:before{content:"\f1e0"}.fa-heart-circle-minus:before{content:"\e4ff"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-microscope:before{content:"\f610"}.fa-sink:before{content:"\e06d"}.fa-bag-shopping:before,.fa-shopping-bag:before{content:"\f290"}.fa-arrow-down-z-a:before,.fa-sort-alpha-desc:before,.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-mitten:before{content:"\f7b5"}.fa-person-rays:before{content:"\e54d"}.fa-users:before{content:"\f0c0"}.fa-eye-slash:before{content:"\f070"}.fa-flask-vial:before{content:"\e4f3"}.fa-hand-paper:before,.fa-hand:before{content:"\f256"}.fa-om:before{content:"\f679"}.fa-worm:before{content:"\e599"}.fa-house-circle-xmark:before{content:"\e50b"}.fa-plug:before{content:"\f1e6"}.fa-chevron-up:before{content:"\f077"}.fa-hand-spock:before{content:"\f259"}.fa-stopwatch:before{content:"\f2f2"}.fa-face-kiss:before,.fa-kiss:before{content:"\f596"}.fa-bridge-circle-xmark:before{content:"\e4cb"}.fa-face-grin-tongue:before,.fa-grin-tongue:before{content:"\f589"}.fa-chess-bishop:before{content:"\f43a"}.fa-face-grin-wink:before,.fa-grin-wink:before{content:"\f58c"}.fa-deaf:before,.fa-deafness:before,.fa-ear-deaf:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-road-circle-check:before{content:"\e564"}.fa-dice-five:before{content:"\f523"}.fa-rss-square:before,.fa-square-rss:before{content:"\f143"}.fa-land-mine-on:before{content:"\e51b"}.fa-i-cursor:before{content:"\f246"}.fa-stamp:before{content:"\f5bf"}.fa-stairs:before{content:"\e289"}.fa-i:before{content:"\49"}.fa-hryvnia-sign:before,.fa-hryvnia:before{content:"\f6f2"}.fa-pills:before{content:"\f484"}.fa-face-grin-wide:before,.fa-grin-alt:before{content:"\f581"}.fa-tooth:before{content:"\f5c9"}.fa-v:before{content:"\56"}.fa-bicycle:before{content:"\f206"}.fa-rod-asclepius:before,.fa-rod-snake:before,.fa-staff-aesculapius:before,.fa-staff-snake:before{content:"\e579"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-ambulance:before,.fa-truck-medical:before{content:"\f0f9"}.fa-wheat-awn-circle-exclamation:before{content:"\e598"}.fa-snowman:before{content:"\f7d0"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-road-barrier:before{content:"\e562"}.fa-school:before{content:"\f549"}.fa-igloo:before{content:"\f7ae"}.fa-joint:before{content:"\f595"}.fa-angle-right:before{content:"\f105"}.fa-horse:before{content:"\f6f0"}.fa-q:before{content:"\51"}.fa-g:before{content:"\47"}.fa-notes-medical:before{content:"\f481"}.fa-temperature-2:before,.fa-temperature-half:before,.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-dong-sign:before{content:"\e169"}.fa-capsules:before{content:"\f46b"}.fa-poo-bolt:before,.fa-poo-storm:before{content:"\f75a"}.fa-face-frown-open:before,.fa-frown-open:before{content:"\f57a"}.fa-hand-point-up:before{content:"\f0a6"}.fa-money-bill:before{content:"\f0d6"}.fa-bookmark:before{content:"\f02e"}.fa-align-justify:before{content:"\f039"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-helmet-un:before{content:"\e503"}.fa-bullseye:before{content:"\f140"}.fa-bacon:before{content:"\f7e5"}.fa-hand-point-down:before{content:"\f0a7"}.fa-arrow-up-from-bracket:before{content:"\e09a"}.fa-folder-blank:before,.fa-folder:before{content:"\f07b"}.fa-file-medical-alt:before,.fa-file-waveform:before{content:"\f478"}.fa-radiation:before{content:"\f7b9"}.fa-chart-simple:before{content:"\e473"}.fa-mars-stroke:before{content:"\f229"}.fa-vial:before{content:"\f492"}.fa-dashboard:before,.fa-gauge-med:before,.fa-gauge:before,.fa-tachometer-alt-average:before{content:"\f624"}.fa-magic-wand-sparkles:before,.fa-wand-magic-sparkles:before{content:"\e2ca"}.fa-e:before{content:"\45"}.fa-pen-alt:before,.fa-pen-clip:before{content:"\f305"}.fa-bridge-circle-exclamation:before{content:"\e4ca"}.fa-user:before{content:"\f007"}.fa-school-circle-check:before{content:"\e56b"}.fa-dumpster:before{content:"\f793"}.fa-shuttle-van:before,.fa-van-shuttle:before{content:"\f5b6"}.fa-building-user:before{content:"\e4da"}.fa-caret-square-left:before,.fa-square-caret-left:before{content:"\f191"}.fa-highlighter:before{content:"\f591"}.fa-key:before{content:"\f084"}.fa-bullhorn:before{content:"\f0a1"}.fa-globe:before{content:"\f0ac"}.fa-synagogue:before{content:"\f69b"}.fa-person-half-dress:before{content:"\e548"}.fa-road-bridge:before{content:"\e563"}.fa-location-arrow:before{content:"\f124"}.fa-c:before{content:"\43"}.fa-tablet-button:before{content:"\f10a"}.fa-building-lock:before{content:"\e4d6"}.fa-pizza-slice:before{content:"\f818"}.fa-money-bill-wave:before{content:"\f53a"}.fa-area-chart:before,.fa-chart-area:before{content:"\f1fe"}.fa-house-flag:before{content:"\e50d"}.fa-person-circle-minus:before{content:"\e540"}.fa-ban:before,.fa-cancel:before{content:"\f05e"}.fa-camera-rotate:before{content:"\e0d8"}.fa-air-freshener:before,.fa-spray-can-sparkles:before{content:"\f5d0"}.fa-star:before{content:"\f005"}.fa-repeat:before{content:"\f363"}.fa-cross:before{content:"\f654"}.fa-box:before{content:"\f466"}.fa-venus-mars:before{content:"\f228"}.fa-arrow-pointer:before,.fa-mouse-pointer:before{content:"\f245"}.fa-expand-arrows-alt:before,.fa-maximize:before{content:"\f31e"}.fa-charging-station:before{content:"\f5e7"}.fa-shapes:before,.fa-triangle-circle-square:before{content:"\f61f"}.fa-random:before,.fa-shuffle:before{content:"\f074"}.fa-person-running:before,.fa-running:before{content:"\f70c"}.fa-mobile-retro:before{content:"\e527"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-spider:before{content:"\f717"}.fa-hands-bound:before{content:"\e4f9"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-plane-circle-exclamation:before{content:"\e556"}.fa-x-ray:before{content:"\f497"}.fa-spell-check:before{content:"\f891"}.fa-slash:before{content:"\f715"}.fa-computer-mouse:before,.fa-mouse:before{content:"\f8cc"}.fa-arrow-right-to-bracket:before,.fa-sign-in:before{content:"\f090"}.fa-shop-slash:before,.fa-store-alt-slash:before{content:"\e070"}.fa-server:before{content:"\f233"}.fa-virus-covid-slash:before{content:"\e4a9"}.fa-shop-lock:before{content:"\e4a5"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-blender-phone:before{content:"\f6b6"}.fa-building-wheat:before{content:"\e4db"}.fa-person-breastfeeding:before{content:"\e53a"}.fa-right-to-bracket:before,.fa-sign-in-alt:before{content:"\f2f6"}.fa-venus:before{content:"\f221"}.fa-passport:before{content:"\f5ab"}.fa-heart-pulse:before,.fa-heartbeat:before{content:"\f21e"}.fa-people-carry-box:before,.fa-people-carry:before{content:"\f4ce"}.fa-temperature-high:before{content:"\f769"}.fa-microchip:before{content:"\f2db"}.fa-crown:before{content:"\f521"}.fa-weight-hanging:before{content:"\f5cd"}.fa-xmarks-lines:before{content:"\e59a"}.fa-file-prescription:before{content:"\f572"}.fa-weight-scale:before,.fa-weight:before{content:"\f496"}.fa-user-friends:before,.fa-user-group:before{content:"\f500"}.fa-arrow-up-a-z:before,.fa-sort-alpha-up:before{content:"\f15e"}.fa-chess-knight:before{content:"\f441"}.fa-face-laugh-squint:before,.fa-laugh-squint:before{content:"\f59b"}.fa-wheelchair:before{content:"\f193"}.fa-arrow-circle-up:before,.fa-circle-arrow-up:before{content:"\f0aa"}.fa-toggle-on:before{content:"\f205"}.fa-person-walking:before,.fa-walking:before{content:"\f554"}.fa-l:before{content:"\4c"}.fa-fire:before{content:"\f06d"}.fa-bed-pulse:before,.fa-procedures:before{content:"\f487"}.fa-shuttle-space:before,.fa-space-shuttle:before{content:"\f197"}.fa-face-laugh:before,.fa-laugh:before{content:"\f599"}.fa-folder-open:before{content:"\f07c"}.fa-heart-circle-plus:before{content:"\e500"}.fa-code-fork:before{content:"\e13b"}.fa-city:before{content:"\f64f"}.fa-microphone-alt:before,.fa-microphone-lines:before{content:"\f3c9"}.fa-pepper-hot:before{content:"\f816"}.fa-unlock:before{content:"\f09c"}.fa-colon-sign:before{content:"\e140"}.fa-headset:before{content:"\f590"}.fa-store-slash:before{content:"\e071"}.fa-road-circle-xmark:before{content:"\e566"}.fa-user-minus:before{content:"\f503"}.fa-mars-stroke-up:before,.fa-mars-stroke-v:before{content:"\f22a"}.fa-champagne-glasses:before,.fa-glass-cheers:before{content:"\f79f"}.fa-clipboard:before{content:"\f328"}.fa-house-circle-exclamation:before{content:"\e50a"}.fa-file-arrow-up:before,.fa-file-upload:before{content:"\f574"}.fa-wifi-3:before,.fa-wifi-strong:before,.fa-wifi:before{content:"\f1eb"}.fa-bath:before,.fa-bathtub:before{content:"\f2cd"}.fa-underline:before{content:"\f0cd"}.fa-user-edit:before,.fa-user-pen:before{content:"\f4ff"}.fa-signature:before{content:"\f5b7"}.fa-stroopwafel:before{content:"\f551"}.fa-bold:before{content:"\f032"}.fa-anchor-lock:before{content:"\e4ad"}.fa-building-ngo:before{content:"\e4d7"}.fa-manat-sign:before{content:"\e1d5"}.fa-not-equal:before{content:"\f53e"}.fa-border-style:before,.fa-border-top-left:before{content:"\f853"}.fa-map-location-dot:before,.fa-map-marked-alt:before{content:"\f5a0"}.fa-jedi:before{content:"\f669"}.fa-poll:before,.fa-square-poll-vertical:before{content:"\f681"}.fa-mug-hot:before{content:"\f7b6"}.fa-battery-car:before,.fa-car-battery:before{content:"\f5df"}.fa-gift:before{content:"\f06b"}.fa-dice-two:before{content:"\f528"}.fa-chess-queen:before{content:"\f445"}.fa-glasses:before{content:"\f530"}.fa-chess-board:before{content:"\f43c"}.fa-building-circle-check:before{content:"\e4d2"}.fa-person-chalkboard:before{content:"\e53d"}.fa-mars-stroke-h:before,.fa-mars-stroke-right:before{content:"\f22b"}.fa-hand-back-fist:before,.fa-hand-rock:before{content:"\f255"}.fa-caret-square-up:before,.fa-square-caret-up:before{content:"\f151"}.fa-cloud-showers-water:before{content:"\e4e4"}.fa-bar-chart:before,.fa-chart-bar:before{content:"\f080"}.fa-hands-bubbles:before,.fa-hands-wash:before{content:"\e05e"}.fa-less-than-equal:before{content:"\f537"}.fa-train:before{content:"\f238"}.fa-eye-low-vision:before,.fa-low-vision:before{content:"\f2a8"}.fa-crow:before{content:"\f520"}.fa-sailboat:before{content:"\e445"}.fa-window-restore:before{content:"\f2d2"}.fa-plus-square:before,.fa-square-plus:before{content:"\f0fe"}.fa-torii-gate:before{content:"\f6a1"}.fa-frog:before{content:"\f52e"}.fa-bucket:before{content:"\e4cf"}.fa-image:before{content:"\f03e"}.fa-microphone:before{content:"\f130"}.fa-cow:before{content:"\f6c8"}.fa-caret-up:before{content:"\f0d8"}.fa-screwdriver:before{content:"\f54a"}.fa-folder-closed:before{content:"\e185"}.fa-house-tsunami:before{content:"\e515"}.fa-square-nfi:before{content:"\e576"}.fa-arrow-up-from-ground-water:before{content:"\e4b5"}.fa-glass-martini-alt:before,.fa-martini-glass:before{content:"\f57b"}.fa-rotate-back:before,.fa-rotate-backward:before,.fa-rotate-left:before,.fa-undo-alt:before{content:"\f2ea"}.fa-columns:before,.fa-table-columns:before{content:"\f0db"}.fa-lemon:before{content:"\f094"}.fa-head-side-mask:before{content:"\e063"}.fa-handshake:before{content:"\f2b5"}.fa-gem:before{content:"\f3a5"}.fa-dolly-box:before,.fa-dolly:before{content:"\f472"}.fa-smoking:before{content:"\f48d"}.fa-compress-arrows-alt:before,.fa-minimize:before{content:"\f78c"}.fa-monument:before{content:"\f5a6"}.fa-snowplow:before{content:"\f7d2"}.fa-angle-double-right:before,.fa-angles-right:before{content:"\f101"}.fa-cannabis:before{content:"\f55f"}.fa-circle-play:before,.fa-play-circle:before{content:"\f144"}.fa-tablets:before{content:"\f490"}.fa-ethernet:before{content:"\f796"}.fa-eur:before,.fa-euro-sign:before,.fa-euro:before{content:"\f153"}.fa-chair:before{content:"\f6c0"}.fa-check-circle:before,.fa-circle-check:before{content:"\f058"}.fa-circle-stop:before,.fa-stop-circle:before{content:"\f28d"}.fa-compass-drafting:before,.fa-drafting-compass:before{content:"\f568"}.fa-plate-wheat:before{content:"\e55a"}.fa-icicles:before{content:"\f7ad"}.fa-person-shelter:before{content:"\e54f"}.fa-neuter:before{content:"\f22c"}.fa-id-badge:before{content:"\f2c1"}.fa-marker:before{content:"\f5a1"}.fa-face-laugh-beam:before,.fa-laugh-beam:before{content:"\f59a"}.fa-helicopter-symbol:before{content:"\e502"}.fa-universal-access:before{content:"\f29a"}.fa-chevron-circle-up:before,.fa-circle-chevron-up:before{content:"\f139"}.fa-lari-sign:before{content:"\e1c8"}.fa-volcano:before{content:"\f770"}.fa-person-walking-dashed-line-arrow-right:before{content:"\e553"}.fa-gbp:before,.fa-pound-sign:before,.fa-sterling-sign:before{content:"\f154"}.fa-viruses:before{content:"\e076"}.fa-square-person-confined:before{content:"\e577"}.fa-user-tie:before{content:"\f508"}.fa-arrow-down-long:before,.fa-long-arrow-down:before{content:"\f175"}.fa-tent-arrow-down-to-line:before{content:"\e57e"}.fa-certificate:before{content:"\f0a3"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-suitcase:before{content:"\f0f2"}.fa-person-skating:before,.fa-skating:before{content:"\f7c5"}.fa-filter-circle-dollar:before,.fa-funnel-dollar:before{content:"\f662"}.fa-camera-retro:before{content:"\f083"}.fa-arrow-circle-down:before,.fa-circle-arrow-down:before{content:"\f0ab"}.fa-arrow-right-to-file:before,.fa-file-import:before{content:"\f56f"}.fa-external-link-square:before,.fa-square-arrow-up-right:before{content:"\f14c"}.fa-box-open:before{content:"\f49e"}.fa-scroll:before{content:"\f70e"}.fa-spa:before{content:"\f5bb"}.fa-location-pin-lock:before{content:"\e51f"}.fa-pause:before{content:"\f04c"}.fa-hill-avalanche:before{content:"\e507"}.fa-temperature-0:before,.fa-temperature-empty:before,.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-bomb:before{content:"\f1e2"}.fa-registered:before{content:"\f25d"}.fa-address-card:before,.fa-contact-card:before,.fa-vcard:before{content:"\f2bb"}.fa-balance-scale-right:before,.fa-scale-unbalanced-flip:before{content:"\f516"}.fa-subscript:before{content:"\f12c"}.fa-diamond-turn-right:before,.fa-directions:before{content:"\f5eb"}.fa-burst:before{content:"\e4dc"}.fa-house-laptop:before,.fa-laptop-house:before{content:"\e066"}.fa-face-tired:before,.fa-tired:before{content:"\f5c8"}.fa-money-bills:before{content:"\e1f3"}.fa-smog:before{content:"\f75f"}.fa-crutch:before{content:"\f7f7"}.fa-cloud-arrow-up:before,.fa-cloud-upload-alt:before,.fa-cloud-upload:before{content:"\f0ee"}.fa-palette:before{content:"\f53f"}.fa-arrows-turn-right:before{content:"\e4c0"}.fa-vest:before{content:"\e085"}.fa-ferry:before{content:"\e4ea"}.fa-arrows-down-to-people:before{content:"\e4b9"}.fa-seedling:before,.fa-sprout:before{content:"\f4d8"}.fa-arrows-alt-h:before,.fa-left-right:before{content:"\f337"}.fa-boxes-packing:before{content:"\e4c7"}.fa-arrow-circle-left:before,.fa-circle-arrow-left:before{content:"\f0a8"}.fa-group-arrows-rotate:before{content:"\e4f6"}.fa-bowl-food:before{content:"\e4c6"}.fa-candy-cane:before{content:"\f786"}.fa-arrow-down-wide-short:before,.fa-sort-amount-asc:before,.fa-sort-amount-down:before{content:"\f160"}.fa-cloud-bolt:before,.fa-thunderstorm:before{content:"\f76c"}.fa-remove-format:before,.fa-text-slash:before{content:"\f87d"}.fa-face-smile-wink:before,.fa-smile-wink:before{content:"\f4da"}.fa-file-word:before{content:"\f1c2"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-arrows-h:before,.fa-arrows-left-right:before{content:"\f07e"}.fa-house-lock:before{content:"\e510"}.fa-cloud-arrow-down:before,.fa-cloud-download-alt:before,.fa-cloud-download:before{content:"\f0ed"}.fa-children:before{content:"\e4e1"}.fa-blackboard:before,.fa-chalkboard:before{content:"\f51b"}.fa-user-alt-slash:before,.fa-user-large-slash:before{content:"\f4fa"}.fa-envelope-open:before{content:"\f2b6"}.fa-handshake-alt-slash:before,.fa-handshake-simple-slash:before{content:"\e05f"}.fa-mattress-pillow:before{content:"\e525"}.fa-guarani-sign:before{content:"\e19a"}.fa-arrows-rotate:before,.fa-refresh:before,.fa-sync:before{content:"\f021"}.fa-fire-extinguisher:before{content:"\f134"}.fa-cruzeiro-sign:before{content:"\e152"}.fa-greater-than-equal:before{content:"\f532"}.fa-shield-alt:before,.fa-shield-halved:before{content:"\f3ed"}.fa-atlas:before,.fa-book-atlas:before{content:"\f558"}.fa-virus:before{content:"\e074"}.fa-envelope-circle-check:before{content:"\e4e8"}.fa-layer-group:before{content:"\f5fd"}.fa-arrows-to-dot:before{content:"\e4be"}.fa-archway:before{content:"\f557"}.fa-heart-circle-check:before{content:"\e4fd"}.fa-house-chimney-crack:before,.fa-house-damage:before{content:"\f6f1"}.fa-file-archive:before,.fa-file-zipper:before{content:"\f1c6"}.fa-square:before{content:"\f0c8"}.fa-glass-martini:before,.fa-martini-glass-empty:before{content:"\f000"}.fa-couch:before{content:"\f4b8"}.fa-cedi-sign:before{content:"\e0df"}.fa-italic:before{content:"\f033"}.fa-church:before{content:"\f51d"}.fa-comments-dollar:before{content:"\f653"}.fa-democrat:before{content:"\f747"}.fa-z:before{content:"\5a"}.fa-person-skiing:before,.fa-skiing:before{content:"\f7c9"}.fa-road-lock:before{content:"\e567"}.fa-a:before{content:"\41"}.fa-temperature-arrow-down:before,.fa-temperature-down:before{content:"\e03f"}.fa-feather-alt:before,.fa-feather-pointed:before{content:"\f56b"}.fa-p:before{content:"\50"}.fa-snowflake:before{content:"\f2dc"}.fa-newspaper:before{content:"\f1ea"}.fa-ad:before,.fa-rectangle-ad:before{content:"\f641"}.fa-arrow-circle-right:before,.fa-circle-arrow-right:before{content:"\f0a9"}.fa-filter-circle-xmark:before{content:"\e17b"}.fa-locust:before{content:"\e520"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-list-1-2:before,.fa-list-numeric:before,.fa-list-ol:before{content:"\f0cb"}.fa-person-dress-burst:before{content:"\e544"}.fa-money-check-alt:before,.fa-money-check-dollar:before{content:"\f53d"}.fa-vector-square:before{content:"\f5cb"}.fa-bread-slice:before{content:"\f7ec"}.fa-language:before{content:"\f1ab"}.fa-face-kiss-wink-heart:before,.fa-kiss-wink-heart:before{content:"\f598"}.fa-filter:before{content:"\f0b0"}.fa-question:before{content:"\3f"}.fa-file-signature:before{content:"\f573"}.fa-arrows-alt:before,.fa-up-down-left-right:before{content:"\f0b2"}.fa-house-chimney-user:before{content:"\e065"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-puzzle-piece:before{content:"\f12e"}.fa-money-check:before{content:"\f53c"}.fa-star-half-alt:before,.fa-star-half-stroke:before{content:"\f5c0"}.fa-code:before{content:"\f121"}.fa-glass-whiskey:before,.fa-whiskey-glass:before{content:"\f7a0"}.fa-building-circle-exclamation:before{content:"\e4d3"}.fa-magnifying-glass-chart:before{content:"\e522"}.fa-arrow-up-right-from-square:before,.fa-external-link:before{content:"\f08e"}.fa-cubes-stacked:before{content:"\e4e6"}.fa-krw:before,.fa-won-sign:before,.fa-won:before{content:"\f159"}.fa-virus-covid:before{content:"\e4a8"}.fa-austral-sign:before{content:"\e0a9"}.fa-f:before{content:"\46"}.fa-leaf:before{content:"\f06c"}.fa-road:before{content:"\f018"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-person-circle-plus:before{content:"\e541"}.fa-chart-pie:before,.fa-pie-chart:before{content:"\f200"}.fa-bolt-lightning:before{content:"\e0b7"}.fa-sack-xmark:before{content:"\e56a"}.fa-file-excel:before{content:"\f1c3"}.fa-file-contract:before{content:"\f56c"}.fa-fish-fins:before{content:"\e4f2"}.fa-building-flag:before{content:"\e4d5"}.fa-face-grin-beam:before,.fa-grin-beam:before{content:"\f582"}.fa-object-ungroup:before{content:"\f248"}.fa-poop:before{content:"\f619"}.fa-location-pin:before,.fa-map-marker:before{content:"\f041"}.fa-kaaba:before{content:"\f66b"}.fa-toilet-paper:before{content:"\f71e"}.fa-hard-hat:before,.fa-hat-hard:before,.fa-helmet-safety:before{content:"\f807"}.fa-eject:before{content:"\f052"}.fa-arrow-alt-circle-right:before,.fa-circle-right:before{content:"\f35a"}.fa-plane-circle-check:before{content:"\e555"}.fa-face-rolling-eyes:before,.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-object-group:before{content:"\f247"}.fa-chart-line:before,.fa-line-chart:before{content:"\f201"}.fa-mask-ventilator:before{content:"\e524"}.fa-arrow-right:before{content:"\f061"}.fa-map-signs:before,.fa-signs-post:before{content:"\f277"}.fa-cash-register:before{content:"\f788"}.fa-person-circle-question:before{content:"\e542"}.fa-h:before{content:"\48"}.fa-tarp:before{content:"\e57b"}.fa-screwdriver-wrench:before,.fa-tools:before{content:"\f7d9"}.fa-arrows-to-eye:before{content:"\e4bf"}.fa-plug-circle-bolt:before{content:"\e55b"}.fa-heart:before{content:"\f004"}.fa-mars-and-venus:before{content:"\f224"}.fa-home-user:before,.fa-house-user:before{content:"\e1b0"}.fa-dumpster-fire:before{content:"\f794"}.fa-house-crack:before{content:"\e3b1"}.fa-cocktail:before,.fa-martini-glass-citrus:before{content:"\f561"}.fa-face-surprise:before,.fa-surprise:before{content:"\f5c2"}.fa-bottle-water:before{content:"\e4c5"}.fa-circle-pause:before,.fa-pause-circle:before{content:"\f28b"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-apple-alt:before,.fa-apple-whole:before{content:"\f5d1"}.fa-kitchen-set:before{content:"\e51a"}.fa-r:before{content:"\52"}.fa-temperature-1:before,.fa-temperature-quarter:before,.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-cube:before{content:"\f1b2"}.fa-bitcoin-sign:before{content:"\e0b4"}.fa-shield-dog:before{content:"\e573"}.fa-solar-panel:before{content:"\f5ba"}.fa-lock-open:before{content:"\f3c1"}.fa-elevator:before{content:"\e16d"}.fa-money-bill-transfer:before{content:"\e528"}.fa-money-bill-trend-up:before{content:"\e529"}.fa-house-flood-water-circle-arrow-right:before{content:"\e50f"}.fa-poll-h:before,.fa-square-poll-horizontal:before{content:"\f682"}.fa-circle:before{content:"\f111"}.fa-backward-fast:before,.fa-fast-backward:before{content:"\f049"}.fa-recycle:before{content:"\f1b8"}.fa-user-astronaut:before{content:"\f4fb"}.fa-plane-slash:before{content:"\e069"}.fa-trademark:before{content:"\f25c"}.fa-basketball-ball:before,.fa-basketball:before{content:"\f434"}.fa-satellite-dish:before{content:"\f7c0"}.fa-arrow-alt-circle-up:before,.fa-circle-up:before{content:"\f35b"}.fa-mobile-alt:before,.fa-mobile-screen-button:before{content:"\f3cd"}.fa-volume-high:before,.fa-volume-up:before{content:"\f028"}.fa-users-rays:before{content:"\e593"}.fa-wallet:before{content:"\f555"}.fa-clipboard-check:before{content:"\f46c"}.fa-file-audio:before{content:"\f1c7"}.fa-burger:before,.fa-hamburger:before{content:"\f805"}.fa-wrench:before{content:"\f0ad"}.fa-bugs:before{content:"\e4d0"}.fa-rupee-sign:before,.fa-rupee:before{content:"\f156"}.fa-file-image:before{content:"\f1c5"}.fa-circle-question:before,.fa-question-circle:before{content:"\f059"}.fa-plane-departure:before{content:"\f5b0"}.fa-handshake-slash:before{content:"\e060"}.fa-book-bookmark:before{content:"\e0bb"}.fa-code-branch:before{content:"\f126"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-bridge:before{content:"\e4c8"}.fa-phone-alt:before,.fa-phone-flip:before{content:"\f879"}.fa-truck-front:before{content:"\e2b7"}.fa-cat:before{content:"\f6be"}.fa-anchor-circle-exclamation:before{content:"\e4ab"}.fa-truck-field:before{content:"\e58d"}.fa-route:before{content:"\f4d7"}.fa-clipboard-question:before{content:"\e4e3"}.fa-panorama:before{content:"\e209"}.fa-comment-medical:before{content:"\f7f5"}.fa-teeth-open:before{content:"\f62f"}.fa-file-circle-minus:before{content:"\e4ed"}.fa-tags:before{content:"\f02c"}.fa-wine-glass:before{content:"\f4e3"}.fa-fast-forward:before,.fa-forward-fast:before{content:"\f050"}.fa-face-meh-blank:before,.fa-meh-blank:before{content:"\f5a4"}.fa-parking:before,.fa-square-parking:before{content:"\f540"}.fa-house-signal:before{content:"\e012"}.fa-bars-progress:before,.fa-tasks-alt:before{content:"\f828"}.fa-faucet-drip:before{content:"\e006"}.fa-cart-flatbed:before,.fa-dolly-flatbed:before{content:"\f474"}.fa-ban-smoking:before,.fa-smoking-ban:before{content:"\f54d"}.fa-terminal:before{content:"\f120"}.fa-mobile-button:before{content:"\f10b"}.fa-house-medical-flag:before{content:"\e514"}.fa-basket-shopping:before,.fa-shopping-basket:before{content:"\f291"}.fa-tape:before{content:"\f4db"}.fa-bus-alt:before,.fa-bus-simple:before{content:"\f55e"}.fa-eye:before{content:"\f06e"}.fa-face-sad-cry:before,.fa-sad-cry:before{content:"\f5b3"}.fa-audio-description:before{content:"\f29e"}.fa-person-military-to-person:before{content:"\e54c"}.fa-file-shield:before{content:"\e4f0"}.fa-user-slash:before{content:"\f506"}.fa-pen:before{content:"\f304"}.fa-tower-observation:before{content:"\e586"}.fa-file-code:before{content:"\f1c9"}.fa-signal-5:before,.fa-signal-perfect:before,.fa-signal:before{content:"\f012"}.fa-bus:before{content:"\f207"}.fa-heart-circle-xmark:before{content:"\e501"}.fa-home-lg:before,.fa-house-chimney:before{content:"\e3af"}.fa-window-maximize:before{content:"\f2d0"}.fa-face-frown:before,.fa-frown:before{content:"\f119"}.fa-prescription:before{content:"\f5b1"}.fa-shop:before,.fa-store-alt:before{content:"\f54f"}.fa-floppy-disk:before,.fa-save:before{content:"\f0c7"}.fa-vihara:before{content:"\f6a7"}.fa-balance-scale-left:before,.fa-scale-unbalanced:before{content:"\f515"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-comment-dots:before,.fa-commenting:before{content:"\f4ad"}.fa-plant-wilt:before{content:"\e5aa"}.fa-diamond:before{content:"\f219"}.fa-face-grin-squint:before,.fa-grin-squint:before{content:"\f585"}.fa-hand-holding-dollar:before,.fa-hand-holding-usd:before{content:"\f4c0"}.fa-bacterium:before{content:"\e05a"}.fa-hand-pointer:before{content:"\f25a"}.fa-drum-steelpan:before{content:"\f56a"}.fa-hand-scissors:before{content:"\f257"}.fa-hands-praying:before,.fa-praying-hands:before{content:"\f684"}.fa-arrow-right-rotate:before,.fa-arrow-rotate-forward:before,.fa-arrow-rotate-right:before,.fa-redo:before{content:"\f01e"}.fa-biohazard:before{content:"\f780"}.fa-location-crosshairs:before,.fa-location:before{content:"\f601"}.fa-mars-double:before{content:"\f227"}.fa-child-dress:before{content:"\e59c"}.fa-users-between-lines:before{content:"\e591"}.fa-lungs-virus:before{content:"\e067"}.fa-face-grin-tears:before,.fa-grin-tears:before{content:"\f588"}.fa-phone:before{content:"\f095"}.fa-calendar-times:before,.fa-calendar-xmark:before{content:"\f273"}.fa-child-reaching:before{content:"\e59d"}.fa-head-side-virus:before{content:"\e064"}.fa-user-cog:before,.fa-user-gear:before{content:"\f4fe"}.fa-arrow-up-1-9:before,.fa-sort-numeric-up:before{content:"\f163"}.fa-door-closed:before{content:"\f52a"}.fa-shield-virus:before{content:"\e06c"}.fa-dice-six:before{content:"\f526"}.fa-mosquito-net:before{content:"\e52c"}.fa-bridge-water:before{content:"\e4ce"}.fa-person-booth:before{content:"\f756"}.fa-text-width:before{content:"\f035"}.fa-hat-wizard:before{content:"\f6e8"}.fa-pen-fancy:before{content:"\f5ac"}.fa-digging:before,.fa-person-digging:before{content:"\f85e"}.fa-trash:before{content:"\f1f8"}.fa-gauge-simple-med:before,.fa-gauge-simple:before,.fa-tachometer-average:before{content:"\f629"}.fa-book-medical:before{content:"\f7e6"}.fa-poo:before{content:"\f2fe"}.fa-quote-right-alt:before,.fa-quote-right:before{content:"\f10e"}.fa-shirt:before,.fa-t-shirt:before,.fa-tshirt:before{content:"\f553"}.fa-cubes:before{content:"\f1b3"}.fa-divide:before{content:"\f529"}.fa-tenge-sign:before,.fa-tenge:before{content:"\f7d7"}.fa-headphones:before{content:"\f025"}.fa-hands-holding:before{content:"\f4c2"}.fa-hands-clapping:before{content:"\e1a8"}.fa-republican:before{content:"\f75e"}.fa-arrow-left:before{content:"\f060"}.fa-person-circle-xmark:before{content:"\e543"}.fa-ruler:before{content:"\f545"}.fa-align-left:before{content:"\f036"}.fa-dice-d6:before{content:"\f6d1"}.fa-restroom:before{content:"\f7bd"}.fa-j:before{content:"\4a"}.fa-users-viewfinder:before{content:"\e595"}.fa-file-video:before{content:"\f1c8"}.fa-external-link-alt:before,.fa-up-right-from-square:before{content:"\f35d"}.fa-table-cells:before,.fa-th:before{content:"\f00a"}.fa-file-pdf:before{content:"\f1c1"}.fa-bible:before,.fa-book-bible:before{content:"\f647"}.fa-o:before{content:"\4f"}.fa-medkit:before,.fa-suitcase-medical:before{content:"\f0fa"}.fa-user-secret:before{content:"\f21b"}.fa-otter:before{content:"\f700"}.fa-female:before,.fa-person-dress:before{content:"\f182"}.fa-comment-dollar:before{content:"\f651"}.fa-briefcase-clock:before,.fa-business-time:before{content:"\f64a"}.fa-table-cells-large:before,.fa-th-large:before{content:"\f009"}.fa-book-tanakh:before,.fa-tanakh:before{content:"\f827"}.fa-phone-volume:before,.fa-volume-control-phone:before{content:"\f2a0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-clipboard-user:before{content:"\f7f3"}.fa-child:before{content:"\f1ae"}.fa-lira-sign:before{content:"\f195"}.fa-satellite:before{content:"\f7bf"}.fa-plane-lock:before{content:"\e558"}.fa-tag:before{content:"\f02b"}.fa-comment:before{content:"\f075"}.fa-birthday-cake:before,.fa-cake-candles:before,.fa-cake:before{content:"\f1fd"}.fa-envelope:before{content:"\f0e0"}.fa-angle-double-up:before,.fa-angles-up:before{content:"\f102"}.fa-paperclip:before{content:"\f0c6"}.fa-arrow-right-to-city:before{content:"\e4b3"}.fa-ribbon:before{content:"\f4d6"}.fa-lungs:before{content:"\f604"}.fa-arrow-up-9-1:before,.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-litecoin-sign:before{content:"\e1d3"}.fa-border-none:before{content:"\f850"}.fa-circle-nodes:before{content:"\e4e2"}.fa-parachute-box:before{content:"\f4cd"}.fa-indent:before{content:"\f03c"}.fa-truck-field-un:before{content:"\e58e"}.fa-hourglass-empty:before,.fa-hourglass:before{content:"\f254"}.fa-mountain:before{content:"\f6fc"}.fa-user-doctor:before,.fa-user-md:before{content:"\f0f0"}.fa-circle-info:before,.fa-info-circle:before{content:"\f05a"}.fa-cloud-meatball:before{content:"\f73b"}.fa-camera-alt:before,.fa-camera:before{content:"\f030"}.fa-square-virus:before{content:"\e578"}.fa-meteor:before{content:"\f753"}.fa-car-on:before{content:"\e4dd"}.fa-sleigh:before{content:"\f7cc"}.fa-arrow-down-1-9:before,.fa-sort-numeric-asc:before,.fa-sort-numeric-down:before{content:"\f162"}.fa-hand-holding-droplet:before,.fa-hand-holding-water:before{content:"\f4c1"}.fa-water:before{content:"\f773"}.fa-calendar-check:before{content:"\f274"}.fa-braille:before{content:"\f2a1"}.fa-prescription-bottle-alt:before,.fa-prescription-bottle-medical:before{content:"\f486"}.fa-landmark:before{content:"\f66f"}.fa-truck:before{content:"\f0d1"}.fa-crosshairs:before{content:"\f05b"}.fa-person-cane:before{content:"\e53c"}.fa-tent:before{content:"\e57d"}.fa-vest-patches:before{content:"\e086"}.fa-check-double:before{content:"\f560"}.fa-arrow-down-a-z:before,.fa-sort-alpha-asc:before,.fa-sort-alpha-down:before{content:"\f15d"}.fa-money-bill-wheat:before{content:"\e52a"}.fa-cookie:before{content:"\f563"}.fa-arrow-left-rotate:before,.fa-arrow-rotate-back:before,.fa-arrow-rotate-backward:before,.fa-arrow-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-hard-drive:before,.fa-hdd:before{content:"\f0a0"}.fa-face-grin-squint-tears:before,.fa-grin-squint-tears:before{content:"\f586"}.fa-dumbbell:before{content:"\f44b"}.fa-list-alt:before,.fa-rectangle-list:before{content:"\f022"}.fa-tarp-droplet:before{content:"\e57c"}.fa-house-medical-circle-check:before{content:"\e511"}.fa-person-skiing-nordic:before,.fa-skiing-nordic:before{content:"\f7ca"}.fa-calendar-plus:before{content:"\f271"}.fa-plane-arrival:before{content:"\f5af"}.fa-arrow-alt-circle-left:before,.fa-circle-left:before{content:"\f359"}.fa-subway:before,.fa-train-subway:before{content:"\f239"}.fa-chart-gantt:before{content:"\e0e4"}.fa-indian-rupee-sign:before,.fa-indian-rupee:before,.fa-inr:before{content:"\e1bc"}.fa-crop-alt:before,.fa-crop-simple:before{content:"\f565"}.fa-money-bill-1:before,.fa-money-bill-alt:before{content:"\f3d1"}.fa-left-long:before,.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-dna:before{content:"\f471"}.fa-virus-slash:before{content:"\e075"}.fa-minus:before,.fa-subtract:before{content:"\f068"}.fa-child-rifle:before{content:"\e4e0"}.fa-chess:before{content:"\f439"}.fa-arrow-left-long:before,.fa-long-arrow-left:before{content:"\f177"}.fa-plug-circle-check:before{content:"\e55c"}.fa-street-view:before{content:"\f21d"}.fa-franc-sign:before{content:"\e18f"}.fa-volume-off:before{content:"\f026"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before,.fa-hands-american-sign-language-interpreting:before,.fa-hands-asl-interpreting:before{content:"\f2a3"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-droplet-slash:before,.fa-tint-slash:before{content:"\f5c7"}.fa-mosque:before{content:"\f678"}.fa-mosquito:before{content:"\e52b"}.fa-star-of-david:before{content:"\f69a"}.fa-person-military-rifle:before{content:"\e54b"}.fa-cart-shopping:before,.fa-shopping-cart:before{content:"\f07a"}.fa-vials:before{content:"\f493"}.fa-plug-circle-plus:before{content:"\e55f"}.fa-place-of-worship:before{content:"\f67f"}.fa-grip-vertical:before{content:"\f58e"}.fa-arrow-turn-up:before,.fa-level-up:before{content:"\f148"}.fa-u:before{content:"\55"}.fa-square-root-alt:before,.fa-square-root-variable:before{content:"\f698"}.fa-clock-four:before,.fa-clock:before{content:"\f017"}.fa-backward-step:before,.fa-step-backward:before{content:"\f048"}.fa-pallet:before{content:"\f482"}.fa-faucet:before{content:"\e005"}.fa-baseball-bat-ball:before{content:"\f432"}.fa-s:before{content:"\53"}.fa-timeline:before{content:"\e29c"}.fa-keyboard:before{content:"\f11c"}.fa-caret-down:before{content:"\f0d7"}.fa-clinic-medical:before,.fa-house-chimney-medical:before{content:"\f7f2"}.fa-temperature-3:before,.fa-temperature-three-quarters:before,.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-mobile-android-alt:before,.fa-mobile-screen:before{content:"\f3cf"}.fa-plane-up:before{content:"\e22d"}.fa-piggy-bank:before{content:"\f4d3"}.fa-battery-3:before,.fa-battery-half:before{content:"\f242"}.fa-mountain-city:before{content:"\e52e"}.fa-coins:before{content:"\f51e"}.fa-khanda:before{content:"\f66d"}.fa-sliders-h:before,.fa-sliders:before{content:"\f1de"}.fa-folder-tree:before{content:"\f802"}.fa-network-wired:before{content:"\f6ff"}.fa-map-pin:before{content:"\f276"}.fa-hamsa:before{content:"\f665"}.fa-cent-sign:before{content:"\e3f5"}.fa-flask:before{content:"\f0c3"}.fa-person-pregnant:before{content:"\e31e"}.fa-wand-sparkles:before{content:"\f72b"}.fa-ellipsis-v:before,.fa-ellipsis-vertical:before{content:"\f142"}.fa-ticket:before{content:"\f145"}.fa-power-off:before{content:"\f011"}.fa-long-arrow-alt-right:before,.fa-right-long:before{content:"\f30b"}.fa-flag-usa:before{content:"\f74d"}.fa-laptop-file:before{content:"\e51d"}.fa-teletype:before,.fa-tty:before{content:"\f1e4"}.fa-diagram-next:before{content:"\e476"}.fa-person-rifle:before{content:"\e54e"}.fa-house-medical-circle-exclamation:before{content:"\e512"}.fa-closed-captioning:before{content:"\f20a"}.fa-hiking:before,.fa-person-hiking:before{content:"\f6ec"}.fa-venus-double:before{content:"\f226"}.fa-images:before{content:"\f302"}.fa-calculator:before{content:"\f1ec"}.fa-people-pulling:before{content:"\e535"}.fa-n:before{content:"\4e"}.fa-cable-car:before,.fa-tram:before{content:"\f7da"}.fa-cloud-rain:before{content:"\f73d"}.fa-building-circle-xmark:before{content:"\e4d4"}.fa-ship:before{content:"\f21a"}.fa-arrows-down-to-line:before{content:"\e4b8"}.fa-download:before{content:"\f019"}.fa-face-grin:before,.fa-grin:before{content:"\f580"}.fa-backspace:before,.fa-delete-left:before{content:"\f55a"}.fa-eye-dropper-empty:before,.fa-eye-dropper:before,.fa-eyedropper:before{content:"\f1fb"}.fa-file-circle-check:before{content:"\e5a0"}.fa-forward:before{content:"\f04e"}.fa-mobile-android:before,.fa-mobile-phone:before,.fa-mobile:before{content:"\f3ce"}.fa-face-meh:before,.fa-meh:before{content:"\f11a"}.fa-align-center:before{content:"\f037"}.fa-book-dead:before,.fa-book-skull:before{content:"\f6b7"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-heart-circle-exclamation:before{content:"\e4fe"}.fa-home-alt:before,.fa-home-lg-alt:before,.fa-home:before,.fa-house:before{content:"\f015"}.fa-calendar-week:before{content:"\f784"}.fa-laptop-medical:before{content:"\f812"}.fa-b:before{content:"\42"}.fa-file-medical:before{content:"\f477"}.fa-dice-one:before{content:"\f525"}.fa-kiwi-bird:before{content:"\f535"}.fa-arrow-right-arrow-left:before,.fa-exchange:before{content:"\f0ec"}.fa-redo-alt:before,.fa-rotate-forward:before,.fa-rotate-right:before{content:"\f2f9"}.fa-cutlery:before,.fa-utensils:before{content:"\f2e7"}.fa-arrow-up-wide-short:before,.fa-sort-amount-up:before{content:"\f161"}.fa-mill-sign:before{content:"\e1ed"}.fa-bowl-rice:before{content:"\e2eb"}.fa-skull:before{content:"\f54c"}.fa-broadcast-tower:before,.fa-tower-broadcast:before{content:"\f519"}.fa-truck-pickup:before{content:"\f63c"}.fa-long-arrow-alt-up:before,.fa-up-long:before{content:"\f30c"}.fa-stop:before{content:"\f04d"}.fa-code-merge:before{content:"\f387"}.fa-upload:before{content:"\f093"}.fa-hurricane:before{content:"\f751"}.fa-mound:before{content:"\e52d"}.fa-toilet-portable:before{content:"\e583"}.fa-compact-disc:before{content:"\f51f"}.fa-file-arrow-down:before,.fa-file-download:before{content:"\f56d"}.fa-caravan:before{content:"\f8ff"}.fa-shield-cat:before{content:"\e572"}.fa-bolt:before,.fa-zap:before{content:"\f0e7"}.fa-glass-water:before{content:"\e4f4"}.fa-oil-well:before{content:"\e532"}.fa-vault:before{content:"\e2c5"}.fa-mars:before{content:"\f222"}.fa-toilet:before{content:"\f7d8"}.fa-plane-circle-xmark:before{content:"\e557"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen-sign:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble-sign:before,.fa-ruble:before{content:"\f158"}.fa-sun:before{content:"\f185"}.fa-guitar:before{content:"\f7a6"}.fa-face-laugh-wink:before,.fa-laugh-wink:before{content:"\f59c"}.fa-horse-head:before{content:"\f7ab"}.fa-bore-hole:before{content:"\e4c3"}.fa-industry:before{content:"\f275"}.fa-arrow-alt-circle-down:before,.fa-circle-down:before{content:"\f358"}.fa-arrows-turn-to-dots:before{content:"\e4c1"}.fa-florin-sign:before{content:"\e184"}.fa-arrow-down-short-wide:before,.fa-sort-amount-desc:before,.fa-sort-amount-down-alt:before{content:"\f884"}.fa-less-than:before{content:"\3c"}.fa-angle-down:before{content:"\f107"}.fa-car-tunnel:before{content:"\e4de"}.fa-head-side-cough:before{content:"\e061"}.fa-grip-lines:before{content:"\f7a4"}.fa-thumbs-down:before{content:"\f165"}.fa-user-lock:before{content:"\f502"}.fa-arrow-right-long:before,.fa-long-arrow-right:before{content:"\f178"}.fa-anchor-circle-xmark:before{content:"\e4ac"}.fa-ellipsis-h:before,.fa-ellipsis:before{content:"\f141"}.fa-chess-pawn:before{content:"\f443"}.fa-first-aid:before,.fa-kit-medical:before{content:"\f479"}.fa-person-through-window:before{content:"\e5a9"}.fa-toolbox:before{content:"\f552"}.fa-hands-holding-circle:before{content:"\e4fb"}.fa-bug:before{content:"\f188"}.fa-credit-card-alt:before,.fa-credit-card:before{content:"\f09d"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-hand-holding-hand:before{content:"\e4f7"}.fa-book-open-reader:before,.fa-book-reader:before{content:"\f5da"}.fa-mountain-sun:before{content:"\e52f"}.fa-arrows-left-right-to-line:before{content:"\e4ba"}.fa-dice-d20:before{content:"\f6cf"}.fa-truck-droplet:before{content:"\e58c"}.fa-file-circle-xmark:before{content:"\e5a1"}.fa-temperature-arrow-up:before,.fa-temperature-up:before{content:"\e040"}.fa-medal:before{content:"\f5a2"}.fa-bed:before{content:"\f236"}.fa-h-square:before,.fa-square-h:before{content:"\f0fd"}.fa-podcast:before{content:"\f2ce"}.fa-temperature-4:before,.fa-temperature-full:before,.fa-thermometer-4:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-bell:before{content:"\f0f3"}.fa-superscript:before{content:"\f12b"}.fa-plug-circle-xmark:before{content:"\e560"}.fa-star-of-life:before{content:"\f621"}.fa-phone-slash:before{content:"\f3dd"}.fa-paint-roller:before{content:"\f5aa"}.fa-hands-helping:before,.fa-handshake-angle:before{content:"\f4c4"}.fa-location-dot:before,.fa-map-marker-alt:before{content:"\f3c5"}.fa-file:before{content:"\f15b"}.fa-greater-than:before{content:"\3e"}.fa-person-swimming:before,.fa-swimmer:before{content:"\f5c4"}.fa-arrow-down:before{content:"\f063"}.fa-droplet:before,.fa-tint:before{content:"\f043"}.fa-eraser:before{content:"\f12d"}.fa-earth-america:before,.fa-earth-americas:before,.fa-earth:before,.fa-globe-americas:before{content:"\f57d"}.fa-person-burst:before{content:"\e53b"}.fa-dove:before{content:"\f4ba"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-socks:before{content:"\f696"}.fa-inbox:before{content:"\f01c"}.fa-section:before{content:"\e447"}.fa-gauge-high:before,.fa-tachometer-alt-fast:before,.fa-tachometer-alt:before{content:"\f625"}.fa-envelope-open-text:before{content:"\f658"}.fa-hospital-alt:before,.fa-hospital-wide:before,.fa-hospital:before{content:"\f0f8"}.fa-wine-bottle:before{content:"\f72f"}.fa-chess-rook:before{content:"\f447"}.fa-bars-staggered:before,.fa-reorder:before,.fa-stream:before{content:"\f550"}.fa-dharmachakra:before{content:"\f655"}.fa-hotdog:before{content:"\f80f"}.fa-blind:before,.fa-person-walking-with-cane:before{content:"\f29d"}.fa-drum:before{content:"\f569"}.fa-ice-cream:before{content:"\f810"}.fa-heart-circle-bolt:before{content:"\e4fc"}.fa-fax:before{content:"\f1ac"}.fa-paragraph:before{content:"\f1dd"}.fa-check-to-slot:before,.fa-vote-yea:before{content:"\f772"}.fa-star-half:before{content:"\f089"}.fa-boxes-alt:before,.fa-boxes-stacked:before,.fa-boxes:before{content:"\f468"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-assistive-listening-systems:before,.fa-ear-listen:before{content:"\f2a2"}.fa-tree-city:before{content:"\e587"}.fa-play:before{content:"\f04b"}.fa-font:before{content:"\f031"}.fa-rupiah-sign:before{content:"\e23d"}.fa-magnifying-glass:before,.fa-search:before{content:"\f002"}.fa-ping-pong-paddle-ball:before,.fa-table-tennis-paddle-ball:before,.fa-table-tennis:before{content:"\f45d"}.fa-diagnoses:before,.fa-person-dots-from-line:before{content:"\f470"}.fa-trash-can-arrow-up:before,.fa-trash-restore-alt:before{content:"\f82a"}.fa-naira-sign:before{content:"\e1f6"}.fa-cart-arrow-down:before{content:"\f218"}.fa-walkie-talkie:before{content:"\f8ef"}.fa-file-edit:before,.fa-file-pen:before{content:"\f31c"}.fa-receipt:before{content:"\f543"}.fa-pen-square:before,.fa-pencil-square:before,.fa-square-pen:before{content:"\f14b"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-person-circle-exclamation:before{content:"\e53f"}.fa-chevron-down:before{content:"\f078"}.fa-battery-5:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-skull-crossbones:before{content:"\f714"}.fa-code-compare:before{content:"\e13a"}.fa-list-dots:before,.fa-list-ul:before{content:"\f0ca"}.fa-school-lock:before{content:"\e56f"}.fa-tower-cell:before{content:"\e585"}.fa-down-long:before,.fa-long-arrow-alt-down:before{content:"\f309"}.fa-ranking-star:before{content:"\e561"}.fa-chess-king:before{content:"\f43f"}.fa-person-harassing:before{content:"\e549"}.fa-brazilian-real-sign:before{content:"\e46c"}.fa-landmark-alt:before,.fa-landmark-dome:before{content:"\f752"}.fa-arrow-up:before{content:"\f062"}.fa-television:before,.fa-tv-alt:before,.fa-tv:before{content:"\f26c"}.fa-shrimp:before{content:"\e448"}.fa-list-check:before,.fa-tasks:before{content:"\f0ae"}.fa-jug-detergent:before{content:"\e519"}.fa-circle-user:before,.fa-user-circle:before{content:"\f2bd"}.fa-user-shield:before{content:"\f505"}.fa-wind:before{content:"\f72e"}.fa-car-burst:before,.fa-car-crash:before{content:"\f5e1"}.fa-y:before{content:"\59"}.fa-person-snowboarding:before,.fa-snowboarding:before{content:"\f7ce"}.fa-shipping-fast:before,.fa-truck-fast:before{content:"\f48b"}.fa-fish:before{content:"\f578"}.fa-user-graduate:before{content:"\f501"}.fa-adjust:before,.fa-circle-half-stroke:before{content:"\f042"}.fa-clapperboard:before{content:"\e131"}.fa-circle-radiation:before,.fa-radiation-alt:before{content:"\f7ba"}.fa-baseball-ball:before,.fa-baseball:before{content:"\f433"}.fa-jet-fighter-up:before{content:"\e518"}.fa-diagram-project:before,.fa-project-diagram:before{content:"\f542"}.fa-copy:before{content:"\f0c5"}.fa-volume-mute:before,.fa-volume-times:before,.fa-volume-xmark:before{content:"\f6a9"}.fa-hand-sparkles:before{content:"\e05d"}.fa-grip-horizontal:before,.fa-grip:before{content:"\f58d"}.fa-share-from-square:before,.fa-share-square:before{content:"\f14d"}.fa-gun:before{content:"\e19b"}.fa-phone-square:before,.fa-square-phone:before{content:"\f098"}.fa-add:before,.fa-plus:before{content:"\2b"}.fa-expand:before{content:"\f065"}.fa-computer:before{content:"\e4e5"}.fa-close:before,.fa-multiply:before,.fa-remove:before,.fa-times:before,.fa-xmark:before{content:"\f00d"}.fa-arrows-up-down-left-right:before,.fa-arrows:before{content:"\f047"}.fa-chalkboard-teacher:before,.fa-chalkboard-user:before{content:"\f51c"}.fa-peso-sign:before{content:"\e222"}.fa-building-shield:before{content:"\e4d8"}.fa-baby:before{content:"\f77c"}.fa-users-line:before{content:"\e592"}.fa-quote-left-alt:before,.fa-quote-left:before{content:"\f10d"}.fa-tractor:before{content:"\f722"}.fa-trash-arrow-up:before,.fa-trash-restore:before{content:"\f829"}.fa-arrow-down-up-lock:before{content:"\e4b0"}.fa-lines-leaning:before{content:"\e51e"}.fa-ruler-combined:before{content:"\f546"}.fa-copyright:before{content:"\f1f9"}.fa-equals:before{content:"\3d"}.fa-blender:before{content:"\f517"}.fa-teeth:before{content:"\f62e"}.fa-ils:before,.fa-shekel-sign:before,.fa-shekel:before,.fa-sheqel-sign:before,.fa-sheqel:before{content:"\f20b"}.fa-map:before{content:"\f279"}.fa-rocket:before{content:"\f135"}.fa-photo-film:before,.fa-photo-video:before{content:"\f87c"}.fa-folder-minus:before{content:"\f65d"}.fa-store:before{content:"\f54e"}.fa-arrow-trend-up:before{content:"\e098"}.fa-plug-circle-minus:before{content:"\e55e"}.fa-sign-hanging:before,.fa-sign:before{content:"\f4d9"}.fa-bezier-curve:before{content:"\f55b"}.fa-bell-slash:before{content:"\f1f6"}.fa-tablet-android:before,.fa-tablet:before{content:"\f3fb"}.fa-school-flag:before{content:"\e56e"}.fa-fill:before{content:"\f575"}.fa-angle-up:before{content:"\f106"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-holly-berry:before{content:"\f7aa"}.fa-chevron-left:before{content:"\f053"}.fa-bacteria:before{content:"\e059"}.fa-hand-lizard:before{content:"\f258"}.fa-disease:before{content:"\f7fa"}.fa-briefcase-medical:before{content:"\f469"}.fa-genderless:before{content:"\f22d"}.fa-chevron-right:before{content:"\f054"}.fa-retweet:before{content:"\f079"}.fa-car-alt:before,.fa-car-rear:before{content:"\f5de"}.fa-pump-soap:before{content:"\e06b"}.fa-video-slash:before{content:"\f4e2"}.fa-battery-2:before,.fa-battery-quarter:before{content:"\f243"}.fa-radio:before{content:"\f8d7"}.fa-baby-carriage:before,.fa-carriage-baby:before{content:"\f77d"}.fa-traffic-light:before{content:"\f637"}.fa-thermometer:before{content:"\f491"}.fa-vr-cardboard:before{content:"\f729"}.fa-hand-middle-finger:before{content:"\f806"}.fa-percent:before,.fa-percentage:before{content:"\25"}.fa-truck-moving:before{content:"\f4df"}.fa-glass-water-droplet:before{content:"\e4f5"}.fa-display:before{content:"\e163"}.fa-face-smile:before,.fa-smile:before{content:"\f118"}.fa-thumb-tack:before,.fa-thumbtack:before{content:"\f08d"}.fa-trophy:before{content:"\f091"}.fa-person-praying:before,.fa-pray:before{content:"\f683"}.fa-hammer:before{content:"\f6e3"}.fa-hand-peace:before{content:"\f25b"}.fa-rotate:before,.fa-sync-alt:before{content:"\f2f1"}.fa-spinner:before{content:"\f110"}.fa-robot:before{content:"\f544"}.fa-peace:before{content:"\f67c"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-warehouse:before{content:"\f494"}.fa-arrow-up-right-dots:before{content:"\e4b7"}.fa-splotch:before{content:"\f5bc"}.fa-face-grin-hearts:before,.fa-grin-hearts:before{content:"\f584"}.fa-dice-four:before{content:"\f524"}.fa-sim-card:before{content:"\f7c4"}.fa-transgender-alt:before,.fa-transgender:before{content:"\f225"}.fa-mercury:before{content:"\f223"}.fa-arrow-turn-down:before,.fa-level-down:before{content:"\f149"}.fa-person-falling-burst:before{content:"\e547"}.fa-award:before{content:"\f559"}.fa-ticket-alt:before,.fa-ticket-simple:before{content:"\f3ff"}.fa-building:before{content:"\f1ad"}.fa-angle-double-left:before,.fa-angles-left:before{content:"\f100"}.fa-qrcode:before{content:"\f029"}.fa-clock-rotate-left:before,.fa-history:before{content:"\f1da"}.fa-face-grin-beam-sweat:before,.fa-grin-beam-sweat:before{content:"\f583"}.fa-arrow-right-from-file:before,.fa-file-export:before{content:"\f56e"}.fa-shield-blank:before,.fa-shield:before{content:"\f132"}.fa-arrow-up-short-wide:before,.fa-sort-amount-up-alt:before{content:"\f885"}.fa-house-medical:before{content:"\e3b2"}.fa-golf-ball-tee:before,.fa-golf-ball:before{content:"\f450"}.fa-chevron-circle-left:before,.fa-circle-chevron-left:before{content:"\f137"}.fa-house-chimney-window:before{content:"\e00d"}.fa-pen-nib:before{content:"\f5ad"}.fa-tent-arrow-turn-left:before{content:"\e580"}.fa-tents:before{content:"\e582"}.fa-magic:before,.fa-wand-magic:before{content:"\f0d0"}.fa-dog:before{content:"\f6d3"}.fa-carrot:before{content:"\f787"}.fa-moon:before{content:"\f186"}.fa-wine-glass-alt:before,.fa-wine-glass-empty:before{content:"\f5ce"}.fa-cheese:before{content:"\f7ef"}.fa-yin-yang:before{content:"\f6ad"}.fa-music:before{content:"\f001"}.fa-code-commit:before{content:"\f386"}.fa-temperature-low:before{content:"\f76b"}.fa-biking:before,.fa-person-biking:before{content:"\f84a"}.fa-broom:before{content:"\f51a"}.fa-shield-heart:before{content:"\e574"}.fa-gopuram:before{content:"\f664"}.fa-earth-oceania:before,.fa-globe-oceania:before{content:"\e47b"}.fa-square-xmark:before,.fa-times-square:before,.fa-xmark-square:before{content:"\f2d3"}.fa-hashtag:before{content:"\23"}.fa-expand-alt:before,.fa-up-right-and-down-left-from-center:before{content:"\f424"}.fa-oil-can:before{content:"\f613"}.fa-t:before{content:"\54"}.fa-hippo:before{content:"\f6ed"}.fa-chart-column:before{content:"\e0e3"}.fa-infinity:before{content:"\f534"}.fa-vial-circle-check:before{content:"\e596"}.fa-person-arrow-down-to-line:before{content:"\e538"}.fa-voicemail:before{content:"\f897"}.fa-fan:before{content:"\f863"}.fa-person-walking-luggage:before{content:"\e554"}.fa-arrows-alt-v:before,.fa-up-down:before{content:"\f338"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-calendar:before{content:"\f133"}.fa-trailer:before{content:"\e041"}.fa-bahai:before,.fa-haykal:before{content:"\f666"}.fa-sd-card:before{content:"\f7c2"}.fa-dragon:before{content:"\f6d5"}.fa-shoe-prints:before{content:"\f54b"}.fa-circle-plus:before,.fa-plus-circle:before{content:"\f055"}.fa-face-grin-tongue-wink:before,.fa-grin-tongue-wink:before{content:"\f58b"}.fa-hand-holding:before{content:"\f4bd"}.fa-plug-circle-exclamation:before{content:"\e55d"}.fa-chain-broken:before,.fa-chain-slash:before,.fa-link-slash:before,.fa-unlink:before{content:"\f127"}.fa-clone:before{content:"\f24d"}.fa-person-walking-arrow-loop-left:before{content:"\e551"}.fa-arrow-up-z-a:before,.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-fire-alt:before,.fa-fire-flame-curved:before{content:"\f7e4"}.fa-tornado:before{content:"\f76f"}.fa-file-circle-plus:before{content:"\e494"}.fa-book-quran:before,.fa-quran:before{content:"\f687"}.fa-anchor:before{content:"\f13d"}.fa-border-all:before{content:"\f84c"}.fa-angry:before,.fa-face-angry:before{content:"\f556"}.fa-cookie-bite:before{content:"\f564"}.fa-arrow-trend-down:before{content:"\e097"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-draw-polygon:before{content:"\f5ee"}.fa-balance-scale:before,.fa-scale-balanced:before{content:"\f24e"}.fa-gauge-simple-high:before,.fa-tachometer-fast:before,.fa-tachometer:before{content:"\f62a"}.fa-shower:before{content:"\f2cc"}.fa-desktop-alt:before,.fa-desktop:before{content:"\f390"}.fa-m:before{content:"\4d"}.fa-table-list:before,.fa-th-list:before{content:"\f00b"}.fa-comment-sms:before,.fa-sms:before{content:"\f7cd"}.fa-book:before{content:"\f02d"}.fa-user-plus:before{content:"\f234"}.fa-check:before{content:"\f00c"}.fa-battery-4:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-house-circle-check:before{content:"\e509"}.fa-angle-left:before{content:"\f104"}.fa-diagram-successor:before{content:"\e47a"}.fa-truck-arrow-right:before{content:"\e58b"}.fa-arrows-split-up-and-left:before{content:"\e4bc"}.fa-fist-raised:before,.fa-hand-fist:before{content:"\f6de"}.fa-cloud-moon:before{content:"\f6c3"}.fa-briefcase:before{content:"\f0b1"}.fa-person-falling:before{content:"\e546"}.fa-image-portrait:before,.fa-portrait:before{content:"\f3e0"}.fa-user-tag:before{content:"\f507"}.fa-rug:before{content:"\e569"}.fa-earth-europe:before,.fa-globe-europe:before{content:"\f7a2"}.fa-cart-flatbed-suitcase:before,.fa-luggage-cart:before{content:"\f59d"}.fa-rectangle-times:before,.fa-rectangle-xmark:before,.fa-times-rectangle:before,.fa-window-close:before{content:"\f410"}.fa-baht-sign:before{content:"\e0ac"}.fa-book-open:before{content:"\f518"}.fa-book-journal-whills:before,.fa-journal-whills:before{content:"\f66a"}.fa-handcuffs:before{content:"\e4f8"}.fa-exclamation-triangle:before,.fa-triangle-exclamation:before,.fa-warning:before{content:"\f071"}.fa-database:before{content:"\f1c0"}.fa-arrow-turn-right:before,.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-bottle-droplet:before{content:"\e4c4"}.fa-mask-face:before{content:"\e1d7"}.fa-hill-rockslide:before{content:"\e508"}.fa-exchange-alt:before,.fa-right-left:before{content:"\f362"}.fa-paper-plane:before{content:"\f1d8"}.fa-road-circle-exclamation:before{content:"\e565"}.fa-dungeon:before{content:"\f6d9"}.fa-align-right:before{content:"\f038"}.fa-money-bill-1-wave:before,.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-life-ring:before{content:"\f1cd"}.fa-hands:before,.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-calendar-day:before{content:"\f783"}.fa-ladder-water:before,.fa-swimming-pool:before,.fa-water-ladder:before{content:"\f5c5"}.fa-arrows-up-down:before,.fa-arrows-v:before{content:"\f07d"}.fa-face-grimace:before,.fa-grimace:before{content:"\f57f"}.fa-wheelchair-alt:before,.fa-wheelchair-move:before{content:"\e2ce"}.fa-level-down-alt:before,.fa-turn-down:before{content:"\f3be"}.fa-person-walking-arrow-right:before{content:"\e552"}.fa-envelope-square:before,.fa-square-envelope:before{content:"\f199"}.fa-dice:before{content:"\f522"}.fa-bowling-ball:before{content:"\f436"}.fa-brain:before{content:"\f5dc"}.fa-band-aid:before,.fa-bandage:before{content:"\f462"}.fa-calendar-minus:before{content:"\f272"}.fa-circle-xmark:before,.fa-times-circle:before,.fa-xmark-circle:before{content:"\f057"}.fa-gifts:before{content:"\f79c"}.fa-hotel:before{content:"\f594"}.fa-earth-asia:before,.fa-globe-asia:before{content:"\f57e"}.fa-id-card-alt:before,.fa-id-card-clip:before{content:"\f47f"}.fa-magnifying-glass-plus:before,.fa-search-plus:before{content:"\f00e"}.fa-thumbs-up:before{content:"\f164"}.fa-user-clock:before{content:"\f4fd"}.fa-allergies:before,.fa-hand-dots:before{content:"\f461"}.fa-file-invoice:before{content:"\f570"}.fa-window-minimize:before{content:"\f2d1"}.fa-coffee:before,.fa-mug-saucer:before{content:"\f0f4"}.fa-brush:before{content:"\f55d"}.fa-mask:before{content:"\f6fa"}.fa-magnifying-glass-minus:before,.fa-search-minus:before{content:"\f010"}.fa-ruler-vertical:before{content:"\f548"}.fa-user-alt:before,.fa-user-large:before{content:"\f406"}.fa-train-tram:before{content:"\e5b4"}.fa-user-nurse:before{content:"\f82f"}.fa-syringe:before{content:"\f48e"}.fa-cloud-sun:before{content:"\f6c4"}.fa-stopwatch-20:before{content:"\e06f"}.fa-square-full:before{content:"\f45c"}.fa-magnet:before{content:"\f076"}.fa-jar:before{content:"\e516"}.fa-note-sticky:before,.fa-sticky-note:before{content:"\f249"}.fa-bug-slash:before{content:"\e490"}.fa-arrow-up-from-water-pump:before{content:"\e4b6"}.fa-bone:before{content:"\f5d7"}.fa-user-injured:before{content:"\f728"}.fa-face-sad-tear:before,.fa-sad-tear:before{content:"\f5b4"}.fa-plane:before{content:"\f072"}.fa-tent-arrows-down:before{content:"\e581"}.fa-exclamation:before{content:"\21"}.fa-arrows-spin:before{content:"\e4bb"}.fa-print:before{content:"\f02f"}.fa-try:before,.fa-turkish-lira-sign:before,.fa-turkish-lira:before{content:"\e2bb"}.fa-dollar-sign:before,.fa-dollar:before,.fa-usd:before{content:"\24"}.fa-x:before{content:"\58"}.fa-magnifying-glass-dollar:before,.fa-search-dollar:before{content:"\f688"}.fa-users-cog:before,.fa-users-gear:before{content:"\f509"}.fa-person-military-pointing:before{content:"\e54a"}.fa-bank:before,.fa-building-columns:before,.fa-institution:before,.fa-museum:before,.fa-university:before{content:"\f19c"}.fa-umbrella:before{content:"\f0e9"}.fa-trowel:before{content:"\e589"}.fa-d:before{content:"\44"}.fa-stapler:before{content:"\e5af"}.fa-masks-theater:before,.fa-theater-masks:before{content:"\f630"}.fa-kip-sign:before{content:"\e1c4"}.fa-hand-point-left:before{content:"\f0a5"}.fa-handshake-alt:before,.fa-handshake-simple:before{content:"\f4c6"}.fa-fighter-jet:before,.fa-jet-fighter:before{content:"\f0fb"}.fa-share-alt-square:before,.fa-square-share-nodes:before{content:"\f1e1"}.fa-barcode:before{content:"\f02a"}.fa-plus-minus:before{content:"\e43c"}.fa-video-camera:before,.fa-video:before{content:"\f03d"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-person-circle-check:before{content:"\e53e"}.fa-level-up-alt:before,.fa-turn-up:before{content:"\f3bf"}.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}:host,:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}.fa-brands,.fab{font-weight:400}.fa-monero:before{content:"\f3d0"}.fa-hooli:before{content:"\f427"}.fa-yelp:before{content:"\f1e9"}.fa-cc-visa:before{content:"\f1f0"}.fa-lastfm:before{content:"\f202"}.fa-shopware:before{content:"\f5b5"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-aws:before{content:"\f375"}.fa-redhat:before{content:"\f7bc"}.fa-yoast:before{content:"\f2b1"}.fa-cloudflare:before{content:"\e07d"}.fa-ups:before{content:"\f7e0"}.fa-wpexplorer:before{content:"\f2de"}.fa-dyalog:before{content:"\f399"}.fa-bity:before{content:"\f37a"}.fa-stackpath:before{content:"\f842"}.fa-buysellads:before{content:"\f20d"}.fa-first-order:before{content:"\f2b0"}.fa-modx:before{content:"\f285"}.fa-guilded:before{content:"\e07e"}.fa-vnv:before{content:"\f40b"}.fa-js-square:before,.fa-square-js:before{content:"\f3b9"}.fa-microsoft:before{content:"\f3ca"}.fa-qq:before{content:"\f1d6"}.fa-orcid:before{content:"\f8d2"}.fa-java:before{content:"\f4e4"}.fa-invision:before{content:"\f7b0"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-centercode:before{content:"\f380"}.fa-glide-g:before{content:"\f2a6"}.fa-drupal:before{content:"\f1a9"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-unity:before{content:"\e049"}.fa-whmcs:before{content:"\f40d"}.fa-rocketchat:before{content:"\f3e8"}.fa-vk:before{content:"\f189"}.fa-untappd:before{content:"\f405"}.fa-mailchimp:before{content:"\f59e"}.fa-css3-alt:before{content:"\f38b"}.fa-reddit-square:before,.fa-square-reddit:before{content:"\f1a2"}.fa-vimeo-v:before{content:"\f27d"}.fa-contao:before{content:"\f26d"}.fa-square-font-awesome:before{content:"\e5ad"}.fa-deskpro:before{content:"\f38f"}.fa-sistrix:before{content:"\f3ee"}.fa-instagram-square:before,.fa-square-instagram:before{content:"\e055"}.fa-battle-net:before{content:"\f835"}.fa-the-red-yeti:before{content:"\f69d"}.fa-hacker-news-square:before,.fa-square-hacker-news:before{content:"\f3af"}.fa-edge:before{content:"\f282"}.fa-napster:before{content:"\f3d2"}.fa-snapchat-square:before,.fa-square-snapchat:before{content:"\f2ad"}.fa-google-plus-g:before{content:"\f0d5"}.fa-artstation:before{content:"\f77a"}.fa-markdown:before{content:"\f60f"}.fa-sourcetree:before{content:"\f7d3"}.fa-google-plus:before{content:"\f2b3"}.fa-diaspora:before{content:"\f791"}.fa-foursquare:before{content:"\f180"}.fa-stack-overflow:before{content:"\f16c"}.fa-github-alt:before{content:"\f113"}.fa-phoenix-squadron:before{content:"\f511"}.fa-pagelines:before{content:"\f18c"}.fa-algolia:before{content:"\f36c"}.fa-red-river:before{content:"\f3e3"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-safari:before{content:"\f267"}.fa-google:before{content:"\f1a0"}.fa-font-awesome-alt:before,.fa-square-font-awesome-stroke:before{content:"\f35c"}.fa-atlassian:before{content:"\f77b"}.fa-linkedin-in:before{content:"\f0e1"}.fa-digital-ocean:before{content:"\f391"}.fa-nimblr:before{content:"\f5a8"}.fa-chromecast:before{content:"\f838"}.fa-evernote:before{content:"\f839"}.fa-hacker-news:before{content:"\f1d4"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-adversal:before{content:"\f36a"}.fa-creative-commons:before{content:"\f25e"}.fa-watchman-monitoring:before{content:"\e087"}.fa-fonticons:before{content:"\f280"}.fa-weixin:before{content:"\f1d7"}.fa-shirtsinbulk:before{content:"\f214"}.fa-codepen:before{content:"\f1cb"}.fa-git-alt:before{content:"\f841"}.fa-lyft:before{content:"\f3c3"}.fa-rev:before{content:"\f5b2"}.fa-windows:before{content:"\f17a"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-square-viadeo:before,.fa-viadeo-square:before{content:"\f2aa"}.fa-meetup:before{content:"\f2e0"}.fa-centos:before{content:"\f789"}.fa-adn:before{content:"\f170"}.fa-cloudsmith:before{content:"\f384"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-dribbble-square:before,.fa-square-dribbble:before{content:"\f397"}.fa-codiepie:before{content:"\f284"}.fa-node:before{content:"\f419"}.fa-mix:before{content:"\f3cb"}.fa-steam:before{content:"\f1b6"}.fa-cc-apple-pay:before{content:"\f416"}.fa-scribd:before{content:"\f28a"}.fa-openid:before{content:"\f19b"}.fa-instalod:before{content:"\e081"}.fa-expeditedssl:before{content:"\f23e"}.fa-sellcast:before{content:"\f2da"}.fa-square-twitter:before,.fa-twitter-square:before{content:"\f081"}.fa-r-project:before{content:"\f4f7"}.fa-delicious:before{content:"\f1a5"}.fa-freebsd:before{content:"\f3a4"}.fa-vuejs:before{content:"\f41f"}.fa-accusoft:before{content:"\f369"}.fa-ioxhost:before{content:"\f208"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-app-store:before{content:"\f36f"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-itunes-note:before{content:"\f3b5"}.fa-golang:before{content:"\e40f"}.fa-kickstarter:before{content:"\f3bb"}.fa-grav:before{content:"\f2d6"}.fa-weibo:before{content:"\f18a"}.fa-uncharted:before{content:"\e084"}.fa-firstdraft:before{content:"\f3a1"}.fa-square-youtube:before,.fa-youtube-square:before{content:"\f431"}.fa-wikipedia-w:before{content:"\f266"}.fa-rendact:before,.fa-wpressr:before{content:"\f3e4"}.fa-angellist:before{content:"\f209"}.fa-galactic-republic:before{content:"\f50c"}.fa-nfc-directional:before{content:"\e530"}.fa-skype:before{content:"\f17e"}.fa-joget:before{content:"\f3b7"}.fa-fedora:before{content:"\f798"}.fa-stripe-s:before{content:"\f42a"}.fa-meta:before{content:"\e49b"}.fa-laravel:before{content:"\f3bd"}.fa-hotjar:before{content:"\f3b1"}.fa-bluetooth-b:before{content:"\f294"}.fa-sticker-mule:before{content:"\f3f7"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-hips:before{content:"\f452"}.fa-behance:before{content:"\f1b4"}.fa-reddit:before{content:"\f1a1"}.fa-discord:before{content:"\f392"}.fa-chrome:before{content:"\f268"}.fa-app-store-ios:before{content:"\f370"}.fa-cc-discover:before{content:"\f1f2"}.fa-wpbeginner:before{content:"\f297"}.fa-confluence:before{content:"\f78d"}.fa-mdb:before{content:"\f8ca"}.fa-dochub:before{content:"\f394"}.fa-accessible-icon:before{content:"\f368"}.fa-ebay:before{content:"\f4f4"}.fa-amazon:before{content:"\f270"}.fa-unsplash:before{content:"\e07c"}.fa-yarn:before{content:"\f7e3"}.fa-square-steam:before,.fa-steam-square:before{content:"\f1b7"}.fa-500px:before{content:"\f26e"}.fa-square-vimeo:before,.fa-vimeo-square:before{content:"\f194"}.fa-asymmetrik:before{content:"\f372"}.fa-font-awesome-flag:before,.fa-font-awesome-logo-full:before,.fa-font-awesome:before{content:"\f2b4"}.fa-gratipay:before{content:"\f184"}.fa-apple:before{content:"\f179"}.fa-hive:before{content:"\e07f"}.fa-gitkraken:before{content:"\f3a6"}.fa-keybase:before{content:"\f4f5"}.fa-apple-pay:before{content:"\f415"}.fa-padlet:before{content:"\e4a0"}.fa-amazon-pay:before{content:"\f42c"}.fa-github-square:before,.fa-square-github:before{content:"\f092"}.fa-stumbleupon:before{content:"\f1a4"}.fa-fedex:before{content:"\f797"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-shopify:before{content:"\e057"}.fa-neos:before{content:"\f612"}.fa-hackerrank:before{content:"\f5f7"}.fa-researchgate:before{content:"\f4f8"}.fa-swift:before{content:"\f8e1"}.fa-angular:before{content:"\f420"}.fa-speakap:before{content:"\f3f3"}.fa-angrycreative:before{content:"\f36e"}.fa-y-combinator:before{content:"\f23b"}.fa-empire:before{content:"\f1d1"}.fa-envira:before{content:"\f299"}.fa-gitlab-square:before,.fa-square-gitlab:before{content:"\e5ae"}.fa-studiovinari:before{content:"\f3f8"}.fa-pied-piper:before{content:"\f2ae"}.fa-wordpress:before{content:"\f19a"}.fa-product-hunt:before{content:"\f288"}.fa-firefox:before{content:"\f269"}.fa-linode:before{content:"\f2b8"}.fa-goodreads:before{content:"\f3a8"}.fa-odnoklassniki-square:before,.fa-square-odnoklassniki:before{content:"\f264"}.fa-jsfiddle:before{content:"\f1cc"}.fa-sith:before{content:"\f512"}.fa-themeisle:before{content:"\f2b2"}.fa-page4:before{content:"\f3d7"}.fa-hashnode:before{content:"\e499"}.fa-react:before{content:"\f41b"}.fa-cc-paypal:before{content:"\f1f4"}.fa-squarespace:before{content:"\f5be"}.fa-cc-stripe:before{content:"\f1f5"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-bitcoin:before{content:"\f379"}.fa-keycdn:before{content:"\f3ba"}.fa-opera:before{content:"\f26a"}.fa-itch-io:before{content:"\f83a"}.fa-umbraco:before{content:"\f8e8"}.fa-galactic-senate:before{content:"\f50d"}.fa-ubuntu:before{content:"\f7df"}.fa-draft2digital:before{content:"\f396"}.fa-stripe:before{content:"\f429"}.fa-houzz:before{content:"\f27c"}.fa-gg:before{content:"\f260"}.fa-dhl:before{content:"\f790"}.fa-pinterest-square:before,.fa-square-pinterest:before{content:"\f0d3"}.fa-xing:before{content:"\f168"}.fa-blackberry:before{content:"\f37b"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-playstation:before{content:"\f3df"}.fa-quinscape:before{content:"\f459"}.fa-less:before{content:"\f41d"}.fa-blogger-b:before{content:"\f37d"}.fa-opencart:before{content:"\f23d"}.fa-vine:before{content:"\f1ca"}.fa-paypal:before{content:"\f1ed"}.fa-gitlab:before{content:"\f296"}.fa-typo3:before{content:"\f42b"}.fa-reddit-alien:before{content:"\f281"}.fa-yahoo:before{content:"\f19e"}.fa-dailymotion:before{content:"\e052"}.fa-affiliatetheme:before{content:"\f36b"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-bootstrap:before{content:"\f836"}.fa-odnoklassniki:before{content:"\f263"}.fa-nfc-symbol:before{content:"\e531"}.fa-ethereum:before{content:"\f42e"}.fa-speaker-deck:before{content:"\f83c"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-patreon:before{content:"\f3d9"}.fa-avianex:before{content:"\f374"}.fa-ello:before{content:"\f5f1"}.fa-gofore:before{content:"\f3a7"}.fa-bimobject:before{content:"\f378"}.fa-facebook-f:before{content:"\f39e"}.fa-google-plus-square:before,.fa-square-google-plus:before{content:"\f0d4"}.fa-mandalorian:before{content:"\f50f"}.fa-first-order-alt:before{content:"\f50a"}.fa-osi:before{content:"\f41a"}.fa-google-wallet:before{content:"\f1ee"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-periscope:before{content:"\f3da"}.fa-fulcrum:before{content:"\f50b"}.fa-cloudscale:before{content:"\f383"}.fa-forumbee:before{content:"\f211"}.fa-mizuni:before{content:"\f3cc"}.fa-schlix:before{content:"\f3ea"}.fa-square-xing:before,.fa-xing-square:before{content:"\f169"}.fa-bandcamp:before{content:"\f2d5"}.fa-wpforms:before{content:"\f298"}.fa-cloudversify:before{content:"\f385"}.fa-usps:before{content:"\f7e1"}.fa-megaport:before{content:"\f5a3"}.fa-magento:before{content:"\f3c4"}.fa-spotify:before{content:"\f1bc"}.fa-optin-monster:before{content:"\f23c"}.fa-fly:before{content:"\f417"}.fa-aviato:before{content:"\f421"}.fa-itunes:before{content:"\f3b4"}.fa-cuttlefish:before{content:"\f38c"}.fa-blogger:before{content:"\f37c"}.fa-flickr:before{content:"\f16e"}.fa-viber:before{content:"\f409"}.fa-soundcloud:before{content:"\f1be"}.fa-digg:before{content:"\f1a6"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-symfony:before{content:"\f83d"}.fa-maxcdn:before{content:"\f136"}.fa-etsy:before{content:"\f2d7"}.fa-facebook-messenger:before{content:"\f39f"}.fa-audible:before{content:"\f373"}.fa-think-peaks:before{content:"\f731"}.fa-bilibili:before{content:"\e3d9"}.fa-erlang:before{content:"\f39d"}.fa-cotton-bureau:before{content:"\f89e"}.fa-dashcube:before{content:"\f210"}.fa-42-group:before,.fa-innosoft:before{content:"\e080"}.fa-stack-exchange:before{content:"\f18d"}.fa-elementor:before{content:"\f430"}.fa-pied-piper-square:before,.fa-square-pied-piper:before{content:"\e01e"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-palfed:before{content:"\f3d8"}.fa-superpowers:before{content:"\f2dd"}.fa-resolving:before{content:"\f3e7"}.fa-xbox:before{content:"\f412"}.fa-searchengin:before{content:"\f3eb"}.fa-tiktok:before{content:"\e07b"}.fa-facebook-square:before,.fa-square-facebook:before{content:"\f082"}.fa-renren:before{content:"\f18b"}.fa-linux:before{content:"\f17c"}.fa-glide:before{content:"\f2a5"}.fa-linkedin:before{content:"\f08c"}.fa-hubspot:before{content:"\f3b2"}.fa-deploydog:before{content:"\f38e"}.fa-twitch:before{content:"\f1e8"}.fa-ravelry:before{content:"\f2d9"}.fa-mixer:before{content:"\e056"}.fa-lastfm-square:before,.fa-square-lastfm:before{content:"\f203"}.fa-vimeo:before{content:"\f40a"}.fa-mendeley:before{content:"\f7b3"}.fa-uniregistry:before{content:"\f404"}.fa-figma:before{content:"\f799"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-dropbox:before{content:"\f16b"}.fa-instagram:before{content:"\f16d"}.fa-cmplid:before{content:"\e360"}.fa-facebook:before{content:"\f09a"}.fa-gripfire:before{content:"\f3ac"}.fa-jedi-order:before{content:"\f50e"}.fa-uikit:before{content:"\f403"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-phabricator:before{content:"\f3db"}.fa-ussunnah:before{content:"\f407"}.fa-earlybirds:before{content:"\f39a"}.fa-trade-federation:before{content:"\f513"}.fa-autoprefixer:before{content:"\f41c"}.fa-whatsapp:before{content:"\f232"}.fa-slideshare:before{content:"\f1e7"}.fa-google-play:before{content:"\f3ab"}.fa-viadeo:before{content:"\f2a9"}.fa-line:before{content:"\f3c0"}.fa-google-drive:before{content:"\f3aa"}.fa-servicestack:before{content:"\f3ec"}.fa-simplybuilt:before{content:"\f215"}.fa-bitbucket:before{content:"\f171"}.fa-imdb:before{content:"\f2d8"}.fa-deezer:before{content:"\e077"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-jira:before{content:"\f7b1"}.fa-docker:before{content:"\f395"}.fa-screenpal:before{content:"\e570"}.fa-bluetooth:before{content:"\f293"}.fa-gitter:before{content:"\f426"}.fa-d-and-d:before{content:"\f38d"}.fa-microblog:before{content:"\e01a"}.fa-cc-diners-club:before{content:"\f24c"}.fa-gg-circle:before{content:"\f261"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-yandex:before{content:"\f413"}.fa-readme:before{content:"\f4d5"}.fa-html5:before{content:"\f13b"}.fa-sellsy:before{content:"\f213"}.fa-sass:before{content:"\f41e"}.fa-wirsindhandwerk:before,.fa-wsh:before{content:"\e2d0"}.fa-buromobelexperte:before{content:"\f37f"}.fa-salesforce:before{content:"\f83b"}.fa-octopus-deploy:before{content:"\e082"}.fa-medapps:before{content:"\f3c6"}.fa-ns8:before{content:"\f3d5"}.fa-pinterest-p:before{content:"\f231"}.fa-apper:before{content:"\f371"}.fa-fort-awesome:before{content:"\f286"}.fa-waze:before{content:"\f83f"}.fa-cc-jcb:before{content:"\f24b"}.fa-snapchat-ghost:before,.fa-snapchat:before{content:"\f2ab"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-rust:before{content:"\e07a"}.fa-wix:before{content:"\f5cf"}.fa-behance-square:before,.fa-square-behance:before{content:"\f1b5"}.fa-supple:before{content:"\f3f9"}.fa-rebel:before{content:"\f1d0"}.fa-css3:before{content:"\f13c"}.fa-staylinked:before{content:"\f3f5"}.fa-kaggle:before{content:"\f5fa"}.fa-space-awesome:before{content:"\e5ac"}.fa-deviantart:before{content:"\f1bd"}.fa-cpanel:before{content:"\f388"}.fa-goodreads-g:before{content:"\f3a9"}.fa-git-square:before,.fa-square-git:before{content:"\f1d2"}.fa-square-tumblr:before,.fa-tumblr-square:before{content:"\f174"}.fa-trello:before{content:"\f181"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-get-pocket:before{content:"\f265"}.fa-perbyte:before{content:"\e083"}.fa-grunt:before{content:"\f3ad"}.fa-weebly:before{content:"\f5cc"}.fa-connectdevelop:before{content:"\f20e"}.fa-leanpub:before{content:"\f212"}.fa-black-tie:before{content:"\f27e"}.fa-themeco:before{content:"\f5c6"}.fa-python:before{content:"\f3e2"}.fa-android:before{content:"\f17b"}.fa-bots:before{content:"\e340"}.fa-free-code-camp:before{content:"\f2c5"}.fa-hornbill:before{content:"\f592"}.fa-js:before{content:"\f3b8"}.fa-ideal:before{content:"\e013"}.fa-git:before{content:"\f1d3"}.fa-dev:before{content:"\f6cc"}.fa-sketch:before{content:"\f7c6"}.fa-yandex-international:before{content:"\f414"}.fa-cc-amex:before{content:"\f1f3"}.fa-uber:before{content:"\f402"}.fa-github:before{content:"\f09b"}.fa-php:before{content:"\f457"}.fa-alipay:before{content:"\f642"}.fa-youtube:before{content:"\f167"}.fa-skyatlas:before{content:"\f216"}.fa-firefox-browser:before{content:"\e007"}.fa-replyd:before{content:"\f3e6"}.fa-suse:before{content:"\f7d6"}.fa-jenkins:before{content:"\f3b6"}.fa-twitter:before{content:"\f099"}.fa-rockrms:before{content:"\f3e9"}.fa-pinterest:before{content:"\f0d2"}.fa-buffer:before{content:"\f837"}.fa-npm:before{content:"\f3d4"}.fa-yammer:before{content:"\f840"}.fa-btc:before{content:"\f15a"}.fa-dribbble:before{content:"\f17d"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-internet-explorer:before{content:"\f26b"}.fa-telegram-plane:before,.fa-telegram:before{content:"\f2c6"}.fa-old-republic:before{content:"\f510"}.fa-square-whatsapp:before,.fa-whatsapp-square:before{content:"\f40c"}.fa-node-js:before{content:"\f3d3"}.fa-edge-legacy:before{content:"\e078"}.fa-slack-hash:before,.fa-slack:before{content:"\f198"}.fa-medrt:before{content:"\f3c8"}.fa-usb:before{content:"\f287"}.fa-tumblr:before{content:"\f173"}.fa-vaadin:before{content:"\f408"}.fa-quora:before{content:"\f2c4"}.fa-reacteurope:before{content:"\f75d"}.fa-medium-m:before,.fa-medium:before{content:"\f23a"}.fa-amilia:before{content:"\f36d"}.fa-mixcloud:before{content:"\f289"}.fa-flipboard:before{content:"\f44d"}.fa-viacoin:before{content:"\f237"}.fa-critical-role:before{content:"\f6c9"}.fa-sitrox:before{content:"\e44a"}.fa-discourse:before{content:"\f393"}.fa-joomla:before{content:"\f1aa"}.fa-mastodon:before{content:"\f4f6"}.fa-airbnb:before{content:"\f834"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-buy-n-large:before{content:"\f8a6"}.fa-gulp:before{content:"\f3ae"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-strava:before{content:"\f428"}.fa-ember:before{content:"\f423"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-teamspeak:before{content:"\f4f9"}.fa-pushed:before{content:"\f3e1"}.fa-wordpress-simple:before{content:"\f411"}.fa-nutritionix:before{content:"\f3d6"}.fa-wodu:before{content:"\e088"}.fa-google-pay:before{content:"\e079"}.fa-intercom:before{content:"\f7af"}.fa-zhihu:before{content:"\f63f"}.fa-korvue:before{content:"\f42f"}.fa-pix:before{content:"\e43a"}.fa-steam-symbol:before{content:"\f3f6"}:host,:root{--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}.fa-regular,.far{font-weight:400}:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900}@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v4compatibility.woff2) format("woff2"),url(../webfonts/fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a} \ No newline at end of file diff --git a/assets/css/native.css b/assets/css/native.css new file mode 100644 index 000000000..eac4a783c --- /dev/null +++ b/assets/css/native.css @@ -0,0 +1,70 @@ +.highlight pre { background-color: #404040 } +.highlight .hll { background-color: #404040 } +.highlight .c { color: #999999; font-style: italic } /* Comment */ +.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ +.highlight .g { color: #d0d0d0 } /* Generic */ +.highlight .k { color: #6ab825; font-weight: bold } /* Keyword */ +.highlight .l { color: #d0d0d0 } /* Literal */ +.highlight .n { color: #d0d0d0 } /* Name */ +.highlight .o { color: #d0d0d0 } /* Operator */ +.highlight .x { color: #d0d0d0 } /* Other */ +.highlight .p { color: #d0d0d0 } /* Punctuation */ +.highlight .cm { color: #999999; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #cd2828; font-weight: bold } /* Comment.Preproc */ +.highlight .c1 { color: #999999; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */ +.highlight .gd { color: #d22323 } /* Generic.Deleted */ +.highlight .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */ +.highlight .gr { color: #d22323 } /* Generic.Error */ +.highlight .gh { color: #ffffff; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #589819 } /* Generic.Inserted */ +.highlight .go { color: #cccccc } /* Generic.Output */ +.highlight .gp { color: #aaaaaa } /* Generic.Prompt */ +.highlight .gs { color: #d0d0d0; font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #ffffff; text-decoration: underline } /* Generic.Subheading */ +.highlight .gt { color: #d22323 } /* Generic.Traceback */ +.highlight .kc { color: #6ab825; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #6ab825; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #6ab825; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #6ab825 } /* Keyword.Pseudo */ +.highlight .kr { color: #6ab825; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #6ab825; font-weight: bold } /* Keyword.Type */ +.highlight .ld { color: #d0d0d0 } /* Literal.Date */ +.highlight .m { color: #3677a9 } /* Literal.Number */ +.highlight .s { color: #ed9d13 } /* Literal.String */ +.highlight .na { color: #bbbbbb } /* Name.Attribute */ +.highlight .nb { color: #24909d } /* Name.Builtin */ +.highlight .nc { color: #447fcf; text-decoration: underline } /* Name.Class */ +.highlight .no { color: #40ffff } /* Name.Constant */ +.highlight .nd { color: #ffa500 } /* Name.Decorator */ +.highlight .ni { color: #d0d0d0 } /* Name.Entity */ +.highlight .ne { color: #bbbbbb } /* Name.Exception */ +.highlight .nf { color: #447fcf } /* Name.Function */ +.highlight .nl { color: #d0d0d0 } /* Name.Label */ +.highlight .nn { color: #447fcf; text-decoration: underline } /* Name.Namespace */ +.highlight .nx { color: #d0d0d0 } /* Name.Other */ +.highlight .py { color: #d0d0d0 } /* Name.Property */ +.highlight .nt { color: #6ab825; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #40ffff } /* Name.Variable */ +.highlight .ow { color: #6ab825; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #666666 } /* Text.Whitespace */ +.highlight .mf { color: #3677a9 } /* Literal.Number.Float */ +.highlight .mh { color: #3677a9 } /* Literal.Number.Hex */ +.highlight .mi { color: #3677a9 } /* Literal.Number.Integer */ +.highlight .mo { color: #3677a9 } /* Literal.Number.Oct */ +.highlight .sb { color: #ed9d13 } /* Literal.String.Backtick */ +.highlight .sc { color: #ed9d13 } /* Literal.String.Char */ +.highlight .sd { color: #ed9d13 } /* Literal.String.Doc */ +.highlight .s2 { color: #ed9d13 } /* Literal.String.Double */ +.highlight .se { color: #ed9d13 } /* Literal.String.Escape */ +.highlight .sh { color: #ed9d13 } /* Literal.String.Heredoc */ +.highlight .si { color: #ed9d13 } /* Literal.String.Interpol */ +.highlight .sx { color: #ffa500 } /* Literal.String.Other */ +.highlight .sr { color: #ed9d13 } /* Literal.String.Regex */ +.highlight .s1 { color: #ed9d13 } /* Literal.String.Single */ +.highlight .ss { color: #ed9d13 } /* Literal.String.Symbol */ +.highlight .bp { color: #24909d } /* Name.Builtin.Pseudo */ +.highlight .vc { color: #40ffff } /* Name.Variable.Class */ +.highlight .vg { color: #40ffff } /* Name.Variable.Global */ +.highlight .vi { color: #40ffff } /* Name.Variable.Instance */ +.highlight .il { color: #3677a9 } /* Literal.Number.Integer.Long */ diff --git a/assets/images/become_validator.png b/assets/images/become_validator.png new file mode 100644 index 000000000..4b68659dd Binary files /dev/null and b/assets/images/become_validator.png differ diff --git a/assets/images/bitcoin_coin_distribution.png b/assets/images/bitcoin_coin_distribution.png new file mode 100644 index 000000000..e6514563b Binary files /dev/null and b/assets/images/bitcoin_coin_distribution.png differ diff --git a/assets/images/bitcoin_reward.png b/assets/images/bitcoin_reward.png new file mode 100644 index 000000000..05783bebc Binary files /dev/null and b/assets/images/bitcoin_reward.png differ diff --git a/assets/images/delegated_proof_of_stake.png b/assets/images/delegated_proof_of_stake.png new file mode 100644 index 000000000..5db9800cd Binary files /dev/null and b/assets/images/delegated_proof_of_stake.png differ diff --git a/assets/images/feed.svg b/assets/images/feed.svg new file mode 100644 index 000000000..dfae7ebfd --- /dev/null +++ b/assets/images/feed.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/assets/images/get_coins.png b/assets/images/get_coins.png new file mode 100644 index 000000000..2ed319c15 Binary files /dev/null and b/assets/images/get_coins.png differ diff --git a/assets/images/increase_stake.png b/assets/images/increase_stake.png new file mode 100644 index 000000000..acc810428 Binary files /dev/null and b/assets/images/increase_stake.png differ diff --git a/assets/images/logos/128_circle.png b/assets/images/logos/128_circle.png new file mode 100644 index 000000000..f12927c2a Binary files /dev/null and b/assets/images/logos/128_circle.png differ diff --git a/assets/images/logos/260_circle.png b/assets/images/logos/260_circle.png new file mode 100644 index 000000000..0c63ad9c5 Binary files /dev/null and b/assets/images/logos/260_circle.png differ diff --git a/assets/images/logos/32_circle.png b/assets/images/logos/32_circle.png new file mode 100644 index 000000000..47c44c390 Binary files /dev/null and b/assets/images/logos/32_circle.png differ diff --git a/assets/images/logos/32_square.png b/assets/images/logos/32_square.png new file mode 100644 index 000000000..37a948be0 Binary files /dev/null and b/assets/images/logos/32_square.png differ diff --git a/assets/images/logos/64_circle.png b/assets/images/logos/64_circle.png new file mode 100644 index 000000000..70545a0a3 Binary files /dev/null and b/assets/images/logos/64_circle.png differ diff --git a/assets/images/logos/64_square.png b/assets/images/logos/64_square.png new file mode 100644 index 000000000..4d4abda96 Binary files /dev/null and b/assets/images/logos/64_square.png differ diff --git a/assets/images/logos/text_logo.png b/assets/images/logos/text_logo.png new file mode 100644 index 000000000..6b300f4f8 Binary files /dev/null and b/assets/images/logos/text_logo.png differ diff --git a/assets/images/logos/text_logo_big.png b/assets/images/logos/text_logo_big.png new file mode 100644 index 000000000..f227ded09 Binary files /dev/null and b/assets/images/logos/text_logo_big.png differ diff --git a/assets/images/long-range-attack.png b/assets/images/long-range-attack.png new file mode 100644 index 000000000..862e778ad Binary files /dev/null and b/assets/images/long-range-attack.png differ diff --git a/assets/images/pactus_address.png b/assets/images/pactus_address.png new file mode 100644 index 000000000..58fbd3a80 Binary files /dev/null and b/assets/images/pactus_address.png differ diff --git a/assets/images/pactus_blockchain.png b/assets/images/pactus_blockchain.png new file mode 100644 index 000000000..820b9f7e6 Binary files /dev/null and b/assets/images/pactus_blockchain.png differ diff --git a/assets/images/pactus_cli.png b/assets/images/pactus_cli.png new file mode 100644 index 000000000..c4eb3afc5 Binary files /dev/null and b/assets/images/pactus_cli.png differ diff --git a/assets/images/pactus_coin_distribution.png b/assets/images/pactus_coin_distribution.png new file mode 100644 index 000000000..1f789ec7f Binary files /dev/null and b/assets/images/pactus_coin_distribution.png differ diff --git a/assets/images/pactus_committee_adding_validators.png b/assets/images/pactus_committee_adding_validators.png new file mode 100644 index 000000000..affad855c Binary files /dev/null and b/assets/images/pactus_committee_adding_validators.png differ diff --git a/assets/images/pactus_committee_proposer_selection.png b/assets/images/pactus_committee_proposer_selection.png new file mode 100644 index 000000000..0140a15c8 Binary files /dev/null and b/assets/images/pactus_committee_proposer_selection.png differ diff --git a/assets/images/pactus_consensus_normal_execution.png b/assets/images/pactus_consensus_normal_execution.png new file mode 100644 index 000000000..5c1a62608 Binary files /dev/null and b/assets/images/pactus_consensus_normal_execution.png differ diff --git a/assets/images/pactus_consensus_states.png b/assets/images/pactus_consensus_states.png new file mode 100644 index 000000000..02600f378 Binary files /dev/null and b/assets/images/pactus_consensus_states.png differ diff --git a/assets/images/pactus_gui_main_window.png b/assets/images/pactus_gui_main_window.png new file mode 100644 index 000000000..fc612d2b3 Binary files /dev/null and b/assets/images/pactus_gui_main_window.png differ diff --git a/assets/images/pactus_reward.png b/assets/images/pactus_reward.png new file mode 100644 index 000000000..74e8026c1 Binary files /dev/null and b/assets/images/pactus_reward.png differ diff --git a/assets/images/pactus_stamped_transaction.png b/assets/images/pactus_stamped_transaction.png new file mode 100644 index 000000000..6cfae2a57 Binary files /dev/null and b/assets/images/pactus_stamped_transaction.png differ diff --git a/assets/images/pactus_state_hash.png b/assets/images/pactus_state_hash.png new file mode 100644 index 000000000..bf0391321 Binary files /dev/null and b/assets/images/pactus_state_hash.png differ diff --git a/assets/images/pactus_state_root_account_tree.png b/assets/images/pactus_state_root_account_tree.png new file mode 100644 index 000000000..b592102aa Binary files /dev/null and b/assets/images/pactus_state_root_account_tree.png differ diff --git a/assets/images/pactus_storage_file_structure.png b/assets/images/pactus_storage_file_structure.png new file mode 100644 index 000000000..f07300118 Binary files /dev/null and b/assets/images/pactus_storage_file_structure.png differ diff --git a/assets/images/pactus_storage_merkle_tree.png b/assets/images/pactus_storage_merkle_tree.png new file mode 100644 index 000000000..d8b11ea91 Binary files /dev/null and b/assets/images/pactus_storage_merkle_tree.png differ diff --git a/assets/images/pactus_storage_stack.png b/assets/images/pactus_storage_stack.png new file mode 100644 index 000000000..869e9d4aa Binary files /dev/null and b/assets/images/pactus_storage_stack.png differ diff --git a/assets/images/pactus_validator_pool.png b/assets/images/pactus_validator_pool.png new file mode 100644 index 000000000..6714ab935 Binary files /dev/null and b/assets/images/pactus_validator_pool.png differ diff --git a/assets/images/partners/ipminter.png b/assets/images/partners/ipminter.png new file mode 100644 index 000000000..c8026a6e0 Binary files /dev/null and b/assets/images/partners/ipminter.png differ diff --git a/assets/images/partners/sensifia.png b/assets/images/partners/sensifia.png new file mode 100644 index 000000000..a0da8a98f Binary files /dev/null and b/assets/images/partners/sensifia.png differ diff --git a/assets/images/preventing-long-range-attack.png b/assets/images/preventing-long-range-attack.png new file mode 100644 index 000000000..4d081e26c Binary files /dev/null and b/assets/images/preventing-long-range-attack.png differ diff --git a/assets/images/run_node.png b/assets/images/run_node.png new file mode 100644 index 000000000..9427f642a Binary files /dev/null and b/assets/images/run_node.png differ diff --git a/assets/images/social_discord.svg b/assets/images/social_discord.svg new file mode 100644 index 000000000..3efe1ec11 --- /dev/null +++ b/assets/images/social_discord.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/images/social_github.svg b/assets/images/social_github.svg new file mode 100644 index 000000000..538ec5bf2 --- /dev/null +++ b/assets/images/social_github.svg @@ -0,0 +1 @@ +GitHub \ No newline at end of file diff --git a/assets/images/social_instagram.svg b/assets/images/social_instagram.svg new file mode 100644 index 000000000..90a6828db --- /dev/null +++ b/assets/images/social_instagram.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/social_linkedin.svg b/assets/images/social_linkedin.svg new file mode 100644 index 000000000..14c80da10 --- /dev/null +++ b/assets/images/social_linkedin.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/assets/images/social_reddit.svg b/assets/images/social_reddit.svg new file mode 100644 index 000000000..7054f96b3 --- /dev/null +++ b/assets/images/social_reddit.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/images/social_telegram.svg b/assets/images/social_telegram.svg new file mode 100644 index 000000000..080818fa9 --- /dev/null +++ b/assets/images/social_telegram.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/social_twitter.svg b/assets/images/social_twitter.svg new file mode 100644 index 000000000..ddd89cee0 --- /dev/null +++ b/assets/images/social_twitter.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + diff --git a/assets/images/what_is_pactus.png b/assets/images/what_is_pactus.png new file mode 100644 index 000000000..af9b12d72 Binary files /dev/null and b/assets/images/what_is_pactus.png differ diff --git a/assets/js/anchor.min.js b/assets/js/anchor.min.js new file mode 100644 index 000000000..00f80c058 --- /dev/null +++ b/assets/js/anchor.min.js @@ -0,0 +1,9 @@ +// @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt Expat +// +// AnchorJS - v5.0.0 - 2023-01-18 +// https://www.bryanbraun.com/anchorjs/ +// Copyright (c) 2023 Bryan Braun; Licensed MIT +// +// @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt Expat +!function(A,e){"use strict";"function"==typeof define&&define.amd?define([],e):"object"==typeof module&&module.exports?module.exports=e():(A.AnchorJS=e(),A.anchors=new A.AnchorJS)}(globalThis,function(){"use strict";return function(A){function u(A){A.icon=Object.prototype.hasOwnProperty.call(A,"icon")?A.icon:"",A.visible=Object.prototype.hasOwnProperty.call(A,"visible")?A.visible:"hover",A.placement=Object.prototype.hasOwnProperty.call(A,"placement")?A.placement:"right",A.ariaLabel=Object.prototype.hasOwnProperty.call(A,"ariaLabel")?A.ariaLabel:"Anchor",A.class=Object.prototype.hasOwnProperty.call(A,"class")?A.class:"",A.base=Object.prototype.hasOwnProperty.call(A,"base")?A.base:"",A.truncate=Object.prototype.hasOwnProperty.call(A,"truncate")?Math.floor(A.truncate):64,A.titleText=Object.prototype.hasOwnProperty.call(A,"titleText")?A.titleText:""}function d(A){var e;if("string"==typeof A||A instanceof String)e=[].slice.call(document.querySelectorAll(A));else{if(!(Array.isArray(A)||A instanceof NodeList))throw new TypeError("The selector provided to AnchorJS was invalid.");e=[].slice.call(A)}return e}this.options=A||{},this.elements=[],u(this.options),this.add=function(A){var e,t,o,i,n,s,a,r,l,c,h,p=[];if(u(this.options),0!==(e=d(A=A||"h2, h3, h4, h5, h6")).length){for(null===document.head.querySelector("style.anchorjs")&&((A=document.createElement("style")).className="anchorjs",A.appendChild(document.createTextNode("")),void 0===(h=document.head.querySelector('[rel="stylesheet"],style'))?document.head.appendChild(A):document.head.insertBefore(A,h),A.sheet.insertRule(".anchorjs-link{opacity:0;text-decoration:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}",A.sheet.cssRules.length),A.sheet.insertRule(":hover>.anchorjs-link,.anchorjs-link:focus{opacity:1}",A.sheet.cssRules.length),A.sheet.insertRule("[data-anchorjs-icon]::after{content:attr(data-anchorjs-icon)}",A.sheet.cssRules.length),A.sheet.insertRule('@font-face{font-family:anchorjs-icons;src:url(data:n/a;base64,AAEAAAALAIAAAwAwT1MvMg8yG2cAAAE4AAAAYGNtYXDp3gC3AAABpAAAAExnYXNwAAAAEAAAA9wAAAAIZ2x5ZlQCcfwAAAH4AAABCGhlYWQHFvHyAAAAvAAAADZoaGVhBnACFwAAAPQAAAAkaG10eASAADEAAAGYAAAADGxvY2EACACEAAAB8AAAAAhtYXhwAAYAVwAAARgAAAAgbmFtZQGOH9cAAAMAAAAAunBvc3QAAwAAAAADvAAAACAAAQAAAAEAAHzE2p9fDzz1AAkEAAAAAADRecUWAAAAANQA6R8AAAAAAoACwAAAAAgAAgAAAAAAAAABAAADwP/AAAACgAAA/9MCrQABAAAAAAAAAAAAAAAAAAAAAwABAAAAAwBVAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAMCQAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAg//0DwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAAIAAAACgAAxAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEADAAAAAIAAgAAgAAACDpy//9//8AAAAg6cv//f///+EWNwADAAEAAAAAAAAAAAAAAAAACACEAAEAAAAAAAAAAAAAAAAxAAACAAQARAKAAsAAKwBUAAABIiYnJjQ3NzY2MzIWFxYUBwcGIicmNDc3NjQnJiYjIgYHBwYUFxYUBwYGIwciJicmNDc3NjIXFhQHBwYUFxYWMzI2Nzc2NCcmNDc2MhcWFAcHBgYjARQGDAUtLXoWOR8fORYtLTgKGwoKCjgaGg0gEhIgDXoaGgkJBQwHdR85Fi0tOAobCgoKOBoaDSASEiANehoaCQkKGwotLXoWOR8BMwUFLYEuehYXFxYugC44CQkKGwo4GkoaDQ0NDXoaShoKGwoFBe8XFi6ALjgJCQobCjgaShoNDQ0NehpKGgobCgoKLYEuehYXAAAADACWAAEAAAAAAAEACAAAAAEAAAAAAAIAAwAIAAEAAAAAAAMACAAAAAEAAAAAAAQACAAAAAEAAAAAAAUAAQALAAEAAAAAAAYACAAAAAMAAQQJAAEAEAAMAAMAAQQJAAIABgAcAAMAAQQJAAMAEAAMAAMAAQQJAAQAEAAMAAMAAQQJAAUAAgAiAAMAAQQJAAYAEAAMYW5jaG9yanM0MDBAAGEAbgBjAGgAbwByAGoAcwA0ADAAMABAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAH//wAP) format("truetype")}',A.sheet.cssRules.length)),h=document.querySelectorAll("[id]"),t=[].map.call(h,function(A){return A.id}),i=0;i\]./()*\\\n\t\b\v\u00A0]/g,"-").replace(/-{2,}/g,"-").substring(0,this.options.truncate).replace(/^-+|-+$/gm,"").toLowerCase()},this.hasAnchorJSLink=function(A){var e=A.firstChild&&-1<(" "+A.firstChild.className+" ").indexOf(" anchorjs-link "),A=A.lastChild&&-1<(" "+A.lastChild.className+" ").indexOf(" anchorjs-link ");return e||A||!1}}}); +// @license-end diff --git a/assets/js/bootstrap.bundle.min.js b/assets/js/bootstrap.bundle.min.js new file mode 100644 index 000000000..24ad3d292 --- /dev/null +++ b/assets/js/bootstrap.bundle.min.js @@ -0,0 +1,6 @@ +/*! + * Bootstrap v5.2.1 (https://getbootstrap.com/) + * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t="transitionend",e=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return e},i=t=>{const i=e(t);return i&&document.querySelector(i)?i:null},n=t=>{const i=e(t);return i?document.querySelector(i):null},s=e=>{e.dispatchEvent(new Event(t))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(t):null,a=t=>{if(!o(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},l=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),c=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?c(t.parentNode):null},h=()=>{},d=t=>{t.offsetHeight},u=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,f=[],p=()=>"rtl"===document.documentElement.dir,g=t=>{var e;e=()=>{const e=u();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(f.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of f)t()})),f.push(e)):e()},m=t=>{"function"==typeof t&&t()},_=(e,i,n=!0)=>{if(!n)return void m(e);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(i)+5;let r=!1;const a=({target:n})=>{n===i&&(r=!0,i.removeEventListener(t,a),m(e))};i.addEventListener(t,a),setTimeout((()=>{r||s(i)}),o)},b=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},v=/[^.]*(?=\..*)\.|.*/,y=/\..*/,w=/::\d+$/,A={};let E=1;const T={mouseenter:"mouseover",mouseleave:"mouseout"},C=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function O(t,e){return e&&`${e}::${E++}`||t.uidEvent||E++}function x(t){const e=O(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function k(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function L(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=N(t);return C.has(o)||(o=t),[n,s,o]}function D(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=L(e,i,n);if(e in T){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=x(t),c=l[a]||(l[a]={}),h=k(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=O(r,e.replace(v,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return j(s,{delegateTarget:r}),n.oneOff&&P.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return j(n,{delegateTarget:t}),i.oneOff&&P.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function S(t,e,i,n,s){const o=k(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function I(t,e,i,n){const s=e[i]||{};for(const o of Object.keys(s))if(o.includes(n)){const n=s[o];S(t,e,i,n.callable,n.delegationSelector)}}function N(t){return t=t.replace(y,""),T[t]||t}const P={on(t,e,i,n){D(t,e,i,n,!1)},one(t,e,i,n){D(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=L(e,i,n),a=r!==e,l=x(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))I(t,l,i,e.slice(1));for(const i of Object.keys(c)){const n=i.replace(w,"");if(!a||e.includes(n)){const e=c[i];S(t,l,r,e.callable,e.delegationSelector)}}}else{if(!Object.keys(c).length)return;S(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=u();let s=null,o=!0,r=!0,a=!1;e!==N(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());let l=new Event(e,{bubbles:o,cancelable:!0});return l=j(l,i),a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function j(t,e){for(const[i,n]of Object.entries(e||{}))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}const M=new Map,H={set(t,e,i){M.has(t)||M.set(t,new Map);const n=M.get(t);n.has(e)||0===n.size?n.set(e,i):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(n.keys())[0]}.`)},get:(t,e)=>M.has(t)&&M.get(t).get(e)||null,remove(t,e){if(!M.has(t))return;const i=M.get(t);i.delete(e),0===i.size&&M.delete(t)}};function $(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function W(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const B={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${W(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${W(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=$(t.dataset[n])}return e},getDataAttribute:(t,e)=>$(t.getAttribute(`data-bs-${W(e)}`))};class F{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=o(e)?B.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...o(e)?B.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const n of Object.keys(e)){const s=e[n],r=t[n],a=o(r)?"element":null==(i=r)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(a))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${a}" but expected type "${s}".`)}var i}}class z extends F{constructor(t,e){super(),(t=r(t))&&(this._element=t,this._config=this._getConfig(e),H.set(this._element,this.constructor.DATA_KEY,this))}dispose(){H.remove(this._element,this.constructor.DATA_KEY),P.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){_(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return H.get(r(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.2.1"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const q=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,s=t.NAME;P.on(document,i,`[data-bs-dismiss="${s}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),l(this))return;const o=n(this)||this.closest(`.${s}`);t.getOrCreateInstance(o)[e]()}))};class R extends z{static get NAME(){return"alert"}close(){if(P.trigger(this._element,"close.bs.alert").defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),P.trigger(this._element,"closed.bs.alert"),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=R.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}q(R,"close"),g(R);const V='[data-bs-toggle="button"]';class K extends z{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=K.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}P.on(document,"click.bs.button.data-api",V,(t=>{t.preventDefault();const e=t.target.closest(V);K.getOrCreateInstance(e).toggle()})),g(K);const Q={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!l(t)&&a(t)))}},X={endCallback:null,leftCallback:null,rightCallback:null},Y={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class U extends F{constructor(t,e){super(),this._element=t,t&&U.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return X}static get DefaultType(){return Y}static get NAME(){return"swipe"}dispose(){P.off(this._element,".bs.swipe")}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),m(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&m(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(P.on(this._element,"pointerdown.bs.swipe",(t=>this._start(t))),P.on(this._element,"pointerup.bs.swipe",(t=>this._end(t))),this._element.classList.add("pointer-event")):(P.on(this._element,"touchstart.bs.swipe",(t=>this._start(t))),P.on(this._element,"touchmove.bs.swipe",(t=>this._move(t))),P.on(this._element,"touchend.bs.swipe",(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const G="next",J="prev",Z="left",tt="right",et="slid.bs.carousel",it="carousel",nt="active",st={ArrowLeft:tt,ArrowRight:Z},ot={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},rt={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class at extends z{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=Q.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===it&&this.cycle()}static get Default(){return ot}static get DefaultType(){return rt}static get NAME(){return"carousel"}next(){this._slide(G)}nextWhenVisible(){!document.hidden&&a(this._element)&&this.next()}prev(){this._slide(J)}pause(){this._isSliding&&s(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?P.one(this._element,et,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void P.one(this._element,et,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?G:J;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&P.on(this._element,"keydown.bs.carousel",(t=>this._keydown(t))),"hover"===this._config.pause&&(P.on(this._element,"mouseenter.bs.carousel",(()=>this.pause())),P.on(this._element,"mouseleave.bs.carousel",(()=>this._maybeEnableCycle()))),this._config.touch&&U.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of Q.find(".carousel-item img",this._element))P.on(t,"dragstart.bs.carousel",(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(Z)),rightCallback:()=>this._slide(this._directionToOrder(tt)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new U(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=st[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=Q.findOne(".active",this._indicatorsElement);e.classList.remove(nt),e.removeAttribute("aria-current");const i=Q.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(nt),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===G,s=e||b(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>P.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r("slide.bs.carousel").defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),d(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(nt),i.classList.remove(nt,c,l),this._isSliding=!1,r(et)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return Q.findOne(".active.carousel-item",this._element)}_getItems(){return Q.find(".carousel-item",this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return p()?t===Z?J:G:t===Z?G:J}_orderToDirection(t){return p()?t===J?Z:tt:t===J?tt:Z}static jQueryInterface(t){return this.each((function(){const e=at.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}P.on(document,"click.bs.carousel.data-api","[data-bs-slide], [data-bs-slide-to]",(function(t){const e=n(this);if(!e||!e.classList.contains(it))return;t.preventDefault();const i=at.getOrCreateInstance(e),s=this.getAttribute("data-bs-slide-to");return s?(i.to(s),void i._maybeEnableCycle()):"next"===B.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),P.on(window,"load.bs.carousel.data-api",(()=>{const t=Q.find('[data-bs-ride="carousel"]');for(const e of t)at.getOrCreateInstance(e)})),g(at);const lt="show",ct="collapse",ht="collapsing",dt='[data-bs-toggle="collapse"]',ut={parent:null,toggle:!0},ft={parent:"(null|element)",toggle:"boolean"};class pt extends z{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const n=Q.find(dt);for(const t of n){const e=i(t),n=Q.find(e).filter((t=>t===this._element));null!==e&&n.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return ut}static get DefaultType(){return ft}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>pt.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(P.trigger(this._element,"show.bs.collapse").defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(ct),this._element.classList.add(ht),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(ht),this._element.classList.add(ct,lt),this._element.style[e]="",P.trigger(this._element,"shown.bs.collapse")}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(P.trigger(this._element,"hide.bs.collapse").defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,d(this._element),this._element.classList.add(ht),this._element.classList.remove(ct,lt);for(const t of this._triggerArray){const e=n(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(ht),this._element.classList.add(ct),P.trigger(this._element,"hidden.bs.collapse")}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(lt)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=r(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(dt);for(const e of t){const t=n(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=Q.find(":scope .collapse .collapse",this._config.parent);return Q.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=pt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}P.on(document,"click.bs.collapse.data-api",dt,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();const e=i(this),n=Q.find(e);for(const t of n)pt.getOrCreateInstance(t,{toggle:!1}).toggle()})),g(pt);var gt="top",mt="bottom",_t="right",bt="left",vt="auto",yt=[gt,mt,_t,bt],wt="start",At="end",Et="clippingParents",Tt="viewport",Ct="popper",Ot="reference",xt=yt.reduce((function(t,e){return t.concat([e+"-"+wt,e+"-"+At])}),[]),kt=[].concat(yt,[vt]).reduce((function(t,e){return t.concat([e,e+"-"+wt,e+"-"+At])}),[]),Lt="beforeRead",Dt="read",St="afterRead",It="beforeMain",Nt="main",Pt="afterMain",jt="beforeWrite",Mt="write",Ht="afterWrite",$t=[Lt,Dt,St,It,Nt,Pt,jt,Mt,Ht];function Wt(t){return t?(t.nodeName||"").toLowerCase():null}function Bt(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function Ft(t){return t instanceof Bt(t).Element||t instanceof Element}function zt(t){return t instanceof Bt(t).HTMLElement||t instanceof HTMLElement}function qt(t){return"undefined"!=typeof ShadowRoot&&(t instanceof Bt(t).ShadowRoot||t instanceof ShadowRoot)}const Rt={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];zt(s)&&Wt(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});zt(n)&&Wt(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function Vt(t){return t.split("-")[0]}var Kt=Math.max,Qt=Math.min,Xt=Math.round;function Yt(){var t=navigator.userAgentData;return null!=t&&t.brands?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function Ut(){return!/^((?!chrome|android).)*safari/i.test(Yt())}function Gt(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&zt(t)&&(s=t.offsetWidth>0&&Xt(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&Xt(n.height)/t.offsetHeight||1);var r=(Ft(t)?Bt(t):window).visualViewport,a=!Ut()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function Jt(t){var e=Gt(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Zt(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&qt(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function te(t){return Bt(t).getComputedStyle(t)}function ee(t){return["table","td","th"].indexOf(Wt(t))>=0}function ie(t){return((Ft(t)?t.ownerDocument:t.document)||window.document).documentElement}function ne(t){return"html"===Wt(t)?t:t.assignedSlot||t.parentNode||(qt(t)?t.host:null)||ie(t)}function se(t){return zt(t)&&"fixed"!==te(t).position?t.offsetParent:null}function oe(t){for(var e=Bt(t),i=se(t);i&&ee(i)&&"static"===te(i).position;)i=se(i);return i&&("html"===Wt(i)||"body"===Wt(i)&&"static"===te(i).position)?e:i||function(t){var e=/firefox/i.test(Yt());if(/Trident/i.test(Yt())&&zt(t)&&"fixed"===te(t).position)return null;var i=ne(t);for(qt(i)&&(i=i.host);zt(i)&&["html","body"].indexOf(Wt(i))<0;){var n=te(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function re(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function ae(t,e,i){return Kt(t,Qt(e,i))}function le(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function ce(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const he={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=Vt(i.placement),l=re(a),c=[bt,_t].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return le("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:ce(t,yt))}(s.padding,i),d=Jt(o),u="y"===l?gt:bt,f="y"===l?mt:_t,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],g=r[l]-i.rects.reference[l],m=oe(o),_=m?"y"===l?m.clientHeight||0:m.clientWidth||0:0,b=p/2-g/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,A=ae(v,w,y),E=l;i.modifiersData[n]=((e={})[E]=A,e.centerOffset=A-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Zt(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function de(t){return t.split("-")[1]}var ue={top:"auto",right:"auto",bottom:"auto",left:"auto"};function fe(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=t.isFixed,u=r.x,f=void 0===u?0:u,p=r.y,g=void 0===p?0:p,m="function"==typeof h?h({x:f,y:g}):{x:f,y:g};f=m.x,g=m.y;var _=r.hasOwnProperty("x"),b=r.hasOwnProperty("y"),v=bt,y=gt,w=window;if(c){var A=oe(i),E="clientHeight",T="clientWidth";A===Bt(i)&&"static"!==te(A=ie(i)).position&&"absolute"===a&&(E="scrollHeight",T="scrollWidth"),(s===gt||(s===bt||s===_t)&&o===At)&&(y=mt,g-=(d&&A===w&&w.visualViewport?w.visualViewport.height:A[E])-n.height,g*=l?1:-1),s!==bt&&(s!==gt&&s!==mt||o!==At)||(v=_t,f-=(d&&A===w&&w.visualViewport?w.visualViewport.width:A[T])-n.width,f*=l?1:-1)}var C,O=Object.assign({position:a},c&&ue),x=!0===h?function(t){var e=t.x,i=t.y,n=window.devicePixelRatio||1;return{x:Xt(e*n)/n||0,y:Xt(i*n)/n||0}}({x:f,y:g}):{x:f,y:g};return f=x.x,g=x.y,l?Object.assign({},O,((C={})[y]=b?"0":"",C[v]=_?"0":"",C.transform=(w.devicePixelRatio||1)<=1?"translate("+f+"px, "+g+"px)":"translate3d("+f+"px, "+g+"px, 0)",C)):Object.assign({},O,((e={})[y]=b?g+"px":"",e[v]=_?f+"px":"",e.transform="",e))}const pe={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:Vt(e.placement),variation:de(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,fe(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,fe(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var ge={passive:!0};const me={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=Bt(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,ge)})),a&&l.addEventListener("resize",i.update,ge),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,ge)})),a&&l.removeEventListener("resize",i.update,ge)}},data:{}};var _e={left:"right",right:"left",bottom:"top",top:"bottom"};function be(t){return t.replace(/left|right|bottom|top/g,(function(t){return _e[t]}))}var ve={start:"end",end:"start"};function ye(t){return t.replace(/start|end/g,(function(t){return ve[t]}))}function we(t){var e=Bt(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function Ae(t){return Gt(ie(t)).left+we(t).scrollLeft}function Ee(t){var e=te(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Te(t){return["html","body","#document"].indexOf(Wt(t))>=0?t.ownerDocument.body:zt(t)&&Ee(t)?t:Te(ne(t))}function Ce(t,e){var i;void 0===e&&(e=[]);var n=Te(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=Bt(n),r=s?[o].concat(o.visualViewport||[],Ee(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Ce(ne(r)))}function Oe(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function xe(t,e,i){return e===Tt?Oe(function(t,e){var i=Bt(t),n=ie(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=Ut();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+Ae(t),y:l}}(t,i)):Ft(e)?function(t,e){var i=Gt(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):Oe(function(t){var e,i=ie(t),n=we(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=Kt(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=Kt(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+Ae(t),l=-n.scrollTop;return"rtl"===te(s||i).direction&&(a+=Kt(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(ie(t)))}function ke(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?Vt(s):null,r=s?de(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case gt:e={x:a,y:i.y-n.height};break;case mt:e={x:a,y:i.y+i.height};break;case _t:e={x:i.x+i.width,y:l};break;case bt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?re(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case wt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case At:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function Le(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.strategy,r=void 0===o?t.strategy:o,a=i.boundary,l=void 0===a?Et:a,c=i.rootBoundary,h=void 0===c?Tt:c,d=i.elementContext,u=void 0===d?Ct:d,f=i.altBoundary,p=void 0!==f&&f,g=i.padding,m=void 0===g?0:g,_=le("number"!=typeof m?m:ce(m,yt)),b=u===Ct?Ot:Ct,v=t.rects.popper,y=t.elements[p?b:u],w=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=Ce(ne(t)),i=["absolute","fixed"].indexOf(te(t).position)>=0&&zt(t)?oe(t):t;return Ft(i)?e.filter((function(t){return Ft(t)&&Zt(t,i)&&"body"!==Wt(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=xe(t,i,n);return e.top=Kt(s.top,e.top),e.right=Qt(s.right,e.right),e.bottom=Qt(s.bottom,e.bottom),e.left=Kt(s.left,e.left),e}),xe(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(Ft(y)?y:y.contextElement||ie(t.elements.popper),l,h,r),A=Gt(t.elements.reference),E=ke({reference:A,element:v,strategy:"absolute",placement:s}),T=Oe(Object.assign({},v,E)),C=u===Ct?T:A,O={top:w.top-C.top+_.top,bottom:C.bottom-w.bottom+_.bottom,left:w.left-C.left+_.left,right:C.right-w.right+_.right},x=t.modifiersData.offset;if(u===Ct&&x){var k=x[s];Object.keys(O).forEach((function(t){var e=[_t,mt].indexOf(t)>=0?1:-1,i=[gt,mt].indexOf(t)>=0?"y":"x";O[t]+=k[i]*e}))}return O}function De(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?kt:l,h=de(n),d=h?a?xt:xt.filter((function(t){return de(t)===h})):yt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=Le(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[Vt(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const Se={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,g=i.allowedAutoPlacements,m=e.options.placement,_=Vt(m),b=l||(_!==m&&p?function(t){if(Vt(t)===vt)return[];var e=be(t);return[ye(t),e,ye(e)]}(m):[be(m)]),v=[m].concat(b).reduce((function(t,i){return t.concat(Vt(i)===vt?De(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:g}):i)}),[]),y=e.rects.reference,w=e.rects.popper,A=new Map,E=!0,T=v[0],C=0;C=0,D=L?"width":"height",S=Le(e,{placement:O,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),I=L?k?_t:bt:k?mt:gt;y[D]>w[D]&&(I=be(I));var N=be(I),P=[];if(o&&P.push(S[x]<=0),a&&P.push(S[I]<=0,S[N]<=0),P.every((function(t){return t}))){T=O,E=!1;break}A.set(O,P)}if(E)for(var j=function(t){var e=v.find((function(e){var i=A.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},M=p?3:1;M>0&&"break"!==j(M);M--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function Ie(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function Ne(t){return[gt,_t,mt,bt].some((function(e){return t[e]>=0}))}const Pe={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=Le(e,{elementContext:"reference"}),a=Le(e,{altBoundary:!0}),l=Ie(r,n),c=Ie(a,s,o),h=Ne(l),d=Ne(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},je={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=kt.reduce((function(t,i){return t[i]=function(t,e,i){var n=Vt(t),s=[bt,gt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[bt,_t].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},Me={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=ke({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},He={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,g=void 0===p?0:p,m=Le(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=Vt(e.placement),b=de(e.placement),v=!b,y=re(_),w="x"===y?"y":"x",A=e.modifiersData.popperOffsets,E=e.rects.reference,T=e.rects.popper,C="function"==typeof g?g(Object.assign({},e.rects,{placement:e.placement})):g,O="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),x=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,k={x:0,y:0};if(A){if(o){var L,D="y"===y?gt:bt,S="y"===y?mt:_t,I="y"===y?"height":"width",N=A[y],P=N+m[D],j=N-m[S],M=f?-T[I]/2:0,H=b===wt?E[I]:T[I],$=b===wt?-T[I]:-E[I],W=e.elements.arrow,B=f&&W?Jt(W):{width:0,height:0},F=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},z=F[D],q=F[S],R=ae(0,E[I],B[I]),V=v?E[I]/2-M-R-z-O.mainAxis:H-R-z-O.mainAxis,K=v?-E[I]/2+M+R+q+O.mainAxis:$+R+q+O.mainAxis,Q=e.elements.arrow&&oe(e.elements.arrow),X=Q?"y"===y?Q.clientTop||0:Q.clientLeft||0:0,Y=null!=(L=null==x?void 0:x[y])?L:0,U=N+K-Y,G=ae(f?Qt(P,N+V-Y-X):P,N,f?Kt(j,U):j);A[y]=G,k[y]=G-N}if(a){var J,Z="x"===y?gt:bt,tt="x"===y?mt:_t,et=A[w],it="y"===w?"height":"width",nt=et+m[Z],st=et-m[tt],ot=-1!==[gt,bt].indexOf(_),rt=null!=(J=null==x?void 0:x[w])?J:0,at=ot?nt:et-E[it]-T[it]-rt+O.altAxis,lt=ot?et+E[it]+T[it]-rt-O.altAxis:st,ct=f&&ot?function(t,e,i){var n=ae(t,e,i);return n>i?i:n}(at,et,lt):ae(f?at:nt,et,f?lt:st);A[w]=ct,k[w]=ct-et}e.modifiersData[n]=k}},requiresIfExists:["offset"]};function $e(t,e,i){void 0===i&&(i=!1);var n,s,o=zt(e),r=zt(e)&&function(t){var e=t.getBoundingClientRect(),i=Xt(e.width)/t.offsetWidth||1,n=Xt(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=ie(e),l=Gt(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==Wt(e)||Ee(a))&&(c=(n=e)!==Bt(n)&&zt(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:we(n)),zt(e)?((h=Gt(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=Ae(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function We(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var Be={placement:"bottom",modifiers:[],strategy:"absolute"};function Fe(){for(var t=arguments.length,e=new Array(t),i=0;iNumber.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(B.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,..."function"==typeof this._config.popperConfig?this._config.popperConfig(t):this._config.popperConfig}}_selectMenuItem({key:t,target:e}){const i=Q.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>a(t)));i.length&&b(i,e,t===Ye,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=hi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=Q.find(ti);for(const i of e){const e=hi.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Xe,Ye].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Ze)?this:Q.prev(this,Ze)[0]||Q.next(this,Ze)[0],o=hi.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}P.on(document,Ge,Ze,hi.dataApiKeydownHandler),P.on(document,Ge,ei,hi.dataApiKeydownHandler),P.on(document,Ue,hi.clearMenus),P.on(document,"keyup.bs.dropdown.data-api",hi.clearMenus),P.on(document,Ue,Ze,(function(t){t.preventDefault(),hi.getOrCreateInstance(this).toggle()})),g(hi);const di=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",ui=".sticky-top",fi="padding-right",pi="margin-right";class gi{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,fi,(e=>e+t)),this._setElementAttributes(di,fi,(e=>e+t)),this._setElementAttributes(ui,pi,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,fi),this._resetElementAttributes(di,fi),this._resetElementAttributes(ui,pi)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&B.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=B.getDataAttribute(t,e);null!==i?(B.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(o(t))e(t);else for(const i of Q.find(t,this._element))e(i)}}const mi="show",_i="mousedown.bs.backdrop",bi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},vi={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class yi extends F{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return bi}static get DefaultType(){return vi}static get NAME(){return"backdrop"}show(t){if(!this._config.isVisible)return void m(t);this._append();const e=this._getElement();this._config.isAnimated&&d(e),e.classList.add(mi),this._emulateAnimation((()=>{m(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(mi),this._emulateAnimation((()=>{this.dispose(),m(t)}))):m(t)}dispose(){this._isAppended&&(P.off(this._element,_i),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=r(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),P.on(t,_i,(()=>{m(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){_(t,this._getElement(),this._config.isAnimated)}}const wi=".bs.focustrap",Ai="backward",Ei={autofocus:!0,trapElement:null},Ti={autofocus:"boolean",trapElement:"element"};class Ci extends F{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return Ei}static get DefaultType(){return Ti}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),P.off(document,wi),P.on(document,"focusin.bs.focustrap",(t=>this._handleFocusin(t))),P.on(document,"keydown.tab.bs.focustrap",(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,P.off(document,wi))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=Q.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===Ai?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?Ai:"forward")}}const Oi="hidden.bs.modal",xi="show.bs.modal",ki="modal-open",Li="show",Di="modal-static",Si={backdrop:!0,focus:!0,keyboard:!0},Ii={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class Ni extends z{constructor(t,e){super(t,e),this._dialog=Q.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new gi,this._addEventListeners()}static get Default(){return Si}static get DefaultType(){return Ii}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||P.trigger(this._element,xi,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(ki),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(P.trigger(this._element,"hide.bs.modal").defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(Li),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){for(const t of[window,this._dialog])P.off(t,".bs.modal");this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new yi({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new Ci({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=Q.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),d(this._element),this._element.classList.add(Li),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,P.trigger(this._element,"shown.bs.modal",{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){P.on(this._element,"keydown.dismiss.bs.modal",(t=>{if("Escape"===t.key)return this._config.keyboard?(t.preventDefault(),void this.hide()):void this._triggerBackdropTransition()})),P.on(window,"resize.bs.modal",(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),P.on(this._element,"mousedown.dismiss.bs.modal",(t=>{P.one(this._element,"click.dismiss.bs.modal",(e=>{this._dialog.contains(t.target)||this._dialog.contains(e.target)||("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(ki),this._resetAdjustments(),this._scrollBar.reset(),P.trigger(this._element,Oi)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(P.trigger(this._element,"hidePrevented.bs.modal").defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(Di)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(Di),this._queueCallback((()=>{this._element.classList.remove(Di),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=p()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=p()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=Ni.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}P.on(document,"click.bs.modal.data-api",'[data-bs-toggle="modal"]',(function(t){const e=n(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),P.one(e,xi,(t=>{t.defaultPrevented||P.one(e,Oi,(()=>{a(this)&&this.focus()}))}));const i=Q.findOne(".modal.show");i&&Ni.getInstance(i).hide(),Ni.getOrCreateInstance(e).toggle(this)})),q(Ni),g(Ni);const Pi="show",ji="showing",Mi="hiding",Hi=".offcanvas.show",$i="hidePrevented.bs.offcanvas",Wi="hidden.bs.offcanvas",Bi={backdrop:!0,keyboard:!0,scroll:!1},Fi={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class zi extends z{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return Bi}static get DefaultType(){return Fi}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||P.trigger(this._element,"show.bs.offcanvas",{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new gi).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(ji),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(Pi),this._element.classList.remove(ji),P.trigger(this._element,"shown.bs.offcanvas",{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(P.trigger(this._element,"hide.bs.offcanvas").defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(Mi),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(Pi,Mi),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new gi).reset(),P.trigger(this._element,Wi)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new yi({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():P.trigger(this._element,$i)}:null})}_initializeFocusTrap(){return new Ci({trapElement:this._element})}_addEventListeners(){P.on(this._element,"keydown.dismiss.bs.offcanvas",(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():P.trigger(this._element,$i))}))}static jQueryInterface(t){return this.each((function(){const e=zi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}P.on(document,"click.bs.offcanvas.data-api",'[data-bs-toggle="offcanvas"]',(function(t){const e=n(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this))return;P.one(e,Wi,(()=>{a(this)&&this.focus()}));const i=Q.findOne(Hi);i&&i!==e&&zi.getInstance(i).hide(),zi.getOrCreateInstance(e).toggle(this)})),P.on(window,"load.bs.offcanvas.data-api",(()=>{for(const t of Q.find(Hi))zi.getOrCreateInstance(t).show()})),P.on(window,"resize.bs.offcanvas",(()=>{for(const t of Q.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&zi.getOrCreateInstance(t).hide()})),q(zi),g(zi);const qi=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Ri=/^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i,Vi=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i,Ki=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!qi.has(i)||Boolean(Ri.test(t.nodeValue)||Vi.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Qi={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Xi={allowList:Qi,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},Yi={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Ui={entry:"(string|element|function|null)",selector:"(string|element)"};class Gi extends F{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Xi}static get DefaultType(){return Yi}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},Ui)}_setContent(t,e,i){const n=Q.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?o(e)?this._putElementInTemplate(r(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Ki(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return"function"==typeof t?t(this):t}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const Ji=new Set(["sanitize","allowList","sanitizeFn"]),Zi="fade",tn="show",en=".modal",nn="hide.bs.modal",sn="hover",on="focus",rn={AUTO:"auto",TOP:"top",RIGHT:p()?"left":"right",BOTTOM:"bottom",LEFT:p()?"right":"left"},an={allowList:Qi,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,0],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},ln={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class cn extends z{constructor(t,e){if(void 0===Ke)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,e),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners()}static get Default(){return an}static get DefaultType(){return ln}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(t){if(this._isEnabled){if(t){const e=this._initializeOnDelegatedTarget(t);return e._activeTrigger.click=!e._activeTrigger.click,void(e._isWithActiveTrigger()?e._enter():e._leave())}this._isShown()?this._leave():this._enter()}}dispose(){clearTimeout(this._timeout),P.off(this._element.closest(en),nn,this._hideModalHandler),this.tip&&this.tip.remove(),this._config.originalTitle&&this._element.setAttribute("title",this._config.originalTitle),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=P.trigger(this._element,this.constructor.eventName("show")),e=(c(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this.tip&&(this.tip.remove(),this.tip=null);const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),P.trigger(this._element,this.constructor.eventName("inserted"))),this._popper?this._popper.update():this._popper=this._createPopper(i),i.classList.add(tn),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))P.on(t,"mouseover",h);this._queueCallback((()=>{P.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(!this._isShown())return;if(P.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented)return;const t=this._getTipElement();if(t.classList.remove(tn),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))P.off(t,"mouseover",h);this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||t.remove(),this._element.removeAttribute("aria-describedby"),P.trigger(this._element,this.constructor.eventName("hidden")),this._disposePopper())}),this.tip,this._isAnimated())}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(Zi,tn),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(Zi),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Gi({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._config.originalTitle}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(Zi)}_isShown(){return this.tip&&this.tip.classList.contains(tn)}_createPopper(t){const e="function"==typeof this._config.placement?this._config.placement.call(this,t,this._element):this._config.placement,i=rn[e.toUpperCase()];return Ve(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return"function"==typeof t?t.call(this._element):t}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,..."function"==typeof this._config.popperConfig?this._config.popperConfig(e):this._config.popperConfig}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)P.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>this.toggle(t)));else if("manual"!==e){const t=e===sn?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===sn?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");P.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?on:sn]=!0,e._enter()})),P.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?on:sn]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},P.on(this._element.closest(en),nn,this._hideModalHandler),this._config.selector?this._config={...this._config,trigger:"manual",selector:""}:this._fixTitle()}_fixTitle(){const t=this._config.originalTitle;t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=B.getDataAttributes(this._element);for(const t of Object.keys(e))Ji.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:r(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),t.originalTitle=this._element.getAttribute("title")||"","number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const e in this._config)this.constructor.Default[e]!==this._config[e]&&(t[e]=this._config[e]);return t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null)}static jQueryInterface(t){return this.each((function(){const e=cn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}g(cn);const hn={...cn.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},dn={...cn.DefaultType,content:"(null|string|element|function)"};class un extends cn{static get Default(){return hn}static get DefaultType(){return dn}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=un.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}g(un);const fn="click.bs.scrollspy",pn="active",gn="[href]",mn={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},_n={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class bn extends z{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return mn}static get DefaultType(){return _n}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=r(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(P.off(this._config.target,fn),P.on(this._config.target,fn,gn,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=Q.find(gn,this._config.target);for(const e of t){if(!e.hash||l(e))continue;const t=Q.findOne(e.hash,this._element);a(t)&&(this._targetLinks.set(e.hash,e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(pn),this._activateParents(t),P.trigger(this._element,"activate.bs.scrollspy",{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))Q.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(pn);else for(const e of Q.parents(t,".nav, .list-group"))for(const t of Q.prev(e,".nav-link, .nav-item > .nav-link, .list-group-item"))t.classList.add(pn)}_clearActiveClass(t){t.classList.remove(pn);const e=Q.find("[href].active",t);for(const t of e)t.classList.remove(pn)}static jQueryInterface(t){return this.each((function(){const e=bn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}P.on(window,"load.bs.scrollspy.data-api",(()=>{for(const t of Q.find('[data-bs-spy="scroll"]'))bn.getOrCreateInstance(t)})),g(bn);const vn="ArrowLeft",yn="ArrowRight",wn="ArrowUp",An="ArrowDown",En="active",Tn="fade",Cn="show",On='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',xn=`.nav-link:not(.dropdown-toggle), .list-group-item:not(.dropdown-toggle), [role="tab"]:not(.dropdown-toggle), ${On}`;class kn extends z{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),P.on(this._element,"keydown.bs.tab",(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?P.trigger(e,"hide.bs.tab",{relatedTarget:t}):null;P.trigger(t,"show.bs.tab",{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(En),this._activate(n(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.focus(),t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),P.trigger(t,"shown.bs.tab",{relatedTarget:e})):t.classList.add(Cn)}),t,t.classList.contains(Tn)))}_deactivate(t,e){t&&(t.classList.remove(En),t.blur(),this._deactivate(n(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),P.trigger(t,"hidden.bs.tab",{relatedTarget:e})):t.classList.remove(Cn)}),t,t.classList.contains(Tn)))}_keydown(t){if(![vn,yn,wn,An].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=[yn,An].includes(t.key),i=b(this._getChildren().filter((t=>!l(t))),t.target,e,!0);i&&kn.getOrCreateInstance(i).show()}_getChildren(){return Q.find(xn,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=n(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`#${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=Q.findOne(t,i);s&&s.classList.toggle(n,e)};n(".dropdown-toggle",En),n(".dropdown-menu",Cn),n(".dropdown-item",En),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(En)}_getInnerElement(t){return t.matches(xn)?t:Q.findOne(xn,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=kn.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}P.on(document,"click.bs.tab",On,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this)||kn.getOrCreateInstance(this).show()})),P.on(window,"load.bs.tab",(()=>{for(const t of Q.find('.active[data-bs-toggle="tab"], .active[data-bs-toggle="pill"], .active[data-bs-toggle="list"]'))kn.getOrCreateInstance(t)})),g(kn);const Ln="hide",Dn="show",Sn="showing",In={animation:"boolean",autohide:"boolean",delay:"number"},Nn={animation:!0,autohide:!0,delay:5e3};class Pn extends z{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return Nn}static get DefaultType(){return In}static get NAME(){return"toast"}show(){P.trigger(this._element,"show.bs.toast").defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(Ln),d(this._element),this._element.classList.add(Dn,Sn),this._queueCallback((()=>{this._element.classList.remove(Sn),P.trigger(this._element,"shown.bs.toast"),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(P.trigger(this._element,"hide.bs.toast").defaultPrevented||(this._element.classList.add(Sn),this._queueCallback((()=>{this._element.classList.add(Ln),this._element.classList.remove(Sn,Dn),P.trigger(this._element,"hidden.bs.toast")}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(Dn),super.dispose()}isShown(){return this._element.classList.contains(Dn)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){P.on(this._element,"mouseover.bs.toast",(t=>this._onInteraction(t,!0))),P.on(this._element,"mouseout.bs.toast",(t=>this._onInteraction(t,!1))),P.on(this._element,"focusin.bs.toast",(t=>this._onInteraction(t,!0))),P.on(this._element,"focusout.bs.toast",(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=Pn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return q(Pn),g(Pn),{Alert:R,Button:K,Carousel:at,Collapse:pt,Dropdown:hi,Modal:Ni,Offcanvas:zi,Popover:un,ScrollSpy:bn,Tab:kn,Toast:Pn,Tooltip:cn}})); diff --git a/assets/js/custom.js b/assets/js/custom.js new file mode 100644 index 000000000..5982ceab2 --- /dev/null +++ b/assets/js/custom.js @@ -0,0 +1,108 @@ +function hexdump(hex, where) { + var buffer = hexToBytes(hex) + var rows = Math.ceil(buffer.length / 16); + var last = buffer.length % 16 || 16; + var offsetLength = buffer.length.toString(16).length; + if (offsetLength < 6) offsetLength = 6; + + var span = ''; + var i = 0; + var b = 0; + var lastBytes; + var lastSpaces; + var v; + + for (i = 0; i < rows; i++) { + span += '' + zero(b, offsetLength) + ' '; + lastBytes = i === rows - 1 ? last : 16; + lastSpaces = 16 - lastBytes; + + var j; + for (j = 0; j < lastBytes; j++) { + if (b % 8 == 0) { + span += ' '; + } + span += ' ' + zero(buffer[b], 2); + b++; + } + + for (j = 0; j < lastSpaces; j++) { + span += '   '; + } + if (lastBytes <= 8) { + span += ' '; + } + + b -= lastBytes; + span += '  '; + span += ''; + + for (j = 0; j < lastBytes; j++) { + v = buffer[b]; + if (v == 60) { + span += '<'; + } else { + span += ((v > 31 && v < 127) || v > 159) ? String.fromCharCode(v) : '.'; + } + b++; + } + + span += '
'; + } + + document.getElementById(where).innerHTML = span; +} + +function zero(n, max) { + n = n.toString(16).toUpperCase(); + while (n.length < max) { + n = '0' + n; + } + return n; +} + +function hexToBytes(hex) { + for (var bytes = [], c = 0; c < hex.length; c += 2) + bytes.push(parseInt(hex.substr(c, 2), 16)); + return bytes; +} + +$( document ).ready(function() { + const copyButtonLabel = " Copy"; + + // you can use a class selector instead if you, or the syntax highlighting library adds one to the 'pre'. + let blocks = document.querySelectorAll("pre"); + + blocks.forEach((block) => { + // only add button if browser supports Clipboard API + if (navigator.clipboard) { + let button = document.createElement("button"); + button.innerHTML = copyButtonLabel; + button.addEventListener("click", copyCode); + block.appendChild(button); + } + }); + + async function copyCode(event) { + const button = event.srcElement; + const pre = button.parentElement; + let code = pre.querySelector("code"); + let text = code.innerText; + await navigator.clipboard.writeText(text); + + button.innerHTML = "Copied!"; + + setTimeout(() => { + button.innerHTML = copyButtonLabel; + }, 1000) + } +}) + +// Jekyll kramdown HACK: +// +// Adding table class to all tables +// making images responsive +$( document ).ready(function() { + $('table').addClass('table'); + $('img').addClass('img-fluid'); +}) diff --git a/assets/js/jquery-3.6.1.min.js b/assets/js/jquery-3.6.1.min.js new file mode 100644 index 000000000..2c69bc908 --- /dev/null +++ b/assets/js/jquery-3.6.1.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,y=n.hasOwnProperty,a=y.toString,l=a.call(Object),v={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&v(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!y||!y.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ve(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ye(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ve(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],y=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||y.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||y.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||y.push(".#.+[+~]"),e.querySelectorAll("\\\f"),y.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),y=y.length&&new RegExp(y.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),v=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&v(p,e)?-1:t==C||t.ownerDocument==p&&v(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!y||!y.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),v.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",v.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",v.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),v.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(v.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return B(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=_e(v.pixelPosition,function(e,t){if(t)return t=Be(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return B(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0 00:00:02.262 +What is Pactus Blockchain? + +2 +00:00:02.347 --> 00:00:07.415 +Pactus is powered by a real Proof of stake consensus mechanism. + +3 +00:00:07.955 --> 00:00:11.444 +Pactus has an unlimited pool of validators that + +4 +00:00:11.444 --> 00:00:16.417 +anyone can become a validator by staking some coins. + +5 +00:00:16.417 --> 00:00:21.875 +On the other hand, there is a committee of validators that generates new blocks. + +6 +00:00:22.071 --> 00:00:25.784 +The size of the committee is fixed to 21 validators. + +7 +00:00:25.860 --> 00:00:31.632 +However the committee members are not fixed and they can change randomly. + +8 +00:00:31.710 --> 00:00:34.591 +But how does this change happen? + +9 +00:00:34.814 --> 00:00:38.269 +Pactus has a cryptographic sortition algorithm that + +10 +00:00:38.269 --> 00:00:41.502 +changes the committee members. + +11 +00:00:41.502 --> 00:00:42.715 +In each block, + +12 +00:00:42.715 --> 00:00:47.143 +each validator generates one and only one random number + +13 +00:00:47.143 --> 00:00:51.190 +between zero and the total stake. + +14 +00:00:52.144 --> 00:00:56.742 +If the generated number is less than the validators' stake, + +15 +00:00:56.742 --> 00:01:01.820 +the validator will be nominated to be inside the committee for the next block + +16 +00:01:01.821 --> 00:01:04.962 +and the last validator in the committee will leave the committee. + +17 +00:01:04.962 --> 00:01:06.057 +For example, + +18 +00:01:06.057 --> 00:01:08.003 +consider the situation that + +19 +00:01:08.003 --> 00:01:10.599 +100 coins have been staked so far, + +20 +00:01:10.599 --> 00:01:18.915 +Alice has staked 30 coins, Bob 20 coins, Carol 25 coins and so on and so on. + +21 +00:01:18.915 --> 00:01:23.434 +Validators start generating random numbers between zero and 100. + +22 +00:01:23.434 --> 00:01:27.692 +Remember that the total stake is 100. + +23 +00:01:27.773 --> 00:01:34.551 +Carol can generate a random number less than her stake which is 15. + +24 +00:01:34.731 --> 00:01:40.404 +Therefore she can enter the committee on the next block. + +25 +00:01:40.466 --> 00:01:45.866 +As you can see the chance of entering the committee depends on the amount of stake. + +26 +00:01:45.866 --> 00:01:50.807 +If you have more stakes, therefore you have more chances to enter the committee. + +27 +00:01:50.808 --> 00:01:54.000 +This sortition algorithm repeats per block. + +28 +00:01:54.001 --> 00:01:58.694 +When a validator joins the committee, it has a chance to propose a block + +29 +00:01:58.694 --> 00:02:02.481 +and if the block is accepted by other committee members, + +30 +00:02:02.482 --> 00:02:06.865 +the proposer will receive one coin as block reward. + +31 +00:02:06.865 --> 00:02:10.639 +Transactions in Pactus Blockchain are stamped. + +32 +00:02:10.639 --> 00:02:15.443 +Stamping transaction simply means putting something from the previous block + +33 +00:02:15.443 --> 00:02:16.550 +(like block ID) + +34 +00:02:16.550 --> 00:02:18.949 +into the header of the transaction. + +35 +00:02:18.949 --> 00:02:22.165 +Stamping the transactions has some benefits, like: + +36 +00:02:22.165 --> 00:02:25.742 +the stamped transactions are loyal to the main chain + +37 +00:02:25.742 --> 00:02:29.168 +and therefore the blockchain becomes immune against attacks + +38 +00:02:29.168 --> 00:02:33.984 +like Long-Range attack which is very deadly for Proof of Stake blockchains. + +39 +00:02:33.984 --> 00:02:37.770 +Also stamped transactions have a lifetime + +40 +00:02:37.770 --> 00:02:41.260 +and they are valid only for one day. + +41 +00:02:42.588 --> 00:02:46.840 +The economic model in Pactus is almost similar to Bitcoin. + +42 +00:02:46.840 --> 00:02:51.297 +The total supply in the Pactus Blockchain is 21 million coins + +43 +00:02:51.297 --> 00:02:56.294 +and therefore Pactus is a deflationary cryptocurrency (like Bitcoin). + +44 +00:02:56.294 --> 00:03:00.000 +So the value of the coins should increase by time, + +45 +00:03:00.000 --> 00:03:02.166 +since the number of coins is limited. + +46 +00:03:02.166 --> 00:03:03.559 +In order to achieve that, + +47 +00:03:03.559 --> 00:03:09.134 +there is a special account in the genesis block which is called “Treasury account”. + +48 +00:03:09.134 --> 00:03:13.538 +The Treasury account has 21 million coins at the genesis time, + +49 +00:03:13.538 --> 00:03:16.605 +and no one has access to the treasury account. + +50 +00:03:16.605 --> 00:03:17.802 +In each block, + +51 +00:03:17.802 --> 00:03:24.256 +one coin from the treasury account will move to the block proposer as block reward. + +52 +00:03:24.818 --> 00:03:29.388 +Unlike bitcoin which has a halving mechanism for block reward, + +53 +00:03:29.388 --> 00:03:34.490 +block reward in Pactus is fixed and it is always one coin per block. + +54 +00:03:34.490 --> 00:03:41.802 +After 21 million blocks or almost 6 and half years the rewards will be finished. + +55 +00:03:41.802 --> 00:03:48.475 +However the validators can be incentivized by the transaction fees at that time. + +56 +00:03:49.381 --> 00:03:52.226 +Since the block reward is fixed, + +57 +00:03:52.226 --> 00:03:56.518 +the token distribution in Pactus is linear compared to Bitcoin. + +58 +00:03:56.518 --> 00:03:59.207 +This is a fair and good mechanism for token distribution + +59 +00:03:59.207 --> 00:04:01.924 +in a Proof of Stake blockchain. + +60 +00:04:01.924 --> 00:04:05.935 +Since the validators are powered by stakes (or coins) + +61 +00:04:05.935 --> 00:04:11.186 +there is a good motivation for validators to join the network earlier. + +62 +00:04:11.186 --> 00:04:14.490 +Transaction fees in Pactus are fixed and + +63 +00:04:14.490 --> 00:04:19.369 +calculated based on the transferred values (not transferred bits). + +64 +00:04:19.369 --> 00:04:22.091 +There is a consensus between validators to + +65 +00:04:22.091 --> 00:04:25.244 +define the percentage and minimum fee amount. + +66 +00:04:25.244 --> 00:04:30.161 +The minimum fee amount secures the network against spam transactions. + +67 +00:04:30.161 --> 00:04:33.836 +Pactus starts with only 4 bootstrap validators. + +68 +00:04:33.836 --> 00:04:36.952 +These bootstrap validators have no stake. + +69 +00:04:36.952 --> 00:04:39.947 +Whenever the 21st validator joins the network, + +70 +00:04:39.947 --> 00:04:42.418 +these bootstrap validators will be retired and + +71 +00:04:42.418 --> 00:04:45.671 +the network will be secured by other validators. + +72 +00:04:45.671 --> 00:04:52.275 +In this time the new validators can join the committee by running the sortition algorithm. + +73 +00:04:54.223 --> 00:04:59.897 +Running a validator in Pactus is easy, see you there. diff --git a/assets/media/what_is_pactus.mp4 b/assets/media/what_is_pactus.mp4 new file mode 100644 index 000000000..90e712f70 Binary files /dev/null and b/assets/media/what_is_pactus.mp4 differ diff --git a/assets/webfonts/fa-brands-400.ttf b/assets/webfonts/fa-brands-400.ttf new file mode 100644 index 000000000..502f3621e Binary files /dev/null and b/assets/webfonts/fa-brands-400.ttf differ diff --git a/assets/webfonts/fa-brands-400.woff2 b/assets/webfonts/fa-brands-400.woff2 new file mode 100644 index 000000000..d801b51f6 Binary files /dev/null and b/assets/webfonts/fa-brands-400.woff2 differ diff --git a/assets/webfonts/fa-regular-400.ttf b/assets/webfonts/fa-regular-400.ttf new file mode 100644 index 000000000..e0abe2710 Binary files /dev/null and b/assets/webfonts/fa-regular-400.ttf differ diff --git a/assets/webfonts/fa-regular-400.woff2 b/assets/webfonts/fa-regular-400.woff2 new file mode 100644 index 000000000..d736e4b24 Binary files /dev/null and b/assets/webfonts/fa-regular-400.woff2 differ diff --git a/assets/webfonts/fa-solid-900.ttf b/assets/webfonts/fa-solid-900.ttf new file mode 100644 index 000000000..13c948977 Binary files /dev/null and b/assets/webfonts/fa-solid-900.ttf differ diff --git a/assets/webfonts/fa-solid-900.woff2 b/assets/webfonts/fa-solid-900.woff2 new file mode 100644 index 000000000..3516fdbe3 Binary files /dev/null and b/assets/webfonts/fa-solid-900.woff2 differ diff --git a/assets/webfonts/fa-v4compatibility.ttf b/assets/webfonts/fa-v4compatibility.ttf new file mode 100644 index 000000000..dc2981941 Binary files /dev/null and b/assets/webfonts/fa-v4compatibility.ttf differ diff --git a/assets/webfonts/fa-v4compatibility.woff2 b/assets/webfonts/fa-v4compatibility.woff2 new file mode 100644 index 000000000..28d46b15a Binary files /dev/null and b/assets/webfonts/fa-v4compatibility.woff2 differ diff --git a/blog/images/2022-09-24-testnet-0-launched/testnet.gif b/blog/images/2022-09-24-testnet-0-launched/testnet.gif new file mode 100644 index 000000000..9997df534 Binary files /dev/null and b/blog/images/2022-09-24-testnet-0-launched/testnet.gif differ diff --git a/blog/images/2022-10-30-dev-meeting/women_life_freedom.png b/blog/images/2022-10-30-dev-meeting/women_life_freedom.png new file mode 100644 index 000000000..17b13a097 Binary files /dev/null and b/blog/images/2022-10-30-dev-meeting/women_life_freedom.png differ diff --git a/blog/images/2023-05-08-release-0-10-0/multi-validators.png b/blog/images/2023-05-08-release-0-10-0/multi-validators.png new file mode 100644 index 000000000..6e7ee80fa Binary files /dev/null and b/blog/images/2023-05-08-release-0-10-0/multi-validators.png differ diff --git a/blog/images/2023-05-29-release-0-11-0/bond-transaction-dialog.png b/blog/images/2023-05-29-release-0-11-0/bond-transaction-dialog.png new file mode 100644 index 000000000..4678a11a3 Binary files /dev/null and b/blog/images/2023-05-29-release-0-11-0/bond-transaction-dialog.png differ diff --git a/blog/images/2023-06-19-release-0-12-0/syncing-progress.png b/blog/images/2023-06-19-release-0-12-0/syncing-progress.png new file mode 100644 index 000000000..f35596901 Binary files /dev/null and b/blog/images/2023-06-19-release-0-12-0/syncing-progress.png differ diff --git a/blog/images/2023-07-01-release-0-13-0/restore-mode.png b/blog/images/2023-07-01-release-0-13-0/restore-mode.png new file mode 100644 index 000000000..38fbd999f Binary files /dev/null and b/blog/images/2023-07-01-release-0-13-0/restore-mode.png differ diff --git a/blog/images/2023-07-05-testnet-500-validators/500_validators.png b/blog/images/2023-07-05-testnet-500-validators/500_validators.png new file mode 100644 index 000000000..989eb0c6b Binary files /dev/null and b/blog/images/2023-07-05-testnet-500-validators/500_validators.png differ diff --git a/blog/images/2023-07-09-dev-meeting/network_messages.png b/blog/images/2023-07-09-dev-meeting/network_messages.png new file mode 100644 index 000000000..0d809041d Binary files /dev/null and b/blog/images/2023-07-09-dev-meeting/network_messages.png differ diff --git a/blog/images/2023-07-25-testnet-1-concluded/consensus_round.png b/blog/images/2023-07-25-testnet-1-concluded/consensus_round.png new file mode 100644 index 000000000..8e54e6f9c Binary files /dev/null and b/blog/images/2023-07-25-testnet-1-concluded/consensus_round.png differ diff --git a/blog/images/2023-07-25-testnet-1-concluded/staked_coins.png b/blog/images/2023-07-25-testnet-1-concluded/staked_coins.png new file mode 100644 index 000000000..a40fe46bd Binary files /dev/null and b/blog/images/2023-07-25-testnet-1-concluded/staked_coins.png differ diff --git a/blog/images/2023-07-25-testnet-1-concluded/transaction_confirmation.png b/blog/images/2023-07-25-testnet-1-concluded/transaction_confirmation.png new file mode 100644 index 000000000..74a6bf99d Binary files /dev/null and b/blog/images/2023-07-25-testnet-1-concluded/transaction_confirmation.png differ diff --git a/blog/images/2023-08-22-dev-report/github-pactus.png b/blog/images/2023-08-22-dev-report/github-pactus.png new file mode 100644 index 000000000..343ba5f34 Binary files /dev/null and b/blog/images/2023-08-22-dev-report/github-pactus.png differ diff --git a/blog/images/2023-09-04-introduction-to-pips/PIP.png b/blog/images/2023-09-04-introduction-to-pips/PIP.png new file mode 100644 index 000000000..cb9df60be Binary files /dev/null and b/blog/images/2023-09-04-introduction-to-pips/PIP.png differ diff --git a/blog/images/2023-09-04-introduction-to-pips/repository.png b/blog/images/2023-09-04-introduction-to-pips/repository.png new file mode 100644 index 000000000..65abac284 Binary files /dev/null and b/blog/images/2023-09-04-introduction-to-pips/repository.png differ diff --git a/blog/images/2023-09-24-dev-report-pre-testnet-2/github-pactus.png b/blog/images/2023-09-24-dev-report-pre-testnet-2/github-pactus.png new file mode 100644 index 000000000..2097706e5 Binary files /dev/null and b/blog/images/2023-09-24-dev-report-pre-testnet-2/github-pactus.png differ diff --git a/blog/images/2023-09-28-how-sspos-works-in-simple-word/SSPoS.png b/blog/images/2023-09-28-how-sspos-works-in-simple-word/SSPoS.png new file mode 100644 index 000000000..412208802 Binary files /dev/null and b/blog/images/2023-09-28-how-sspos-works-in-simple-word/SSPoS.png differ diff --git a/blog/images/2023-10-15-release-0-15-0/splash-screen.png b/blog/images/2023-10-15-release-0-15-0/splash-screen.png new file mode 100644 index 000000000..a5c8f139a Binary files /dev/null and b/blog/images/2023-10-15-release-0-15-0/splash-screen.png differ diff --git a/blog/index.html b/blog/index.html new file mode 100644 index 000000000..220986b8d --- /dev/null +++ b/blog/index.html @@ -0,0 +1,488 @@ + + + + + + + + + + + + + Blog | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

All posts

+ + + feed + +
+ +
+ + +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + + + +
+ +
+
+
+
+ + + + + diff --git a/browserconfig.xml b/browserconfig.xml new file mode 100644 index 000000000..b3930d0f0 --- /dev/null +++ b/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #da532c + + + diff --git a/community/index.html b/community/index.html new file mode 100644 index 000000000..7fcb9f54b --- /dev/null +++ b/community/index.html @@ -0,0 +1,376 @@ + + + + + + + + + + + + + Community | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+

Join the Pactus community

+ +

By joining the Pactus community, you become a part of a global network of innovators, thinkers, and doers who are all united by a shared vision of building a better future with blockchain technology. Whether you’re a developer, entrepreneur, investor, or simply a blockchain enthusiast, there’s a place for you here at Pactus.
So, let’s come together and make a difference!

+ + + +
+
+
+
+ + + + + diff --git a/contributing/index.html b/contributing/index.html new file mode 100644 index 000000000..7fb72a001 --- /dev/null +++ b/contributing/index.html @@ -0,0 +1,399 @@ + + + + + + + + + + + + + Contributing | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+

Contributing

+ +

As an open-source platform, Pactus blockchain empowers from its community. +Whether you’re a developer, designer, or enthusiast, your contributions can make a meaningful impact.

+ +

There are several ways to support the Pactus project:

+ +

Run a Node

+ +

One of the most effective ways to contribute to the Pactus network is by running a node. +A “node” is a software program that downloads a copy of the Pactus blockchain and +ensure the network keeps running safe and decentralized.

+ +

These guides can help you to run and configure your node:

+ + + +

Become a Validator

+ +

Validators play an important role in the Pactus blockchain by verifying transactions and +adding them to the blockchain. +By becoming a validator, you can earn rewards +for contributing to the network’s security and decentralization.

+ +

To become a validator, you will need to stake a certain amount of Pactus coins. +These guides can help you to send a Bond transaction and stake some coins:

+ + + +

Develop

+ +

Pactus is an open-source project that welcomes and encourages contributions from developers. +By contributing to the project, you can help improve the Pactus platform and create new features that +benefit the entire community.

+ +

You can check our Contributing page +for more information on how to get involved and contribute to the project.

+ +

Translation

+ +

Another way to contribute to the Pactus project is by translating this website into other languages and +improving its content.

+ +

Spread the Word

+ +

The more people who know about Pactus, the more opportunities there are for collaboration and growth. +Share our project on social media, attend Pactus events, or simply tell your friends and colleagues about us.

+ +
+ +

Together, Let’s build a better future for blockchain technology.

+ + +
+
+
+
+ + + + + diff --git a/download/index.html b/download/index.html new file mode 100644 index 000000000..5c8ac7aff --- /dev/null +++ b/download/index.html @@ -0,0 +1,491 @@ + + + + + + + + + + + + + Download | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+

Download Pactus

+ +

On this page you can find how to download and get the latest version of the Pactus software.

+ +
+ +

🏗️ Compile from Source Code

+ +

Project Pactus is distributed as open source software, so the preferred way for installing it is to clone the source code from the GitHub repository and compile the source code.

+ +

Instructions for compiling Pactus is provided on the install page.

+ +
+ +

⬇️ Download Stable Releases

+ +

You can also download the latest stable releases of Pactus. These releases are updated automatically when a new version is released in GitHub repository.

+ +

Pactus Graphical User Interface (GUI)

+ +

You can run Pactus in a graphical user interface (GUI) mode and it is suitable for both beginners and advanced users.

+ +

Pactus Graphical User Interface (GUI)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
File nameKindOSArch
pactus-gui_0.15.2_darwin_amd64.tar.gzArchivemacOS64-bit
pactus-gui_0.15.2_darwin_amd64.dmgDMGmacOS64-bit
pactus-gui_0.15.2_linux_amd64.tar.gzArchiveLinux64-bit
pactus-gui_0.15.2_windows_amd64.zipArchiveWindows64-bit
pactus-gui_0.15.2_windows_amd64_installer.exeInstallerWindows64-bit
+ +
+ Untrusted application

Be aware that the precompiled binaries are not shipped with any code signing certificate. Most probability in Windows and macOS the downloaded binaries are detected as untrusted application. + +
+ +

Once you have downloaded the Pactus GUI, you may follow this tutorial to set up and run your node: + How to run Pactus in Graphic Mode?

+ +
+ +

Pactus Command Line Interface (CLI)

+ +

Advanced users can run Pactus in command line interface (CLI) mode.

+ +

Pactus Command Line Interface (CLI)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
File nameOSArch
pactus-cli_0.15.2_android_arm64.tar.gzAndroidARM64
pactus-cli_0.15.2_darwin_amd64.tar.gzmacOS64-bit
pactus-cli_0.15.2_darwin_arm64.tar.gzmacOSARM64
pactus-cli_0.15.2_freebsd_amd64.tar.gzFreeBSD64-bit
pactus-cli_0.15.2_freebsd_arm.tar.gzFreeBSDARM
pactus-cli_0.15.2_linux_amd64.tar.gzLinux64-bit
pactus-cli_0.15.2_linux_arm64.tar.gzLinuxARM64
pactus-cli_0.15.2_windows_386.zipWindows32-bit
pactus-cli_0.15.2_windows_amd64.zipWindows64-bit
+ +

Once you have downloaded the Pactus CLI, you may follow this tutorial to set up and run your node: + How to run Pactus in Command Line mode?

+ +
+ +

🐳 Docker Container

+ +

Advanced users can get the Pactus docker image from Docker Hub.

+ +

You may follow this tutorial to set up and run your node using Docker: + How to run Pactus using Docker?

+ +
+
+
+
+ + + + + diff --git a/favicon-128x128.png b/favicon-128x128.png new file mode 100644 index 000000000..f12927c2a Binary files /dev/null and b/favicon-128x128.png differ diff --git a/favicon-16x16.png b/favicon-16x16.png new file mode 100644 index 000000000..c6d902e56 Binary files /dev/null and b/favicon-16x16.png differ diff --git a/favicon-32x32.png b/favicon-32x32.png new file mode 100644 index 000000000..55447f432 Binary files /dev/null and b/favicon-32x32.png differ diff --git a/favicon-64x64.png b/favicon-64x64.png new file mode 100644 index 000000000..70545a0a3 Binary files /dev/null and b/favicon-64x64.png differ diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 000000000..64080c0ee Binary files /dev/null and b/favicon.ico differ diff --git a/feed.xml b/feed.xml new file mode 100644 index 000000000..48860b995 --- /dev/null +++ b/feed.xml @@ -0,0 +1,1106 @@ +Jekyll2023-10-26T18:16:45+00:00https://pactus.org/feed.xmlPactus blockchainPactus 0.15.1 released2023-10-21T00:00:00+00:002023-10-21T00:00:00+00:00https://pactus.org/2023/10/21/release-0-15-1Overview + +

Pactus Blockchain Version 0.15.1 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Highlites

+ +

This version address an unforeseen issue in the consensus protocol. +We kindly ask all validators to upgrade their nodes to this version.

+ +

Download

+ +

This version has been implemented for Testnet-1 and +is being prepared for the upcoming Mainnet launch. +To start using Pactus Blockchain Testnet-2, download the latest version from the +download page and join the Testnet.

+ + + +

How to Upgrade

+ +

If you are running an older version, shut it down. +Uninstall the previous version and install the newer version. +If you are using the archived version, simply use the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Fix

+ +
    +
  • consensus: strong termination for the binary agreement (#765)
  • +
  • consensus: not increase the voting power on duplicated binary votes (#762)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

]]>
Pactus 0.15.2 released2023-10-21T00:00:00+00:002023-10-21T00:00:00+00:00https://pactus.org/2023/10/21/release-0-15-2Overview + +

Pactus Blockchain Version 0.15.2 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Highlights

+ +

This version allows nodes to set limits on the number of connections they can establish. +By default, each node can have a minimum of 8 connections and a maximum of 16 connections. +Users can easily change these numbers in the configuration file.

+ +

Download

+ +

This version has been implemented for Testnet-2 and +is being prepared for the upcoming Mainnet launch. +To start using Pactus Blockchain Testnet-2, download the latest version from the +download page and join the Testnet.

+ +

These guides can help you to download, install and configure your node:

+ + + +

How to Upgrade

+ +

If you are running an older version, shut it down. +Uninstall the previous version and install the newer version. +If you are using the archived version, simply use the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • add community bootstrap nodes to testnet config (#764)
  • +
  • network: implementing connection manager (#773)
  • +
  • network: adding bootstrapper mode to the network config (#760)
  • +
+ +

Fix

+ +
    +
  • network: ensure relay is not used when there is no direct connection
  • +
  • network: close connection when unbale to get supported protocols (#781)
  • +
  • network: enabling peer exchange for bootstrappers (#779)
  • +
  • network: set connection limit for the resource manager (#775)
  • +
  • sync: peer status set to known on sucessfull handshaking (#774)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

]]>
Pactus 0.15.0 released2023-10-15T00:00:00+00:002023-10-15T00:00:00+00:00https://pactus.org/2023/10/15/release-0-15-0Overview + +

Pactus Blockchain Version 0.15.0 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Splash screen

+ +

Download

+ +

This version is the bootstrap version for +Testnet-2. +To start using Pactus Blockchain Testnet-1, download the latest version from the +download page and join the Testnet.

+ +

These guides can help you to run and configure your node:

+ + + +
+ If you participated in Testnet-1, ensure to delete your previous working directory and + create a new wallet. +

+ By default, the working directory is located at "C:\Users\<name>\pactus" on Windows, + or "~/pactus" on Unix-compatible platforms. +
+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • gui: adding the splash screen (#743)
  • +
  • add absentees votes to the certificate (#746)
  • +
  • logger: short stringer for loggers (#732)
  • +
  • implementing pip-7 (#731)
  • +
  • implementing pip-11 (#712)
  • +
  • implementing pip-8 (#711)
  • +
  • implementing pip-9 (#706)
  • +
  • new API to get Public key by address (#704)
  • +
  • Adding address field for AccountInfo (#703)
  • +
  • CreateValidatorEvent and CreateAccountEvent for nanomsg (#702)
  • +
  • implementing PIP-2 and PIP-3 (#699)
  • +
  • Adding Hole Punching to network (#697)
  • +
  • write logs into file (#673)
  • +
  • check protocol support before sending connect/disconnect event (#683)
  • +
  • updating genesis for pre-testnet-2 (#679)
  • +
  • adding udp protocol for network (#672)
  • +
  • implementing pip-4 (#671)
  • +
  • Notifee service events (#628)
  • +
  • adding MinimumStake parameter (#574)
  • +
  • adding Sent and Received bytes per message metrics for peers (#618)
  • +
  • add reason to BlockResponse messages (#607)
  • +
  • Add CalcualteFee in GRPC (#601)
  • +
  • add sent bytes and received bytes metrics to peerset plus update grpc (#606)
  • +
  • added metrics of libp2p with supporting prometheus (#588)
  • +
  • Check node address is valid (#565)
  • +
  • add LastSent and LastReceived properties to peer (#569)
  • +
+ +

Fix

+ +
    +
  • data race issue on updating certificate (#747)
  • +
  • network: async connection (#744)
  • +
  • adding query vote timer for CP phase (#738)
  • +
  • trim transactions in proposed block (#737)
  • +
  • fixing query votes and proposal issue (#736)
  • +
  • fixing issue when a block has max transactions (#735)
  • +
  • consensus: anti-entroy mechanism for the consensus (#734)
  • +
  • logger: invalid level parsing error (#733)
  • +
  • cache certificate by height (#730)
  • +
  • fixing a crash on consensus (#729)
  • +
  • consensus: prevent double entry in new height (#728)
  • +
  • resolve consensus halt caused by time discrepancy in network. (#727)
  • +
  • unsorted addresses in wallet listing (#721)
  • +
  • send query votes message, if there is no proposal yet (#723)
  • +
  • fixing logger level issue (#722)
  • +
  • fixing syncing stuck issue (#720)
  • +
  • fixing some minor issues on pre-testnet (#719)
  • +
  • supporting go version 1.21 and higher (#692)
  • +
  • ensure log rotation using tests (#693)
  • +
  • restoring at the first block (#691)
  • +
  • swagger doesn’t work with multiple proto files (#687)
  • +
  • fixing wallet-cli issues (#686)
  • +
  • prevent stripping public key for subsidy transactions (#678)
  • +
  • updating the consensus protocol (#668)
  • +
  • aggregating signature for hello message (#640)
  • +
  • error case for logger (#634)
  • +
  • adding committers to the certificate (#623)
  • +
  • updating sortition executor (#608)
  • +
  • update buf and fixing proto generation issue (#600)
  • +
  • adding block hash to peer (#584)
  • +
  • copy to clipboard option for address and pubkey (#583)
  • +
  • public key aggregate (#576)
  • +
  • remove GetValidators rpc method (#573)
  • +
  • missing swagger ui for grpc get account by number (#564)
  • +
  • incorrect handler for validator by number (#563)
  • +
+ +

Refactor

+ +
    +
  • sync: refactoring syncing process (#676)
  • +
  • remove payload prefix from payload transaction type (#669)
  • +
  • change Hello message from broadcasting to direct messaging (#665)
  • +
  • committee: using generic list for validators (#667)
  • +
  • rename SanityCheck to BasicCheck (#643)
  • +
  • cli: Migrating from mow.cli to cobra for wallet (#629)
  • +
  • cli: replacing mow.cli with cobra for daemon (#621)
  • +
  • logger: using fast JSON logger (zerolog) (#613)
  • +
  • Using Generics for calculating Min and Max for numeric type #604 (#609)
  • +
  • Updating LRU cache to version 2 #514 (#602)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

]]>
Testnet-2 launch announcement2023-10-15T00:00:00+00:002023-10-15T00:00:00+00:00https://pactus.org/2023/10/15/testnet-2-launchedOverview + +

Exciting news for the Pactus Community: Testnet-2 is has launched! +The journey through Testnet-1 +brought success and invaluable experiences, with over 500 validators joining the network. +Despite its noteworthy achievements, it also faced challenges that led to a tough decision: to pause the Testnet and +thoroughly address these issues. +After two months of dedicated work and testing, many problems have been resolved, and +we feel confident launching the Testnet again. +Testnet-2 comes with substantial improvements compared to its predecessor by enhancing the core of the Pactus Blockchain. +Notably, the new consensus mechanism and improved overall network performance.

+ +

At this point, we want to assure the Pactus community that this version of +the Testnet will not stop until the mainnet launches, +and our main focus is on improving its overall performance and launching the Mainnet.

+ +

If you’re new to the concept of Testnet, check out our informative post: +What is the Testnet?

+ +

Key Focus Areas

+ +

Testnet-2 has important tasks ahead. +Firstly, we aim to confirm that the new consensus mechanism is both safe and efficient. +A close eye will be kept on the network’s performance, ensuring it operates as expected. +For Testnet-2, the committee +size has been expanded to 51 members. +Both the committee’s performance and block production will be closely monitored. +The goal is a blockchain that remains stable and trustworthy, +even with thousands of validators in the network, +ensuring it manages its regular duties seamlessly.

+ +

How To Join

+ +

Want to join the Testnet-2? Great! It’s super easy. +Just download the latest Pactus software and you’re good to go. +no fancy setups or special gear needed. +You can run the software straight from your personal computer or laptop. +Need some test coins? Pop over to our Discord channel and share your validator address there.

+ +

Benefits for Participation

+ +

By taking part in the Testnet, users can familiarize themselves with the Pactus blockchain and +be well-prepared for the Mainnet launch. +Testnet participants will also receive higher priority during the Mainnet launch and +get free coins for initial staking on the Mainnet.

+ +

Your Feedback Matters

+ +

User feedback plays a vital role in the improvement of the Pactus blockchain. +Share your thoughts and experiences to contribute to the enhancement of future software versions.

]]>
How SSPoS (Solid State Proof of Stake) works in simple word2023-09-28T00:00:00+00:002023-09-28T00:00:00+00:00https://pactus.org/2023/09/28/how-sspos-works-in-simple-wordAbstract + +

In all Blockchain protocols, there is a concept called a consensus mechanism. +This mechanism is used to enable nodes to reach an agreement +on the state of the Blockchain they are +maintaining, in order to have a synchronized and integrated Blockchain.

+ +

For now, we have a lot of consensus mechanisms in the Blockchain world. +Pactus Blockchain uses the SSPoS (Solid State Proof of State) which is a new consensus model.

+ +

To explain how it works let’s start with explaining one of the first and simplest +consensus mechanisms (or if you already know them, just jump into the last part named SSPoS).

+ +

Solid State Proof of Stake

+ +

PoW (Proof of Work)

+ +

In the proof of work model, each node in the network should solve a complex mathematical +problem that requires lots of computing resources to make a new block.

+ +

In this way, it’s highly unlikely that anyone would be able to change +past transactions and change Blockchain states such as balances, +without expending equivalent computational power.

+ +

By doing this we ensure the security and integrity of the Blockchain.

+ +

The concept was adapted from digital tokens by Hal Finney in 2004 +through the idea of “reusable proof of work” using the 160-bit secure hash algorithm 1 (SHA-1).

+ +

Bitcoin uses this consensus model.

+ +

PoS (Proof of Stake)

+ +

On the other hand, PoS or Proof of Stake is another consensus mechanism that instead of miners has validators!

+ +

Validators lock a number of their assets in the Blockchain and they can transfer or use it +till it is locked which we call staking. +after each Block is committed one of the validators will be chosen randomly (more amount of stake, +more chance to be chosen) when a validator is chosen +it proposes a block and announces it to other nodes to be validated, +when a supermajority of validators accept the block it’s going to be committed.

+ +

In this system, validators have no incentive to behave maliciously or dishonestly. +If they do, they risk losing the stake amount.

+ +

More amount of validators in a PoS Blockchain makes it more secure, +decentralized, and trustable, but it also makes the validation and consensus process slower and more difficult.

+ +

Ethereum uses this model.

+ +

DPoS (Delegated Proof of Stake)

+ +

DPoS or Delegated Proof of Stake, is a variant of the PoS consensus algorithm. +users entrust their stakes to a small group of “delegates”. +These delegates are responsible for validating transactions +and creating blocks. The number of delegates is limited +to ensure accountability and efficiency in the validation process.

+ +

Some Blockchains like Cardano and Tron use DPoS.

+ +

DPoS tries to solve the issue of PoS which when validators +increase we have an inefficient validation process. but the main issue with DPoS itself is putting a lot +of trust in the hands of a small number of delegates, +which goes against the principle of “don’t trust, verify”.

+ +

SSPoS (Solid State Proof of Stake)

+ +

BUT, HOW ABOUT SSPoS? HOW ABOUT PACTUS?

+ +

In Pactus Blockchain, we have something called Solid State Proof of Stake +and we try to fix the previous model’s issue, let me explain.

+ +

Pactus uses a dynamic committee of validators with a fixed size of 21, +but the members of the committee randomly change in each round, +based on stake amount the chance of being chosen is higher. on the other hand, +the number of validators out on the committee is unlimited, allowing anyone +to become a validator by staking coins.

+ +

At each block, validators participate in a sortition algorithm by generating a random number +between zero and the total staked coins. If the number is less +than the validator’s stake, they can enter the committee and replace the oldest committee member.

+ +

So, in SSPoS models which are a variant of PoS, we can reach a consensus, +without using high computation resources, having an inefficient +validation process by increasing validator numbers, +and also without breaking the principle of “don’t trust, verify”.

]]>
Dev Report pre-testnet22023-09-24T00:00:00+00:002023-09-24T00:00:00+00:00https://pactus.org/2023/09/24/dev-report-pre-testnet-2Abstract + +

there is several activities in Pactus github in September month, here is a clear report and explain of activities.

+ +

Github Pactus

+ +

Implementing PIP 2, 3 and 4

+ +

After starting Pactus Labs and PIPs, +we start implementing each accepted PIP one by one to improve Pactus, here is a list of implemented PIPs:

+ + + +

Network

+ +

There is some very good change and new features for Pactus network module, +this list contain a list of important changes in Pactus networking:

+ + + +

gRPC and nanomessage services

+ +

We also updated, improved and enhanced gRPC and nanomessage services for better developer experience, +for third-party and side project developers, here is some changes:

+ + + +

Refactoring and other new feature or debugs

+ +

We had some not implemented feature request, not fixed bugs and some issue with new golang version, +list of this changes:

+ +]]>
Introduction to PIPs2023-09-04T00:00:00+00:002023-09-04T00:00:00+00:00https://pactus.org/2023/09/04/introduction-to-pipsIntroduction to PIPs + +

In our commitment to transparency and innovation, we’re excited to introduce a major step in Pactus’s journey: +the Pactus Improvement Proposals, or PIPs.

+ +

PIPs image

+ +

What are PIPs?

+ +

Pactus Improvement Proposals (PIPs) define standards for the ongoing development and enhancement of the Pactus platform. +Each PIP has a unique number like PIP-2, +PIP-3, and so on. +These proposals provide technical details for suggested modifications or enactments, serving as a guide for development.

+ +

The PIP process

+ +

The PIP process is open, allowing any member of the Pactus community to propose a PIP. +The author should provide a summary, motivation, and a detailed technical explanation. +The Pactus Laboratory team will carefully review each PIP. +Security considerations must be addressed before finalizing a PIP. +Once finalized, it can be added to the code. +This process helps avoid unexpected issues during development and maintain consistency and safety.

+ +

The Origins of PIPs

+ +

The Pactus Improvement Proposals (PIPs) was inspired by the +Ethereum Improvement Proposals (EIPs) system, +which had its roots in the Bitcoin Improvement Proposals (BIPs) and +Python Enhancement Proposals (PEPs).

+ +

New Feature Policy

+ +

From now on, all major changes or new features in the Pactus project require a PIP. +Any implementation must reference its specific PIP. +Without approval from Pactus Laboratory team, changes won’t be approved and added to the codebase.

+ +

PIPs Repository

+ +

For a complete list of Pactus Improvement Proposals, visit this link. +The corresponding GitHub repository is accessible here.

+ +

PIPs repository on Github

]]>
Dev report2023-08-22T00:00:00+00:002023-08-22T00:00:00+00:00https://pactus.org/2023/08/22/dev-reportAbstract + +

there is several activities in pactus github this month, here is a clear report and explain of activities.

+ +

Github Pactus

+ +

Linters

+ +

one of new changes in pactus project is new linters we added this month. +what is linters? +linters are just a set of rules for the style of source codes, they force developers to write new codes +in correct, clean and safe way.

+ +

why we use them? +the reason we are using linters in Pactus and add new ones, is to make the code more safe, +and also make it easy to work on for new contributors because we are focus on being decentralized even in development.

+ +

Linters we added till now

+ +

TLA+ spec

+ +

one another new change in Pactus is updating TLA+ spec, which is related to consensus, +as you know we had some problem with consensus in Testnet-1, we fixed the issues and now we are trying to make it more clean.

+ +

link to changes

+ +

if you wish you can learn more about Pactus consensus here.

+ +

Refactoring

+ +

some of previous Pactus dependencies was so old, so we start refactoring them and use new libraries. +also we used some libraries with higher performance which is make Pactus full node more faster in mainnet.

+ +

one of refactors

]]>
Story of Testnet-12023-08-01T00:00:00+00:002023-08-01T00:00:00+00:00https://pactus.org/2023/08/01/testnet-1-concludedAbout Testnet + +

Testnet is a testing environment where developers and users can try out the functionality of a blockchain project, +without putting real assets or data at risk. +It helps to ensure that the final product is reliable and secure for users to use. +If you like to read more about the Testnet you can check out our post on +“What is Testnet?”.

+ +

Summary

+ +

In May 2023, we launched our second Testnet. +The main purpose of this Testnet was to measure block time creation and the responsiveness of the blockchain. +The development team also focused on evaluating the network’s performance. +Additionally, the overall performance of the software and the syncing process were closely examined and assessed.

+ +

The committee for Testnet-1 was set to 21 validators, +and 584 validators joined during the Testnet period. +More than 600,000 blocks were created, and more than 1 million transactions were processed during this time. +The size of the blockchain is about 300 megabytes.

+ +

About 300,000 coins were staked during this period, it was almost 50% of the total generated coins. +It shows that users, even in Testnet, tend to stake their coins.

+ +

Staking chart

+ +

We were able to extract the confirmation time of transactions. +More than 97% of transactions were confirmed in just one block after submission. +This indicates that the transaction pool and broadcasting models are working fine.

+ +

Transaction confirmation chart

+ +

Based on logs from one of the validators, the time for creating a block is about 3 seconds in normal cases. +More than 97% of blocks are committed in the first rounds.

+ +

Consensus round chart

+ +

During Testnet-1, we released three versions(Version +0.11.0, +0.12.0, +0.13.0), and the upgrade process was smooth. +At this time, the development team decided to stop Testnet-1 and work on improvements that are not backward compatible, +including:

+ +
    +
  • Improving the consensus protocol
  • +
  • Reducing the blockchain size
  • +
  • Optimizing the network usage
  • +
+ +

After stabilizing the changes, we will announce the next Testnet, and hopefully, this will be the pre-launch Testnet.

+ +

Spacial thanks to the community

+ +

This Testnet was important for us. +It helped us learn what we need to do to make Pactus work even better. +Without the community that supports us and dedicates their time and resources to testing and feedback, +we wouldn’t have been able to progress as we have.

+ +

we thank all of them for their valuable contributions. +As promised, participants in Testnets will be given priority as validators for the MainNet, and +will receive bounty tokens from the bootstrap accounts to set up their validator.

+ +

We are grateful to all those who participated in Testnet-1, and +we encourage them to join our next Testnet to help us improve Pactus. +As a community-based project, we rely on the support of our community members, and we value any help we receive.

]]>
Dev meeting2023-07-09T00:00:00+00:002023-07-09T00:00:00+00:00https://pactus.org/2023/07/09/dev-meetingMeeting Summary + +

The meeting took place on 09 July 2023, at 2:00 PM UTC via Google Meet, +with team members from different time zones joining to discuss key aspects of the Pactus project.

+ +

Overview to the Network Module

+ +

The meeting began with an overview of the Network module in Pactus. +This module uses Libp2p as its underlying network protocol.

+ +

The Network module is agnostic about the content of the message and +handles two types of messages: Gossip messages, which are broadcasted, +and Stream messages, which are sent directly to a specific peer. +The team discussed the relay nodes that enable communication for nodes behind NAT. +Upon receiving a message, the module publishes an event. +The two types of events are Gossip events and Steam events.

+ +

Network messages

+ +

The team discussed the issue of Relay connections resetting, and explored solutions such as +hole punching or using UDP and IPv6.

+ +

Some users in the Testnet reported high network usage. +The team discussed implementing metrics for LibP2P to monitor network usage effectively. +The discussion related to this issue can be found here. +Additionally, the team discussed the customization of network resources, +including setting limits for inbound and outbound connections.

+ +

Overview to the Sync Module

+ +

Moving on, the Sync module was discussed. +Unlike the Network module, the Sync module has full knowledge about the messages and packets. +The module handles a range of message types, which can be found +here.

+ +

It was suggested that we need to define metrics for each message type. +There was also a discussion about the need for reducing the messages to optimize the use of network resources.

+ +

The team decided to continue discussing these topics in future meetings. +They also plan to work on improving the Network and Sync modules based on these discussions.

]]>
500 validators joined Testnet2023-07-05T00:00:00+00:002023-07-05T00:00:00+00:00https://pactus.org/2023/07/05/testnet-500-validatorsFor a Proof of Stake blockchain, validators are important for +maintaining the network’s integrity and security. They are similar to miners in Proof of Work blockchains like Bitcoin.

+ +

Pactus as a real Proof of Stake blockchain, has achieved a significant milestone. +More than 500 validators joined the Testnet +in less than 2 months. +This accomplishment proves that Pactus is reliable, resilient, and trustworthy. More importantly, it sets new standards +in the blockchain world. In fact, the Pactus Testnet is even more decentralized than some well-known blockchains.

+ +

500 validators of Testnet

+ +

One key reason why Pactus can accommodate more validators is its powerful +consensus mechanism. +The consensus mechanism in Pactus eliminates the need for delegation, making it possible for anyone to become a validator. +Additionally, the user-friendly application ensures that even those new to blockchain can easily contribute to the network.

+ +

What is the next

+ +

To remain competitive in the market, Pactus recognizes the importance of prioritizing user space. +We aim to ensure that running Pactus is affordable and accessible to anyone, regardless of their technical expertise or +available resources.

+ +

To achieve this, the Pactus team constantly monitors network, storage, and computational usage, striving to keep them +at minimal levels. +By doing so, we enable more individuals to participate in the Pactus blockchain.

+ +

Currently, the Pactus team is working on optimizing and reducing network usage. This effort will lead to reduced costs, +especially for users who are using home internet connections.

+ +

Furthermore, we are planning to introduce a pruning mode, allowing users to run the Pactus blockchain with significantly +less storage. +Although we believe the storage size is already small, our goal is to enable users to +retain only the most recent blockchain history. +This approach ensures that the blockchain size remains as compact as possible by disregarding some history of the blockchain.

]]>
Pactus 0.13.0 released2023-07-01T00:00:00+00:002023-07-01T00:00:00+00:00https://pactus.org/2023/07/01/release-0-13-0Overview + +

Pactus Blockchain Version 0.13.0 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Highlights

+ +

Users can now restore the default_wallet during the node initialization. +If users have a backup of the seed phrase (mnemonic) for the default_wallet, +they can now restore it and re-initialize the node.

+ +

Restore mode

+ +

Download

+ +

This version has been implemented for Testnet-1 and +is being prepared for the upcoming Mainnet launch. +To start using Pactus Blockchain Testnet-1, download the latest version from the +download page and join the Testnet.

+ +

These guides can help you to run and configure your node:

+ + + +

How to Upgrade

+ +

If you are running an older version, shut it down. +Uninstall the previous version and install the newer version. +If you are using the archived version, simply use the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Fix

+ +
    +
  • implemented restore wallet base on input seed (#553)
  • +
  • measuring total sent and received bytes (#552)
  • +
  • add validate seed and restore wallet (#533)
  • +
  • HTTP: Missing handlers (#549)
  • +
  • gui: update about dialog and menu items in help (#532)
  • +
+ +

Refactor

+ +
    +
  • implementing TestSuite (#535)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

]]>
Pactus 0.12.0 released2023-06-19T00:00:00+00:002023-06-19T00:00:00+00:00https://pactus.org/2023/06/19/release-0-12-0Overview + +

Pactus Blockchain Version 0.12.0 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Highlights

+ +

This version is focused on improving the sync time to make it faster. +This is achieved by implementing a caching mechanism that executes transactions more quickly and +improves the calculation of total power (stake) of the blockchain in a more effective way.

+ +

Syncing progress

+ +

Download

+ +

This version has been implemented for Testnet-1 and +is being prepared for the upcoming Mainnet launch. +To start using Pactus Blockchain Testnet-1, download the latest version from the +download page and join the Testnet.

+ +

These guides can help you to run and configure your node:

+ + + +

How to Upgrade

+ +

If you are running an older version, shut it down. +Uninstall the previous version and install the newer version. +If you are using the archived version, simply use the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • add GetAccountByNumber API to get account by number (#511)
  • +
+ +

Fix

+ +
    +
  • caching account and validator in store (#513)
  • +
  • get recent blocks by stamp (#509)
  • +
  • closing the mDNS connection upon stopping the network (#508)
  • +
  • updating linkedmap to use generic (#507)
  • +
  • removing state from cache (#506)
  • +
  • Typo in GUI (#499)
  • +
  • supporting localnet (#492)
  • +
+ +

Refactor

+ +
    +
  • update total power calculation based on power change(deltas) (#518)
  • +
  • GetValidators return all validators in state validators map (#512)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

]]>
Pactus 0.11.0 released2023-05-29T00:00:00+00:002023-05-29T00:00:00+00:00https://pactus.org/2023/05/29/release-0-11-0Overview + +

Pactus Blockchain Version 0.11.0 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Highlights

+ +

The main update in this version is the fix for the relay +connection issue. +A relay is a peer in the network that facilitates the connection between two peers, +particularly when they are using home internet.

+ +

Another significant update is that sending a Bond transaction +is now more user-friendly. +Users no longer need to set the validator public key if they want to bond Test PAC coins to their validators.

+ +

Bond transaction dialog

+ +

Download

+ +

This version has been implemented for Testnet-1 and +is being prepared for the upcoming Mainnet launch. +To start using Pactus Blockchain Testnet-1, download the latest version from the +download page and join the Testnet.

+ +

These guides can help you to run and configure your node:

+ + + +

How to Upgrade

+ +

If you are running an older version, shut it down. +Uninstall the previous version and install the newer version. +If you are using the archived version, simply use the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Fix

+ +
    +
  • gui: showing the total number of validators (#474)
  • +
  • network: fixing relay connection issue (#475)
  • +
  • consensus: rejecting vote with round numbers exceeding the limit (#466)
  • +
  • increase failed counter when stream got error (#489)
  • +
  • boosting syncing process (#482)
  • +
  • waiting for proposal in pre-commit phase (#486)
  • +
  • retrieving public key from wallet for bond transactions (#485)
  • +
  • restoring config file to the default (#484)
  • +
  • defining ChainType in genesis to detect the type of network (#483)
  • +
  • reducing the default Argon2d to consume less memory (#480)
  • +
  • adding password option to the start commands (#473)
  • +
+ +

Refactor

+ +
    +
  • rename send to transfer. (#469)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

]]>
Testnet-1 launch announcement2023-05-09T00:00:00+00:002023-05-09T00:00:00+00:00https://pactus.org/2023/05/09/testnet-1-launchedOverview + +

The Pactus blockchain Testnet-1 is now available for participation. +This version simulates the Mainnet environment and evaluate the system’s performance, stability, +and security in a controlled environment. +The primary goal of this version of Testnet is to determine the efficient and secure committee size for the Mainnet.

+ +

Key Aspects

+ +
    +
  • Simulating the Mainnet environment
  • +
  • Determining the actual block creation time
  • +
  • Assessing the staking mechanism and consensus protocol
  • +
  • Evaluating network usage under different loads
  • +
  • Evaluating the syncing process for new nodes joining the network
  • +
  • Ensuring network stability with over 1000 validators
  • +
  • Evaluating transaction performance
  • +
  • Conducting stress tests
  • +
  • Performing security tests, including double spend attacks, Sybil attacks +(nodes with different identities), and forking resistance
  • +
+ +

Joining Testnet-1

+ +

To join the Testnet, download Pactus software +version 0.10.0 and +connect to Testnet without any special configuration or hardware. +You can run the software on your personal computer or laptop. +To acquire test coins, visit the Discord channel and +provide your validator address.

+ +

Benefits for Participation

+ +

By taking part in the Testnet, users can familiarize themselves with the Pactus blockchain and +be well-prepared for the Mainnet launch. +Testnet participants will also receive higher priority during the Mainnet launch and +get free coins for initial staking on the Mainnet.

+ +

Your Feedback Matters

+ +

User feedback plays a vital role in the improvement of the Pactus blockchain. +Share your thoughts and experiences to contribute to the enhancement of future software versions.

]]>
Pactus 0.10.0 released2023-05-08T00:00:00+00:002023-05-08T00:00:00+00:00https://pactus.org/2023/05/08/release-0-10-0Overview + +

Pactus Blockchain Version 0.10.0 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Highlight

+ +

The main update in this version allows users to set up multiple validators in one node. +Users can set up to 32 validators in a single node, and each validator can stake up to 1,000 coins.

+ +

Multi validators

+ +

Download

+ +

This version has been implemented for Testnet-1 and +is being prepared for the upcoming Mainnet launch. +To start using Pactus Blockchain Testnet-1, download the latest version from the +download page and join the Testnet.

+ +

These guides can help you to run and configure your node:

+ + + +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • removing address from account (#454)
  • +
  • supporting multiple consensus instances (#450)
  • +
  • adding sortition interval to the parameters (#442)
  • +
+ +

Fix

+ +
    +
  • gui: check if the node has an active consensus instance (#458)
  • +
  • Use of a Persistent Merkle tree to enhance performance of calculating the +state hash; fully tested in Testnet-0 (#432)
  • +
  • GetBlockchainInfo API in gRPC now returns the total number of validators and accounts (#439)
  • +
  • wallet path as argument (#455)
  • +
  • adding reward addresses to config (#453)
  • +
  • removing committers from the certificate hash (#444)
  • +
  • prevent data race conditions in committee (#452)
  • +
  • using 2^256 for the vrf denominator (#445)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

]]>
Story of Testnet-02023-04-21T00:00:00+00:002023-04-21T00:00:00+00:00https://pactus.org/2023/04/21/testnet-0-concludedWhat is Testnet? + +

Testnet is a testing environment where developers and users can try out the functionality of a blockchain project, +without putting real assets or data at risk. +It helps to ensure that the final product is reliable and secure for users to use. +If you like to read more about the Testnet you can check out our post on +“What is Testnet?”.

+ +

Summary of Testnet-0

+ +

In September 2022, we launched our first Testnet. +The purpose of this Testnet was to +check the consensus protocol, +test different transaction types, +and ensure the stability of the blockchain. +We also wanted to test the sortition algorithm +to make sure it works properly.

+ +

The committee +for the Testnet-0 was set to five validators, and more than 19 validators joined during the Testnet period. +Over 2 million blocks were created, and more than 3.2 million transactions were processed during this time. +The size of the blockchain is approximately 1 gigabyte. +The maximum number of transactions recorded in a single block was 386. With a block time of 10 seconds, +we can confirm that Pactus blockchain can support up to 30 transactions per second (TPS), +which is a reasonable number for TPS. Based on real-time statistics available at realtps, +we can see that Pactus is among the top 10 blockchains in terms of TPS.

+ +

At this point, the development team decided to end the Testnet-0 and move on to the next one, +Testnet-1. We are planning to run the Testnet-1 to prepare for the MainNet launch. +We will provide updates on our progress and share the details of the new Testnet soon.

+ +

As promised, participants in Testnets will be given priority as validators for the MainNet, +and will receive bounty tokens from the bootstrap accounts to set up their validator. +We are grateful to all those who participated in Testnet-0, and we encourage them to join our next Testnet to +help us improve Pactus. +As a community-based project, we rely on the support of our community members, and we value any help we receive.

]]>
What is a Testnet?2023-03-01T00:00:00+00:002023-03-01T00:00:00+00:00https://pactus.org/2023/03/01/what-is-testnetMainnet vs Testnet? + +

If you have ever wondered what Testnet is and how it is different from Mainnet, read this article to the end to find out!

+ +

Mainnet and Testnet are two widely used terminologies in the Blockchain ecosystem; +so it is important to understand the meaning and differences while working in the industry or +following announcements of the Blockchain projects like Pactus.

+ +

Here’s a quick explanation: +Before the actual live version of a Blockchain network that is used for real transactions, +functions and smart-contracts (which is referred as Mainnet), +there is a test version of the Blockchain network for testing purposes (which is referred as Testnet). +In Testnet, a safe environment is provided to help developers experiment and test their applications, +and make sure that everything functions smoothly in the Mainnet version.

+ +

Testnet

+ +

A Testnet is a simulation of a Blockchain, in which developers can test all the functionalities of +their Blockchain network without risking their assets and convenience of end-users. +Using Testnet, any possible error, bug or malfunctions can be fixed before the Mainnet launch. +Testnet also can be an experimental environment for new features, updates and upgrades. +So several Testnet networks of the same version or newer version of the Mainnet can be implemented on the roadmap.

+ +

What are use cases of Testnet?

+ +

A secure environment to test development ideas and updates. +So many features and minor details in Pactus project have been successfully developed so far using the Testnet; such as:

+ +
    +
  • extra details and information on Pactus-GUI;
  • +
  • well-functioning Pactus Blockchain explorer to access transactions and block details;
  • +
  • Upgrades that led to decreasing the size of the Pactus network
  • +
+ +

Providing a safe testing ground for resolve scalability and security problems, as well as decentralization issues. +Pactus network is also a secure and purely decentralized network. However in the last updates during the Testnet, +developers are now able to decrease the database size by approximately 10% without compromising performance. +They did it by utilizing block height instead of hash to store blocks within the database. (you can find out more +here).

+ +

Testing new versions, patches and features on Testnet. it is vital for enhancing the security, load testing, +Blockchain migration, integration tests, and etc. This is why you can now use the latest version of Pactus-GUI +that works like clockwork and is extremely secure.

+ +

Testing the functions of cryptocurrency without disrupting the Mainnet. In the Testnet of Pactus Blockchain, +you as a user or validator can use all the features to send, receive, bond or unbond your assets in the Pactus-GUI.

+ +

Development and simulation of smart contract features and DApps. Note that many Blockchain projects like Pactus, +can be used as smart-contract platforms. So the Testnet can be designed in different stages to test and improve +different applications of the network.

+ +

Please note that after a certain period of time, when developers get satisfied with the functionality and debugging process, +they launch Mainnet. Mainnet has its own independent genesis blocks; +so the assets and addresses that users use in Testnet are not valid inside the new Mainnet Blockchain anymore. +In fact the whole Blockchain network starts working from the scratch and users and validators start to +work with real tokens and transactions instead of the simulated ones. But since Testnet has an important effect +on the health and improvement of the network, in Pactus Blockchain, we have several advantages +for the people who join the Testnet.

+ +

Why should you join the Testnet?

+ +

There are different contributors in a Blockchain network; +Some people are developers and programmers that use the Testnet to contribute, enhance and lead the project to a better future. +Testnet is actually vital for them to perform their changes and try their innovations and ideas.

+ +

But you might also be an end user; you might want to either be a validator and stake your assets to earn more Pactus coins, +or you might want to learn how to use the network for future personal applications. Either way, +you might find it handy to give it a try and be familiar with Pactus-GUI and its different features.

+ +

However, there is another advantage for end users who join the Testnet. +While using the network, running a node or testing the Pactus-GUI in Testnet period, you are contributing to +the community to find improvement potentials, that’s why there are more advantages contemplated for the Testnet users; +Soon our Mainnet will be launched and also Pactus network will be announced and listed in well-known exchanges. +As an early contributor, you will have the advantage of getting some extra initial tokens at the beginning of Mainnet launch. +So that you can use it to run a validator node and earn more from staking your assets. This airdrop is considered +for every individual who installs Pactus-GUI and starts a node in Testnet.

+ +

There are other positive conditions you may experience as an early contributor.

+ +
    +
  • Advanced and very responsive support for your issues (we dedicate more time to provide you with solutions)
  • +
  • Embracing your suggestions, improvement ideas, needs and information you may require to have a better user experience.
  • +
]]>
Pactus 0.9.1 released2022-11-24T00:00:00+00:002022-11-24T00:00:00+00:00https://pactus.org/2022/11/24/release-0-9-1Overview + +

Pactus Blockchain Release Version 0.9.1 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Download

+ +

This version has been implemented for Testnet-0 and is preparing for the upcoming Mainnet launch. +To start using the Pactus Blockchain Testnet-0, +you can download the latest version from download page +and join the Testnet.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +
    +
  • Blocks can be fully decoded when queried in gRPC
  • +
  • The HTTP module now uses gRPC module, making node configuration simpler by removing the CapnP module
  • +
  • Reducing the blockchain size by saving blocks by number instead of hash
  • +
  • The wallet can hold unconfirmed transactions
  • +
  • The wallet can use different gRPC servers
  • +
  • The GUI displays committee information
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

]]>
Dev meeting2022-10-30T00:00:00+00:002022-10-30T00:00:00+00:00https://pactus.org/2022/10/30/dev-meetingMeeting Summary + +

The meeting took place on 30 October 2022, at 2:00 PM UTC via Google Meet, +with team members from different time zones joining to discuss key aspects of the Pactus project.

+ +

In memory of Mahsa Amini

+ +

The meeting started in memory of Mahsa Amini. +We in the Pactus family stand in solidarity with courageous people who are fighting for equality, equity and freedom in Iran.

+ +

Woman Life Freedom

+ +

Launching Block explorer

+ +

The beta version of the block explorer has been launched 🚀 and is now available at +https://pacscan.org.

+ +

Nagaraj explained the block explorer and some of the features.

+ +

Project road map

+ +

Project road map was discussed.

+ +

IdeaKita pitch deck

+ +

Ali presented the Pactus pitch deck for the IdeaKita in Malaysia. +The IdeaKita program, under the Malaysia Digital Economy Corporation (MDEC), is designed to +support entrepreneurs and startups in Malaysia.

+ +

Latest development progress

+ +

The latest pull requests were reviewed:

+ +]]>
\ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 000000000..b49fa1719 --- /dev/null +++ b/index.html @@ -0,0 +1,445 @@ + + + + + + + + + + + + + Home | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+
+ +
+
+
+
+
Pactus blockchain
+
Building a decentralized future together!
+
+ +
+
+
+ +
+
+
+

Run a node

+ Download the latest version of Pactus blockchain, create your wallet, and start syncing with the network. Pactus is designed to be lightweight and user-friendly, making it simple to operate. + + +
+
+ Run a node +
+
+ +
+
+ Get some coins +
+
+

Get some coins

+ Once your node is up and running, you will need to obtain some coins in order to become a validator. You can join our community and receive some stake coins free. + + +
+
+ +
+
+

Become a validator

+ By staking some coins, your node will be transition into a validator, and subsequently, every time you propose a block, you will be rewarded with one new coin as a block reward. + +
+ Learn +
+
+
+ Become a validator +
+
+ +
+
+ Make Pactus better +
+
+

Make Pactus better

+ There are many ways you can support Pactus and help it grow. Let's work together to make Pactus even better! + + +
+
+
+ +
+
+
+

Our Partners

+
+
+
+ + sensifia + +
+
+ + ipminter + +
+
+
+
+
+
+ + +
+ + diff --git a/learn/blockchain/account/index.html b/learn/blockchain/account/index.html new file mode 100644 index 000000000..fe1af7993 --- /dev/null +++ b/learn/blockchain/account/index.html @@ -0,0 +1,635 @@ + + + + + + + + + + + + + Account | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Account

+ +

An account is an entity that is identified by a unique address, +which can send transactions on the blockchain.

+ +

Account Structure

+ +

The account structure is 12 bytes long and consists the following fields:

+ + + + + + + + + + + + + + + + + + +
SizeField
4 bytesNumber
8 bytesBalance
+ +
    +
  • Number is a sequential and unique number assigned to each account when it is created for the first time. +The account number is used to calculate the state hash of the blockchain.
  • +
  • Balance holds the balance of the account, which is the amount of Pactus coins held by the account.
  • +
+ +

Treasury Account

+ +

The Treasury account is a special account that is defined at the genesis time. +The Treasury account holds the total supply of Pactus coins, which is fixed at 21 million coins, +and each coin is divided into 1 billion units.

+ +

In each block, one coin from the treasury account is transferred to the proposer account +as block reward.

+ +

This block reward serves as an incentive for validators to propose and validate new blocks on the blockchain. +As a result, the total number of Pactus coins in circulation increases gradually over time as new blocks +are added to the blockchain.

+ +
+
+
+ + + + + diff --git a/learn/blockchain/address/index.html b/learn/blockchain/address/index.html new file mode 100644 index 000000000..c480c2be5 --- /dev/null +++ b/learn/blockchain/address/index.html @@ -0,0 +1,637 @@ + + + + + + + + + + + + + Address | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Address

+ +

An address is a unique identifier that is used to send and receive transactions on the Pactus blockchain. +It is represented as a string of 42 alphanumeric characters and always begins with the letters “pc1”. +Here is an example of an address on the Pactus blockchain:

+ +
pc1p4e92hx0erqyx939crndvthvpn7qcdhefc9r6s7
+
+ +

Address Structure

+ +

An address in the Pactus blockchain is made up of 21 bytes and it is derived from the public key. +The first byte of the address specifies the address type, +while the remaining 20 bytes represent the hash of the public key. +The hash function used is RIPEMD-160, +which is applied after Blake2b): +The resulting byte array is then converted into a bech32m1 string.

+ +

Pactus address structure

+ +

Address Type

+ +

The address type specifies the type of the address and its defined as below:

+ +
    +
  • 0: Treasury address
  • +
  • 1: Validator address
  • +
  • 2: Account address
  • +
+ +

Treasury Address

+ +

The Treasury address on the Pactus blockchain is a fixed address that is defined as follows:

+ +
TreasuryAddress: 000000000000000000000000000000000000000000
+
+ +

The address type for the Treasury address is set to zero, which +means there is no key associated with the Treasury address. +The remaining characters of the address are all zeros.

+ + + +
+
+
+ + + + + diff --git a/learn/blockchain/block/index.html b/learn/blockchain/block/index.html new file mode 100644 index 000000000..296a8b194 --- /dev/null +++ b/learn/blockchain/block/index.html @@ -0,0 +1,753 @@ + + + + + + + + + + + + + Block | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Block

+ +

In the Pactus, a block is a set of data that contains a header, the certificate of the previous block +and list of the transactions. +Once a block comes with a valid certificate, it is committed and added to the blockchain, and +the certificate will be included in the next block. +A committed block is immutable, and any modifications to the block will invalidate the certificate.

+ +

Pactus blockchain

+ +

Block Header

+ +

The block header is a data structure in the Pactus blockchain that contains important information about +the block.

+ +

The block header is 138 bytes long and consists the following fields:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SizeField
1 byteVersion
4 bytesTimestamp
32 bytesPrevious Block Hash
32 bytesState Hash
48 bytesSortition Seed
21 bytesProposer Address
+ +
    +
  • Version is used to track the software or protocol upgrade, and the current block version is set to 1.
  • +
  • Timestamp is the time of the block as the number of seconds since January 1, 1970 (Unix Epoch).
  • +
  • Previous Block Hash is the hash of the previous block in the blockchain.
  • +
  • State Hash is the state hash of the blockchain at this block. +The State Hash ensures that all nodes in the network have the same state.
  • +
  • Sortition Seed is a verifiable and unpredictable seed data used by +the sortition algorithm.
  • +
  • Proposer Address is the address of the validator who created and proposed the block.
  • +
+ +

Block Certificate

+ +

A block certificate is a proof of commitment for the block in the Pactus blockchain. +It is the result of the Pactus consensus algorithm and ensures that the block has been agreed upon by committee members.

+ +

The block certificate consists the following fields:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SizeField
4 bytesHeight
2 bytesRound
VariantCommitters
VariantAbsentees
48 bytesSignature
+ +
    +
  • Height is the height of the certified block.
  • +
  • Round is the consensus round in which this certificate was issued. +If a proposer fails to propose a block in one round, another validator takes over as the proposer, +and the round number is increased.
  • +
  • Committers is the list of validator numbers in the committee for the current certificate..
  • +
  • Absentees is the list of validator numbers that are absent in the committee.
  • +
  • Signature is the signature for the certificate that ensures the majority of the committee members have validated and +signed the proposed block.
  • +
+ +

Transactions

+ +

Each block in the Pactus blockchain contains a list of transactions. +The maximum number of transactions in a block is determined by the +consensus parameters, and currently set to 1000. +The first transaction in each block is the reward transaction. +Once a block is committed and added to the blockchain, all the transactions inside the block will be executed. +This means that the state of the blockchain will be updated based on the transactions in the committed block.

+ +

Block Hash

+ +

The block hash is a unique identifier for each block, which is computed by hashing the following data:

+ +
    +
  • Block header data (138 bytes)
  • +
  • Previous certificate hash (32 bytes)
  • +
  • Merkle root hash of transactions (32 bytes)
  • +
  • Number of transactions (variant)
  • +
+ +

The previous certificate hash and the Merkle root hash of transactions are included in the block hash to +ensure that they cannot be modified. +The block hash is used to link the blocks together in the blockchain.

+ +

FAQ

+ +

Is there any empty block in Pactus?

+ +

There is no completely empty block in Pactus. +Each block contains at least one transaction, which is the reward transaction.

+ +

How are certificates issued?

+ +

In the Pactus blockchain, a validator called a Proposer is responsible for collecting all transactions and +creating a block every 10 seconds. +The Proposer broadcasts the proposed block to other validators inside the committee. +Other validators verify the proposed block, and if it is valid, they cast their votes in favor of the proposed block by +signing the combination of the block hash and the consensus round. +More details about the consensus mechanism can be found in the +consensus protocol document.

+ +

To issue a valid certificate, signatures from validators who hold more than ⅔ of the stake in +the committee are required. +Once enough votes are collected, the signatures are aggregated and combined into a single signature, and +the certificate is issued.

+ +

How are certificates verified?

+ +

To verify a certificate for a block, the block hash is computed, and +the aggregated public key can be formed using the Committers and Absentees list. +Then, the signature can be verified using the aggregated public key and +the aggregated signature inside the certificate.

+ +
+
+
+ + + + + diff --git a/learn/blockchain/cryptography/index.html b/learn/blockchain/cryptography/index.html new file mode 100644 index 000000000..b0415d83b --- /dev/null +++ b/learn/blockchain/cryptography/index.html @@ -0,0 +1,616 @@ + + + + + + + + + + + + + Cryptography | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Cryptography

+ +

The Pactus blockchain employs various advanced cryptographic algorithms, including hashing and signature schemes, +to protect user data and transactions.

+ +

Hashing Algorithm

+ +

Pactus uses a hashing algorithm called Blake2b. +This algorithm is known for being a fast and secure way of creating unique digital fingerprints of data.

+ +

Digital Signature

+ +

To ensure secure transactions, Pactus uses a signature scheme called +BLS (Boneh–Lynn–Shacham) +threshold signature for cryptographic signing and verification.

+ +

Signature Aggregation

+ +

One of the advantages of BLS signatures is signature aggregation. BLS individual signatures can be +combined into one single aggregated signature, so that the overall size does not grow beyond one +signature.

+ +

Non-Malleability

+ +

BLS signatures have an important property called non-malleability, +which means that it is impossible to generate two valid signatures for the same message. +In other words, each message has a unique signature, and signatures cannot be altered without invalidating the signature.

+ +
+
+
+ + + + + diff --git a/learn/blockchain/genesis/index.html b/learn/blockchain/genesis/index.html new file mode 100644 index 000000000..9469c3327 --- /dev/null +++ b/learn/blockchain/genesis/index.html @@ -0,0 +1,637 @@ + + + + + + + + + + + + + Genesis | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Genesis

+ +

The Pactus blockchain starts from scratch, with no pre-existing accounts or pre-allocated tokens. +Its starting point is known as the genesis block, which is created by the bootstrap validators.

+ +

Bootstrapping

+ +

The Pactus blockchain starts with four bootstrap validators. +These bootstrap validators do not have any stake, however their voting power is set to one within the consensus algorithm. +Their primary role is to initiate the blockchain during a brief period known as the bootstrapping phase. +As the bootstrapping phase progresses, these validators are able to earn rewards, +which they can later use to invite other validators to join the network.

+ +

Once the network reaches 21 validators, the bootstrap validators will retire, and +the blockchain will be secured by other validators.

+ +

Genesis Block

+ +

The genesis block is the first block in the Pactus blockchain, and it is created by the bootstrap validators. +This block marks the beginning of the blockchain and serves as the foundation for subsequent blocks.

+ +

The previous block hash in the genesis block sets to 0, +indicating that it has no predecessor. +Additionally, the genesis block does not have a previous certificate.

+ +

Genesis Information

+ +

In Pactus, the Genesis Information is pre-defined and indicates the initial state of the network. +These parameters are hardcoded into the project and include:

+ +
    +
  • Genesis Time This is the time when the genesis block should be created. +The bootstrap validators must be operational before this time.
  • +
  • Consensus Parameters: The initial consensus parameters +are defined at genesis time and ensure that the entire network operates within the same configuration. +These consensus parameters are discussed in detail in the consensus section of the documentation.
  • +
  • Treasury Account: The treasury account +is defined at the genesis time and holds the total supply of the Pactus blockchain, +21 million coins. Each coin is divided into 1 billion units.
  • +
  • Bootstrap Validators The bootstrap validators are defined by their public keys.
  • +
+ +

FAQ

+ +

Where can I see the Genesis Information?

+ +

You can find the pre-defined Genesis Information for the Testnet of the Pactus blockchain in the genesis.json file, +which is located in the project repository, here.

+ +
+
+
+ + + + + diff --git a/learn/blockchain/incentive/index.html b/learn/blockchain/incentive/index.html new file mode 100644 index 000000000..d44a2abe4 --- /dev/null +++ b/learn/blockchain/incentive/index.html @@ -0,0 +1,656 @@ + + + + + + + + + + + + + Incentive | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Incentive

+ +
+

The incentive may help encourage nodes to stay honest.

+ +

Satoshi Nakamoto

+
+ +

In Pactus, rewards are given to validators for proposing and validating new blocks on the blockchain. +These rewards serve as an incentive for validators to participate in the consensus process and +maintain the security and integrity of the network.

+ +

Flat Reward

+ +

To better understand the incentive model in Pactus, let’s compare it with the Bitcoin reward model. +This comparison will help to understand how the incentive model works in Pactus.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PactusBitcoin
Consensus engine is Proof of StakeConsensus engine is Proof of Work
Exactly every 10 seconds one block is mintedAround every 10 minutes one block is mined
Total supply is 21,000,000 coinTotal supply is 21,000,000 coin
Always one coin per blockInitial block reward is 50 coin
No halvingHalving happens every 4 years
+ +

The halving mechanism in Bitcoin rewards early contributors more significantly. +However, in a Proof-of-Stake blockchain, this mechanism can lead to wealth centralization, +as early validators gain too much power based on their staked coins.

+ +

To promote fairer block rewards, Pactus has introduced a simple and straightforward incentive model called the “Flat Reward.” +In this model, the block reward remains constant at one coin per block and does not change over time.

+ +

Rewards in Bitcoin

+ +

Rewards in Pactus

+ +

Coin Distribution

+ +

In Pactus, the coin distribution is linear. This linear distribution is a direct result of the Flat Reward system. +Unlike other blockchains that have a curved distribution, Pactus maintains a consistent coin distribution.

+ +

Coin distribution in Bitcoin

+ +

Coin distribution in Pactus

+ +
+
+
+ + + + + diff --git a/learn/blockchain/serialization/index.html b/learn/blockchain/serialization/index.html new file mode 100644 index 000000000..6dff9e8e6 --- /dev/null +++ b/learn/blockchain/serialization/index.html @@ -0,0 +1,741 @@ + + + + + + + + + + + + + Data Serialization | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Data Serialization

+ +

Data serialization is the process of converting data into a format that can be easily stored or transmitted over a network. +It typically involves encoding data into a sequence of bytes, which can later be decoded to +reconstruct the original data structure. +Pactus has two methods for data serialization: Deterministic serialization and CBOR serialization:

+ +

Deterministic Serialization

+ +

Pactus uses a deterministic serialization for the deterministic data like blocks and transactions. +The serialization format for different types of data is listed in the table below:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Data TypeSize (bytes)Description
uint81An 8 bits unsigned integer
int81An 8 bits signed integer
uint162A 16 bits unsigned integer
int162A 16 bits signed integer
uint324A 32 bits unsigned integer
int324A 32 bits signed signed integer
uint648A 64 bits unsigned integer
int648A 64 bits signed signed integer
VarIntVariableA compact representation of an unsigned integer.
VarByteVariableA variable length bytes
VarStringVariableA variable length string
Address2121 bytes of address data
Hash323232 bytes of hash data
+ +

VarInt

+ +

Variable length integer (VarInt) is encoded by 7-bit chunks. The MSB indicates whether there are +more octets (1) or it is the last one (0). It means 0x00 to 0x7f encoded in 1 byte, 0x80 to +0x3fff encoded in 2 bytes, …

+ +

Example:

+ +
0x0f -> 0f
+0x1000 -> 8020
+0xffff -> ffff03
+0xffffff -> ffffff07
+
+ +

VarByte

+ +

Variable length byte (VarByte) is encoded as a variable length integer (VarInt) containing the +length of the array followed by the bytes themselves: VarInt(len(bytes)) || bytes

+ +

VarString

+ +

Variable length string (VarString) is encoded as a variable length integer (VarInt) containing the +length of the string followed by the bytes that represent the string +itself:VarInt(len(str)) || str

+ +

Byte Order

+ +

All the internal number representation are in little-endian byte order.

+ +

Example

+ +

Here is an example of a block header data that encoded using deterministic serialization:

+ +
+ + +

CBOR Serialization

+ +

For non-deterministic data, such as networking messages, Pactus uses +“Concise Binary Object Representation” or CBOR. +CBOR is a binary data serialization format that is widely used in various application, +including IoT, web services, security, and automotive, due to its compact representation and efficient parsing.

+ +

CBOR Me!

+ +

cbor.me +is an online tool for encoding and decoding CBOR data, offering developers an easy way to test and +validate their CBOR data without having to set up a local environment.

+ +

Example

+ +

Here is an example of a vote message that encoded using CBOR.

+ +
+ + + +
+
+
+ + + + + diff --git a/learn/blockchain/state-hash/index.html b/learn/blockchain/state-hash/index.html new file mode 100644 index 000000000..368e49a83 --- /dev/null +++ b/learn/blockchain/state-hash/index.html @@ -0,0 +1,648 @@ + + + + + + + + + + + + + State Hash | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

State Hash

+ +

The State Hash is used to ensure the integrity of the data in the Pactus blockchain. +It serves as a unique identifier or fingerprint of the current state of the blockchain, +allowing all nodes to verify that their data matches that of the other nodes. +This helps to prevent any tampering or inconsistencies in the data, ensuring the accuracy and consistency of the blockchain.

+ +

Merkle Tree

+ +
+

In cryptography and computer science, a hash tree or Merkle tree is a tree in which every leaf node +is labelled with the cryptographic hash of a data block, and every non-leaf node is labelled with +the cryptographic hash of the labels of its child nodes. Hash trees allow efficient and secure +verification of the contents of large data structures.

+ +

From Wikipedia

+
+ +

A Hash tree or Merkle tree is a data structure that used by many blockchains to solve this problem: +“How can data be securely stored and verified in a decentralized network?”

+ +

By using a Merkle tree, nodes can easily verify that they store the same data +without having to share the entire dataset. Additionally, this helps to prevent any tampering with the data, +as any changes made to the data would cause inconsistencies in the Merkle tree and +can be easily detected by the network.

+ +

State Merkle Trees

+ +

In Pactus, the Merkle tree is used to verify the state of the blockchain in each block. +The state hash in each block is calculated by taking the hash of two Merkle trees: +the accounts Merkle tree and the validators Merkle tree. +Each leaf in these trees contains the hash of the associated account or validator. +By using the state hash, all nodes in the network can ensure they have the same data stored.

+ +

State hash

+ +

Scalability of Merkle Tree

+ +

Using a Merkle tree to calculate the state of the blockchain can be challenging +because when the number of accounts is large, calculating the root hash can be difficult. +In other words, a simple Merkle tree may not be scalable because calculating all the leaf +and node hashes requires a significant amount of computation.

+ +

In Pactus, all accounts and validators have unique and sequential numbers. +This means that each account and validator has a dedicated account number that helps us to +calculate the hash of leaf nodes in the Merkle tree. +By using these account numbers, we can ensure that the position of the leaf nodes in +the Merkle tree is always the same. +This approach allows us to avoid rebuilding the Merkle tree whenever an account or validator’s state changes. +Instead, we can save the previous Merkle tree and recalculate the parent hashes by +fetching neighbor hashes as needed. +This helps to ensure scalability and reduces the computational resources required for recalculating the Merkle tree.

+ +

Account tree

+ +

In this example, only account 6 has been updated. +By locating the corresponding leaf node in the existing Merkle tree and +traversing the tree towards the root node, we can calculate new root hash. +This approach has a complexity of \(O(log n)\), making it efficient for large numbers of accounts.

+ +
+
+
+ + + + + diff --git a/learn/blockchain/validator/index.html b/learn/blockchain/validator/index.html new file mode 100644 index 000000000..81e73fd6d --- /dev/null +++ b/learn/blockchain/validator/index.html @@ -0,0 +1,644 @@ + + + + + + + + + + + + + Validator | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Validator

+ +

A Validator is an entity that participates in the consensus process by sharing its votes. +Validators get rewarded for creating new blocks, and to become a Validator, +they must “bond” or lock up a certain amount of coins as stake. +The amount of stake held by validators determines their power in the consensus.

+ +

Validator Structure

+ +

The Validator structure is 120 bytes long and consists the following fields:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SizeField
96 bytesPublic Key
4 bytesNumber
8 bytesStake
4 bytesLast Bonding Height
4 bytesUnbonding Height
4 bytesLast Joined Height
+ +
    +
  • Public Key is the Validator’s public key.
  • +
  • Number is a sequential and unique number assigned to each validator when it is created for the first time. +The validator number is used to calculate the state hash of the blockchain.
  • +
  • Stake holds the Validator’s stake or the amount of Pactus coins locked or “staked” by the Validator.
  • +
  • Bonding Height is the last block height that the validator has bonded their stake.
  • +
  • Unbonding Height is the block height that the validator’s stake is unbonded.
  • +
  • Last Joined Height is the block height that the validator joined the committee.
  • +
+ +
+
+
+ + + + + diff --git a/learn/consensus/committee/index.html b/learn/consensus/committee/index.html new file mode 100644 index 000000000..002a00b48 --- /dev/null +++ b/learn/consensus/committee/index.html @@ -0,0 +1,732 @@ + + + + + + + + + + + + + Committee | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Committee

+ +

The committee is a group of 21 validators responsible for generating new blocks. +Validators in the committee participate in the consensus algorithm by casting votes, +with their voting power determined by their stake. +While in the committee, validators cannot send Bond or Unbond transactions, +meaning their voting power remains the same. +The members of the committee changes randomly over time through Sortition transactions. +Each block can contain zero or more Sortition transactions.

+ +

These rules are applied when committing sortition transactions:

+ +
    +
  1. A minimum of ⅔ of the total stake must be maintained in the committee.
  2. +
  3. If a validator is already in the committee, they will remain in the committee.
  4. +
  5. If a validator is not in the committee, the oldest validator will exit the committee.
  6. +
  7. Each validator should stay in committee at least for 21 blocks.
  8. +
+ +

Proposer Selection

+ +

Proposer selection within the committee operates on a deterministic, clockwise rotation system. +If a validator is unable to propose, for any reason, it stays within the committee, but +the proposer’s role shifts to the next validator in the committee.

+ +

Proposer selection

+ +

Adding Validators to the Committee

+ +

When a new validator joins the committee, they take a position before the current proposer. +After the addition of a new validator, the committee adjusts to maintain the total number of validators at 21. +This is achieved by removing the oldest validator from the committee, +i.e., the one that has been in the committee for the longest time.

+ +

Adding Validators to the Committee

+ +

Security of the Committee

+ +

For an adversary to take control of the committee, they would need to control more than ⅔ of the stake within the committee. +To assess the security of the committee, let’s assume all validators in the committee have the same voting power. +In this case, an adversary would need to control more than ⅔ of the validators in the committee.

+ +

Now, let’s imagine an adversary holds 10% of the total stake. +As a result, one of their validators can enter the committee every 10 blocks. +In the first 10 blocks, one of the adversary’s validators enters the committee. +In the next 10 blocks, another validator enters the committee, giving the adversary two validators within the committee. +In the subsequent 10 blocks, another validator enters, but at the same time, the first validator leaves the committee. +Therefore, an adversary with 10 10% of the total stake can have, on average, two validators in a committee of 21 validators.

+ +

Using the Poisson distribution, +we can estimate the probability of an adversary controlling ⅔ of the committee:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Adversarial StakeCommittee size⅔+ of committeeAdversarial committee membersProbability of controlling ⅔+
15%21153\(5.46 \times 10^{-07}\)
15%55357\(3.34 \times 10^{-14}\)
15%996714\(1.41 \times 10^{-24}\)
10%21152\(3.39 \times 10^{-09}\)
10%55355\(1.90 \times 10^{-18}\)
10%99679\(2.91 \times 10^{-35}\)
5%21151\(2.81 \times 10^{-13}\)
5%55352\(4.50 \times 10^{-31}\)
5%99674\(1.09 \times 10^{-56}\)
+ +

FAQ

+ +

How can one know when a validator has joined the committee?

+ +

The height at which the validator joined the committee is recorded as the “Last Joined Height” field in +the validator structure. +Once a validator enters the committee, this field is set to the current height it +evaluated the sortition proof.

+ +

Can a validator within the committee run the sortition algorithm?

+ +

A validator within the committee can run the sortition algorithm. +If they generate a valid sortition transaction, the height of their entry into the committee is set +to the current block height, allowing them to stay in the committee for a longer period.

+ +
+
+
+ + + + + diff --git a/learn/consensus/parameters/index.html b/learn/consensus/parameters/index.html new file mode 100644 index 000000000..02d1f26da --- /dev/null +++ b/learn/consensus/parameters/index.html @@ -0,0 +1,630 @@ + + + + + + + + + + + + + Consensus Parameters | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Consensus Parameters

+ +

Consensus parameters are a set of configurable settings that determine how the Pactus blockchain operates. +These parameters are agreed upon by all validators in the network, +ensuring that validators behave in the same way and that the network operates consistently.

+ +

Here is the list of the consensus parameters:

+ +
    +
  • Block Version: The version number of the blockchain protocol. +This is set to 1.
  • +
  • Block Time: The time interval in seconds between the creation of two consecutive blocks. +This is set to 10 seconds, which means that a new block is created every 10 seconds.
  • +
  • Committee Size The number of validators in the committee. +This is set to 21 validators.
  • +
  • Block Reward The fixed reward amount given to the validator who successfully creates and proposes a new block. +This is set to 1,000,000,000, which is equivalent to one coin.
  • +
  • Time-to-Live Interval: The number of blocks that a transaction can remain unprocessed before +it is removed from the transaction pool. +This is set to 8640 blocks, which is almost one day.
  • +
  • Bond Interval: The minimum number of blocks that must elapse after a validator has submitted a bond transaction +before they can participate in the consensus process and join the validator committee. +This is set to 360 blocks, which is almost one hour.
  • +
  • Unbond Interval: The minimum number of blocks that must elapse after a validator has submitted +an unbond transaction before +they can withdraw their staked coins. +This is set to 181440 blocks, which is almost 21 days.
  • +
  • Sortition Interval: The maximum number of blocks that a sortition transaction can remain valid and be included +in a block. +This is set to 7 blocks.
  • +
  • Fee Fraction: The fraction of transaction value that must be paid in order for a transaction to be included in a block. +This is set to 0.0001 PAC, meaning that 0.01% of transaction value are awarded to the block proposer.
  • +
  • Minimum Fee: The minimum transaction fee that must be paid. +This is set to 1,000 (satoshi), which is equivalent to 0.000001 PAC coin.
  • +
  • Maximum Fee: The maximum transaction fee that must be paid. +This is set to 1,000,000 (satoshi), which is equivalent to 0.001 PAC coin.
  • +
  • Maximum Stake: The maximum amount of coins that can be staked by a validator. +This is set to 1,000,000,000,000 (satoshi), which is 1000 PAC coins.
  • +
  • Minimum Stake: The minimum amount of coins that can be staked by a validator. +This is set to 1,000,000,000 (satoshi), which is 1 PAC coins.
  • +
+ +
+
+
+ + + + + diff --git a/learn/consensus/proof-of-stake/index.html b/learn/consensus/proof-of-stake/index.html new file mode 100644 index 000000000..cf9834815 --- /dev/null +++ b/learn/consensus/proof-of-stake/index.html @@ -0,0 +1,651 @@ + + + + + + + + + + + + + Solid State Proof of Stake | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Proof of Stake

+ +

Proof of Stake is a way to secure a blockchain through requesting users to stake some amount of their coins. +These stakeholders, called validators, are responsible to collect, validate and add transactions to the blockchain. +The validators will be rewarded with native coins.

+ +

Unlike Proof of Work, which is based on competition, Proof of Stake is based on collaboration. +Validators work together to manage the expansion of the blockchain. +A Proof of Stake blockchain becomes more decentralized and secure as more validators participate in it.

+ +

An example

+ +

To understand how Proof of Stake works, imagine a community bank without any centralized authority. +In this bank, users decide to run it together. +Some of these users volunteer to collect, validate, and record transactions, +ensuring that everything runs smoothly.

+ +

These volunteers, known as validators, must temporarily lock or freeze some of their money as a stake. +This stake can’t be transferred or used. +The more money a validator stakes, the more influence they have in the system.

+ +

From time to time, one of the validators is chosen by the others to collect all the recent transactions, +bundle them together, and send a copy to the other validators. +If a supermajority of the validators agree with the proposed bundle by signing it, +the bundle will be committed to the bank’s ledger.

+ +

In this system, validators have no incentive to behave maliciously or dishonestly. +If they do, they risk harming the bank’s reputation and the value of their own stakes as well.

+ +

Delegated Proof of Stake

+ +

In Proof of Stake, if the number of validators increases, +the voting time will also increase, and this can lead to an inefficient consensus mechanism. +In our community bank example, running the bank becomes more difficult as the number of validators increases.

+ +

To solve this problem, some blockchains use the concept of “delegators”. +In Delegated Proof of Stake, users entrust their stakes to a small group of “delegates”. +These delegates are responsible for validating transactions and creating blocks. +The number of delegates is limited to ensure accountability and efficiency in the validation process.

+ +

Delegated Proof of Stake

+ +

The delegation model puts a lot of trust in the hands of a small number of delegates, +which goes against the principle of “don’t trust, verify”.

+ +

Consensus without delegation or Solid State Proof of Stake (SSPoS)

+ +

Pactus introduced a mechanism that doesn’t rely on delegation, we call it Solid State Proof of Stake. +It utilizes a dynamic committee of validators +that are responsible for creating new blocks. +The size of the committee is fixed, but the members of the committee are randomly changed. +On the other hand, the number of validators outside the committee is unlimited, allowing anyone to +become a validator by staking coins.

+ +

At each block, validators participate in a sortition algorithm +by generating a random number between zero and the total staked coins. +If the number is less than the validator’s stake, they can enter the committee and replaces the oldest committee member.

+ +

Pactus Solid State Proof of Stake

+ +

The chance of entering the committee depends on the validator’s stake and luck. +But on average, one validator should enter the committee in each block.

+ +
+
+
+ + + + + diff --git a/learn/consensus/protocol/index.html b/learn/consensus/protocol/index.html new file mode 100644 index 000000000..ce49acf2e --- /dev/null +++ b/learn/consensus/protocol/index.html @@ -0,0 +1,852 @@ + + + + + + + + + + + + + Consensus protocol | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+ This post is obsolete. check here for more information. +
+ +

Consensus Protocol

+ +

Pactus consensus algorithm is a state machine +replication with Byzantine fault tolerance. +The Pactus consensus algorithm starts with the block creation phase. +In this phase one validator acts as the proposer. The proposer collects all the transactions, +creates a block, and proposes it to other validators.

+ +

When a proposed block is seen by other validators, they validate the block and +cast their vote for the proposed block, moving to the “prepare” state.

+ +

If more than two-thirds (⅔) of the total stakes cast their votes, the proposed block becomes prepared, +and validators move to the “precommit” state.

+ +

If, once again, more than two-thirds (⅔) of the total stakes cast their vote for the prepared block, +the block is committed, and the next proposer is ready to propose a new block. This cycle repeats every 10 seconds.

+ +

If a proposer fails to propose in any round, other validators start the “change proposer” phase to +decide to change the proposer for this round.

+ +

Pactus consensus states

+ +

The Algorithm

+ +

There are \(R = 3f+1\) validators. where \(f\) is the maximum +number of validators that may be faulty or byzantine. For example, if there is one faulty validator, +the resiliency of the algorithm is optimal if we have at least \(3\) non-faulty +validators. So the minimum number of validators should be \(3+1=4\).

+ +

We denote a message as \(\langle m \rangle\) tuple and a signed message by node \(i\) as +\(\langle m \rangle_{\sigma_i}\).

+ +

Pactus consensus algorithms has two phases: Block creation phase and change proposer phase.

+ +

Block Creation

+ +

The block creation phase in Pactus consensus algorithm includes these three steps1: +Propose, Prepare and Precommit. +The protocol proceeds in rounds \(r = 0, 1, 2, \ldots\).

+ +

Propose Step

+ +

In each round \(r\), one validator is the proposer and the others act as validators. +The proposer \(p\) collects transactions and creates a proposal block \(B\). It signs and +broadcasts a proposal message with the proposed block piggybacked to all the validators. +Propose message has this form:

+ +\[\langle \langle \text{PROPOSE},h,r \rangle_{\sigma_p}, B \rangle\] + +

where:

+ +
    +
  • \(B\) is the proposed block
  • +
  • \(h\) indicates the block height
  • +
  • \(r\) is an assigned round number, which is zero for the first round
  • +
+ +

Prepare Step

+ +

If validator \(i\) accepts the proposal, it enters prepare step and signs and +broadcasts prepare message to all other validators. Otherwise, it does nothing. +The prepare message has this form:

+ +\[\langle \text{PREPARE},h,r,d \rangle_{\sigma_i}\] + +

where:

+ +
    +
  • \(d\) is digest or hash of proposed block \(B\)
  • +
+ +

If validator \(i\) received \(2f+1\) prepare messages from other +validators (including its own), it becomes prepared and enters to precommit step.

+ +

Precommit Step

+ +

In precommit step, validator \(i\) signs and broadcasts precommit message to +the other validators. +The precommit message has this form:

+ +\[\langle \text{PRECOMMIT},h,r,d \rangle_{\sigma_i}\] + +

Each validator executes and commits block \(b\) after receiving +\(2f+1\) precommit messages (including its own) and becomes committed.

+ +

Block Announcement

+ +

Each validator that receives a valid proposal and with \(2f+1\) precommit messages from other +validators (including its own), can create a block-announce messages and broadcasts it to the network. +The block-announce message has this form:

+ +\[\langle \text{BLOCK-ANNOUNCE} ,h ,r ,B, C \rangle\] + +

where:

+ +
    +
  • \(C\) is the quorum certificate for the precommit step.
  • +
+ +

Validators can move to the next height and clear the message logs after receiving valid +block-announce message, even if their timer has expired.

+ +

The picture below shows the operation of the algorithm in the normal case. validator 1 is the +proposer and validator 4 is faulty.

+ +

Normal execution

+ +

Change Proposer

+ +

The change-proposer provides liveness by allowing the system to make progress when the proposer fails. +The change-proposer phase is triggered by timeouts that +prevent validators from waiting indefinitely for the proposal to execute.

+ +

If the timer of a validator expires in round \(r\), the validator starts a change-proposer phase. +The change-proposer phase is an Asynchronous Byzantine Binary Agreement (ABBA) 2 that is biased toward zero (No). +It means that during this phase, even if they don’t have the proposal, honest validators may decide to vote zero +if they obtain a valid quorum Certificate for the prepare step.

+ +

If a supermajority of the validators decide to change the proposer, they move to round r+1r+1. However, +if they decide not to change the proposer, they will return to the prepare state and, +since a supermajority of the validators attested to a valid proposal, they can commit the proposed block.

+ +

The change proposer phase in Pactus consensus algorithm includes these three steps: +Pre-vote, Main-vote and Decide +The protocol proceeds in rounds \(r_{cp} = 0, 1, 2, \ldots\).

+ +

Pre-vote Step

+ +

In Pre-vote step each validator casts a pre-vote for a value \(b \in \{0, 1\}\) +and broadcasts pre-vote message to the network. +The pre-vote message has this form:

+ +\[\langle\langle \text{CP:PRE-VOTE},h,r,r_{cp},b \rangle_{\sigma_i}, justification\rangle\] + +

The first round is a special round and each validator starts with an initial value. +If the validator’s timer has expired in the prepare step, its initial value is zero, +and if the validator’s timer has expired in the precommit step, its initial value is one.

+ +\[b = \begin{cases} +1 & \text{if timer expired in prepare step,} \\ +0 & \text{if timer expired in precommit step.} +\end{cases}\] + +

In the next rounds, each validator select \(2f+1\) properly justified main-votes from round \(r − 1\) and

+ +\[b = \begin{cases} +0 & \text{if there is a main-vote for 0,} \\ +1 & \text{if there is a main-vote for 1,} \\ +0 (biased) & \text{if all main-votes are abstain.} +\end{cases}\] + +

These pre-votes must be justified with a appropriate justification. +For the first round, if the validator’s timer has expired in the prepare step, the justification is \(nil\) , +and if the validator’s timer expired in the precommit step, +the justification is the proper quorum certificate for the prepare step at round \(r\).

+ +

In the next rounds, a pre-vote for \(b\) may be justified in two ways:

+ +
    +
  • Hard: that is the quorum certificate for \(\langle \text{CP:PRE-VOTE},h,r,r_{cp}-1,b \rangle\)
  • +
  • Soft: that is the quorum certificate for \(\langle \text{CP:MAIN-VOTE},h,r,r_{cp}-1,abstain \rangle\)
  • +
+ +

Main-vote Step

+ +

After collecting \(2f+1\) valid and justified pre-votes, each validator casts a main-vote \(v \in \{0, 1, abstain\}\) +and broadcasts main-vote message to the network. +The main-vote message has this form:

+ +\[\langle\langle \text{CP:MAIN-VOTE},h,r,r_{cp},v \rangle_{\sigma_i}, justification\rangle\] + +

The main-vote value \(v\) determine as below:

+ +\[v = \begin{cases} +0 & \text{if there are 2f+1 pre-vote for 0,} \\ +1 & \text{if there are 2f+1 pre-vote for 1,} \\ +abstain & \text{if there are pre-votes for 0 and 1.} +\end{cases}\] + +

These main-votes must be justified with a appropriate justification. +A main-vote for \(v\) may be justified in two ways:

+ +
    +
  • Non-conflicting: that is the quorum certificate for \(\langle \text{CP:PRE-VOTE},h,r,r_{cp},b \rangle\)
  • +
  • Conflicting: that consists of the justifications for the two conflicting pre-votes.
  • +
+ +

Decide Step

+ +

After collecting \(2f+1\) valid and justified main-votes, each validator examines these votes. If all +votes are for a value \(b \in \{0, 1\}\), then the validator decides \(b\), but continues to +participate in the protocol for one more round. Otherwise, the validator proceeds to the next round \(r_{cp}+1\).

+ +

Comparison

+ +

Pactus consensus protocl doesn’t have any lcoking mechanism or +checkpointing and there will at most one valid proposla per round. +This ensures that each round can begin with a new proposal.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ProtocolNormal caseFaulty case
StepsComplexityLockingCheckpointing
PBFT3$$O(n^2)$$NoYes
Tendermint3$$O(n^2)$$YesNo
HotStuff4$$O(n)$$YesNo
Pactus3$$O(n^2)$$NoNo
+ +
+ +

References:

+ + + +
+
+
+ + + + + diff --git a/learn/consensus/sortition/index.html b/learn/consensus/sortition/index.html new file mode 100644 index 000000000..6f74b6c62 --- /dev/null +++ b/learn/consensus/sortition/index.html @@ -0,0 +1,748 @@ + + + + + + + + + + + + + Sortition Algorithm | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Sortition Algorithm

+ +

The sortition algorithm is an important part of the Pactus blockchain, responsible for the fair, transparent +and random selection of validators to join the committee. +It utilizes a Verifiable Random Function, or VRF for short, to generate a verifiable random number.

+ +

The generated random number should be in the range of 0 to the total staked coins. +If validators can prove that their generated number is less than their stake, +they can send the sortition transaction. +Once a sortition transaction is included in a block, the validator will join the committee, +and the oldest validator in the committee will leave it.

+ +

Verifiable Random Function

+ +

Verifiable Random Function is a pseudo-random function that the owner of key \(s\) can evaluate \(v = f_s(x)\) and also provides +\(proof_{x}\) efficiently proving that \(v\) is correct. We call such a mathematical +object a verifiable pseudo-random function, VRF for brevity 1.

+ +

Pactus uses the BLS signature scheme as the source of VRF. +Since BLS signatures are unique, +the hash of a BLS signature can be used to produce a secure and verifiable random number.

+ +

The VRF takes three parameters:

+ +
    +
  1. The secret key of the validator
  2. +
  3. The sortition seed
  4. +
  5. The total stake of the blockchain.
  6. +
+ +

Once the VRF is executed, it produces an index with a proof. +The index is a number between zero and the total staked coins, and the proof allows other validators to verify the correctness +of the generated index.

+ +

The pseudocode below demonstrates the evaluation of the VRF for the sortition algorithm:

+ +\[\begin{align*} +& \textbf{function} \ VRF(sk, seed, total\_stake) \\ +& \qquad pk \gets P_{BLS}(sk) \\ +& \qquad proof \gets S_{BLS}(sk, seed \| pk) \\ +& \qquad rnd \gets H(proof) \\ +& \qquad index \gets \frac{(rnd \times total\_stake)}{2^{256}} \\ +& \qquad \\ +& \qquad \textbf{return} \ index, proof \\ +& \textbf{end function} +\end{align*}\] + +

where:

+ +
    +
  • \(sk\) is the secret key of the validator
  • +
  • \(seed\) is the sortition seed
  • +
  • \(total\_stake\) is the total stake of the blockchain
  • +
  • \(P_{BLS}\) is a cryptographic function that derives the public key from the secret key for the BLS signature
  • +
  • \(S_{BLS}\) is a cryptographic function that signs a message with the secret key for the BLS signature.
  • +
  • \(H\) is a cryptographic hash function that generates a number between \(0\)to \(2 ^{256}\)
  • +
  • \(\|\) denotes the concatenation of two values
  • +
+ +

To verify a sortition proof, both the validator’s public key and stake are required:

+ +\[\begin{align*} +& \textbf{function} \ verifyVRF(pk, seed, proof, stake, total\_stake) \\ +& \qquad \textbf{if} \ V_{BLS}(pk, seed \| pk, proof) = True \ \textbf{then} \\ +& \qquad \qquad rnd \gets H(proof) \\ +& \qquad \qquad index \gets \frac{(rnd \times total\_stake)}{2^{256}} \\ +& \qquad \\ +& \qquad \qquad \textbf{return} \ index \leqslant stake \\ +& \qquad \textbf{else} \\ +& \qquad \qquad \textbf{return} \ False \\ +& \qquad \textbf{end if} \\ +& \textbf{end function} +\end{align*}\] + +

where:

+ +
    +
  • \(V_{BLS}\) is a cryptographic function used to verify a signed message using the BLS signature scheme
  • +
+ +

There is no need to send \(index\) alongside \(proof\) because the +result should be less than the validator’s stake, and the validator’s stake is known at each block.

+ +

Sortition Seed

+ +

The sortition algorithm relies on a random and publicly verifiable seed that cannot be manipulated by adversaries. +Otherwise, adversaries may select a seed that favors the selection of corrupt users.

+ +

To prevent this, the BLS signature scheme is used to generate the sortition seed. +Since BLS signatures are unique and deterministic, adversaries cannot generate more than one valid signature per block. +In each block, the block proposer generates a new sortition seed based on the previous seed using the following function:

+ +\[\begin{align*} +& \textbf{function} \ generateSeed(sk, prev\_seed) \\ +& \qquad \textbf{return} \ S_{BLS}(sk, H(prev\_seed)) \\ +& \textbf{end function} +\end{align*}\] + +

Since the proposer’s public key is known, the seed for the next block can be easily verified. +If the seed is invalid, the proposed block will be rejected. +The verification function is as follows:

+ +\[\begin{align*} +& \textbf{function} \ verifySeed(pk, prev\_seed, seed) \\ +& \qquad \textbf{return} \ V_{BLS}(pk, H(prev\_seed), seed) \\ +& \textbf{end function} +\end{align*}\] + +

The sortition seed for the genesis block set to 0.

+ +

Sortition Probability

+ +

The Sortition probability refers to the expected number of validators that may join the committee in each block, +assuming all validators are actively online and executing the sortition algorithm.

+ +

The probability of a validator \(i\) being selected depends on their stake relative to the total stake in the system:

+ +\[p_i=\frac{S_i}{S_t}\] + +

where:

+ +
    +
  • \(p_i\) is the probability of validator \(i\) being selected
  • +
  • \(S_i\)​ is the stake of validator \(i\)
  • +
  • \(S_t\)​ is the total stake of all validators.
  • +
+ +

Therefore, the expected number of validators joining the committee at each block can be represented as:

+ +\[P=\sum_{i=1}^{n}{p_i}=\sum_{i=1}^{n}{\frac{S_i}{S_t}}=\frac{S_1+S_2+\ldots+S_n}{S_t}\] + +

where \(n\) is the total number of validators. We know that \(S_t={S_1+S_2+\ldots+S_n}\). Therefore we will have:

+ +\[P=\frac{S_t}{S_t}=1\] + +

Thus, on average, we expect one validator to join the committee at each block. +In practice, the actual number of validators joining the committee in each block +may differ due to the randomness in the sortition algorithm, or the possibility of some validators being offline.

+ +

FAQ

+ +

How is the total staked coin calculated?

+ +

The total staked coin in each block is calculated by summing the staked coins of all active validators. +An active validator is a validator that has not yet unbonded.

+ +

How is the oldest validator determined?

+ +

The height at which the validator joined the committee is recorded as the “Last Joined Height” field in +the validator structure. +The validator with the lowest “Last Joined Height” is considered the oldest.

+ + + +
+
+
+ + + + + diff --git a/learn/consensus/specification/index.html b/learn/consensus/specification/index.html new file mode 100644 index 000000000..0c1be80f2 --- /dev/null +++ b/learn/consensus/specification/index.html @@ -0,0 +1,628 @@ + + + + + + + + + + + + + Consensus specification | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Consensus Specification

+ +

Developing distributed and concurrent systems is a complex task that requires careful attention to the details. +Testing such systems is challenging because it’s difficult to simulate all possible states, +including those that can happen due to system failures, network latency, and other factors. +This makes it hard to ensure that the system behaves correctly in all circumstances.

+ +

Therefore it’s essential to have a proactive approach that involves modeling the system’s behavior in a formal way. +Such an approach can help identify potential issues before they occur, saving time and preventing costly flaws.

+ +

TLA+

+ +

TLA+ is a formal specification language developed by +Leslie Lamport based on the idea of +specifying systems using simple mathematics. +It is used for designing, modelling, documentation, and verification of programs, especially concurrent and +distributed systems. +TLA+ and its tools are useful for eliminating fundamental design errors, which are hard to find and +expensive to correct in code.

+ +

To know more about TLA+, check The TLA+ Home Page.

+ +

Pactus Consensus Spec

+ +

Pactus consensus specification +has written in TLA+ format. It includes all invariants that can be held +in every state of every execution that the protocol allows. The TLA+ specification is compiled into +PDF file.

+ +

Safety Proof

+ +

By defining some invariants we can ensure the safety of the consensus +protocol in any possible and +distinct state, and therefore we have the informal safety proof of the Pactus consensus protocol using TLA+.

+ +

Liveness Proof

+ +

Checking the liveness is not easy, but with defining some constraints, we have the informal proof of +liveness of Pactus consensus protocol using TLA+.

+ +
+
+
+ + + + + diff --git a/learn/index.html b/learn/index.html new file mode 100644 index 000000000..33aac9d52 --- /dev/null +++ b/learn/index.html @@ -0,0 +1,469 @@ + + + + + + + + + + + + + Learn | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+

Learn

+ +

Here you can find the technical documentations for the Pactus project.

+ +

Table Of Content

+ + + +
+
+
+
+ + + + + diff --git a/learn/smart-contract/storage/index.html b/learn/smart-contract/storage/index.html new file mode 100644 index 000000000..3f17cf593 --- /dev/null +++ b/learn/smart-contract/storage/index.html @@ -0,0 +1,705 @@ + + + + + + + + + + + + + Storage as file | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Storage as file

+ +

Motivation

+ +

Ethereum friendly blockchains keep storage in a separate key/value database per request. This has +some drawbacks:

+ +
    +
  • Since there is a global database that stores all storages, the storage key is a combination of +\(Key_{contract} + Key_{item}\) that is a bit messy.
  • +
  • Storage data can’t have any meta data, because they are scattered in different places in the +key/value database.
  • +
  • Storages per smart contract can’t be Merklized. Ethereum came with another solution to calculate +the hash of the whole storage. They defined a hexary Patricia tree that is quite +suboptimal.
  • +
+ +

Here we discuss how we can address the above issues by dedicating a separate file as Storage +File per smart contract. In this scenario, users should purchase the storage file with required +capacity before deploying the smart contract. Once the purchase is done, a separate empty file will +be created and dedicated for the user. The size of the file is the same as the purchase size. For +example users can purchase 10 MB or 120 MB of storage files depending on their need and renew them +yearly.

+ +

Structure

+ +

Each storage file has three parts: Header, ByteCodes and contract storage.

+ +

Storage file structure

+ +

The Header of the storage file keeps some meta data like storage file index, last payment time, +total storage size, etc. In the ByteCodes section the byte codes of the smart contract will be saved +and in the storage section, the actual storage of the smart contract will be stored.

+ +

Storage APIs

+ +

Smart contracts can only change data in storage sections. To achieve that the smart contract +executer (virtual machine) should introduce these APIs:

+ +
/// This API requests the host to read the slice of `data` from the storage file
+/// at the given `offset`.
+fn read(&self, offset: u32, data: &mut [u8]) -> Result<(), HostError>;
+
+/// This API requests the host to write the slice of `data` into the storage file
+/// at the given `offset`
+fn write(&self, offset: u32, data: &[u8]) -> Result<(), HostError>;
+
+
+ +

These APIs are similar to SLoad and SStore opcodes in Ethereum Virtual Machine (EVM). But +instead of key and value, they accept offset and data parameters.

+ +

Storage Allocation

+ +

In order to allocate storage space safely and efficiently user can use these predefined methods:

+ +
/// Allocates storage space with the specific `length` and returns the
+/// offset of allocated space in the storage file.
+pub fn allocate(&self, length: u32) -> Result<Offset, Error>;
+
+/// Deallocates the storage space at the specific `offset` and `length`
+pub fn deallocate(&self, offset: Offset, length: u32) -> Result<(), Error>;
+
+ +

Storage Stack

+ +

There is a fixed stack with 32 elements at the beginning of the storage . The first item in this +stack is reserved and used for managing deallocated storage spaces. Users can use other stack items +to keep the offset of the allocated spaces for the smart contract variables.

+ +

Storage stack

+ +

Data Collections

+ +

Usually in smart contracts developers are interested in data collections like Search Trees or Hash +Tables to look up values by the associated keys. Most programming languages come up with some +builtin collections, however we can’t use them in smart contracts because they use RAM that is +inconsistent. However we can have storage equivalent of these data collections that instead of +dealing with memory they are dealing with the storage file. You can naively consider storage as +dedicated consistent memory for the smart contract.

+ +

Right now these data collection is available to use inside the smart contract: StorageVector, +StorageString, StorageLinkedList, StorageBST and StorageHasTable.

+ + + +

Merklizing Storage

+ +

To make sure all the nodes have the same state we need to calculate the hash of all storage files. +Merkle tree can help us to easily calculate the root hash very fast. We need two Merkle trees, one +for calculating the root hash of each storage file and the second for calculating the root hash of +all storage files.

+ +

Single storage file Merkle tree

+ +

We can divide each file into small chunks of data and calculate the hash of each chunk once. Since +we know exactly which chunk has changed after executing the smart, contract we can easily +reconstruct the tree and calculate the merkle root again.

+ +

Whole storage Merkle tree

+ +

Each file has a unique index. With using that index we can make sure that the position of the leaf +nodes in the Merkle tree is always the same. The same technique we used for calculating the +state hash.

+ +

Storage Merkle tree

+ +

Example

+ +

As an example we have implemented the ERC20 smart contract based on this idea. The implementation +can be found here

+ +

Testing

+ +

One of the consequences of Storage as File is that testing smart contracts becomes easier. What we +need is only to mock the storage file.

+ +
+
+
+ + + + + diff --git a/learn/transaction/bond/index.html b/learn/transaction/bond/index.html new file mode 100644 index 000000000..b3446047e --- /dev/null +++ b/learn/transaction/bond/index.html @@ -0,0 +1,636 @@ + + + + + + + + + + + + + Bond Transaction | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Bond Transaction

+ +

Bond transaction is used to bond stake to a validator. +If the validator does not exist, it will be created. +Once a bond transaction committed, the validator cannot participate in the +sortition algorithm for 1 hour. +This is called the “bond interval” and is defined in the +consensus parameter.

+ +

Payload Structure

+ +

The bond transaction has a payload consists the following fields:

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
SizeField
21 bytesSender address
21 bytesReceiver address
96 bytes (optional)Public key
8 bytesAmount
+ +
    +
  • Sender address is the address of the sender account.
  • +
  • Receiver address is the address of the receiver validator.
  • +
  • Public key is the validator’s public key. If the validator does not exist yet, +the public key should be set, otherwise it should left empty.
  • +
  • Amount is the amount of coins that should be staked or bonded.
  • +
+ +
+
+
+ + + + + diff --git a/learn/transaction/fee/index.html b/learn/transaction/fee/index.html new file mode 100644 index 000000000..09fc8aafc --- /dev/null +++ b/learn/transaction/fee/index.html @@ -0,0 +1,638 @@ + + + + + + + + + + + + + Transaction Fee | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Transaction Fee

+ +

Transaction fees in the Pactus blockchain are calculated using a percentage-based fee model. +The fee is a percentage of the transferred amount, within a minimum and maximum range. +The percentage, minimum fee, and maximum fee parameters are part of the blockchain +consensus parameters.

+ +

The formula to calculate the transaction fee is as follows:

+ + + +\[\begin{align*} +fee = amount \times percentage \\ +\\ +fee = +\begin{cases} + & fee_{min} & \textbf{ if } \ fee < fee_{min} \\ + & \\ + & fee_{max} & \textbf{ if } \ fee > fee_{max} \\ + & \\ + & fee & \textbf{otherwise} + \end{cases} +\end{align*}\] + +

Examples

+ +

Currently, the fee fraction or percentage is set to 0.01%, the minimum fee is set to 0.000,001 coin, +and the maximum fee is set to 0.001 coin.

+ +
    +
  • If Alice wants to transfer 2 coins to Bob, she needs to pay 0.000,2 coins as transaction fee.
  • +
  • If Alice wants to transfer 0.000,2 coins to Bob, she needs to pay 0.000,001 coins as transaction fee.
  • +
  • If Alice wants to transfer 20 coins to Bob, she needs to pay 0.001 coins as transaction fee.
  • +
+ +
+
+
+ + + + + diff --git a/learn/transaction/format/index.html b/learn/transaction/format/index.html new file mode 100644 index 000000000..6938fa263 --- /dev/null +++ b/learn/transaction/format/index.html @@ -0,0 +1,675 @@ + + + + + + + + + + + + + Transaction Format | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Transaction Format

+ +

Transactions in Pactus consists the following fields:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SizeField
1 byteVersion
4 bytesLock Time
8 bytesFee
VariantMemo
1 bytePayload Type
VariantPayload Data
48 bytesSignature
96 bytesPublic Key
+ +
    +
  • Version is the version of the transaction format. Different versions may have different fields or +a different layout, and the current transaction version is set to 1.
  • +
  • Lock Time specifies the block number at which the transaction can be unlocked.
  • +
  • Fee contains the fee paid by the sender to the network for processing the transaction. +The fee is calculated based on the percentage fee model.
  • +
  • Memo is an optional message that can be included in the transaction. +The message can be used to provide additional information about the transaction or to communicate with the recipient. +The maximum size of the memo is 64 characters that is defined in the +consensus parameters
  • +
  • Payload Type specifies the type of the transaction payload. +Depending on the payload type, the payload data field is decoded differently.
  • +
  • Payload Data contains the actual data payload of the transaction. +The payload data varies depending on the payload type.
  • +
  • Signature contains a cryptographic signature created by the sender using their private key. +The signature is used to ensure that the transaction has not been tampered with and that it was indeed created by the sender.
  • +
  • Public Key contains the public key of the sender. +The public key is used to verify that the sender has the authority to create the transaction. +The sender’s address should be derived from this public key.
  • +
+ +

Payload Type

+ +

The payload type field determines the format of the payload data field in the transaction. +Different payload types have different formats for the payload data. +The following are the supported transactions in Pactus blockchain:

+ +
    +
  1. Transfer transaction
  2. +
  3. Bond transaction
  4. +
  5. Sortition transaction
  6. +
  7. Unbond transaction
  8. +
  9. Withdraw transaction
  10. +
+ +

Transaction ID

+ +

The Transaction ID is a unique identifier for a transaction on the blockchain. +It is generated by taking the hash of the transaction data without including the public key and signature fields.

+ +
+
+
+ + + + + diff --git a/learn/transaction/sortition/index.html b/learn/transaction/sortition/index.html new file mode 100644 index 000000000..97ef6dffe --- /dev/null +++ b/learn/transaction/sortition/index.html @@ -0,0 +1,626 @@ + + + + + + + + + + + + + Sortition Transaction | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Sortition Transaction

+ +

Sortition transaction is used to enter a validator +in the committee. +By committing a sortition transaction, the validator will enter the committee. +Sortition transactions are valid for 7 blocks, which is defined as “sortition interval” in the +consensus parameters.

+ +

Payload Structure

+ +

The sortition transaction has a payload consists the following fields:

+ + + + + + + + + + + + + + + + + + +
SizeField
21 bytesAddress
48 bytesSortition Proof
+ +
    +
  • Address is the address of the validator that evaluated the sortition
  • +
  • Sortition Proof is the proof of evaluating the sortition
  • +
+ +

Validators do not need to pay a fee for sortition transactions, and the fee should be set to zero.

+ +
+
+
+ + + + + diff --git a/learn/transaction/transfer/index.html b/learn/transaction/transfer/index.html new file mode 100644 index 000000000..b099d3f66 --- /dev/null +++ b/learn/transaction/transfer/index.html @@ -0,0 +1,640 @@ + + + + + + + + + + + + + Transfer Transaction | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Transfer Transaction

+ +

Transfer transaction is used to transfer coins between the accounts. +If the receiver account does not exist, it will be created.

+ +

Payload Structure

+ +

The transfer transaction has a payload consists the following fields:

+ + + + + + + + + + + + + + + + + + + + + + +
SizeField
21 bytesSender address
21 bytesReceiver address
8 bytesAmount
+ +
    +
  • Sender address is the account address that transfers the amount
  • +
  • Receiver address is the account address that receives the amount
  • +
  • Amount is the amount of coins that should be transferred
  • +
+ +

Reward Transaction

+ +

The reward transaction is the first transaction in each block. There is only one reward transaction +per block, and it has the same format as a transfer transaction, but with zero fees and no signature.

+ +

The sender address is the Treasury address, +and the receiver address is defined by the block proposer. +The amount of the reward transaction should be equal to the +block reward plus transaction fees. +This amount will go to the proposer account as a block reward. +Therefore, in each block, one coin from the +Treasury account transfers to +the proposer account as a block reward.

+ +
+
+
+ + + + + diff --git a/learn/transaction/unbond/index.html b/learn/transaction/unbond/index.html new file mode 100644 index 000000000..baff4f766 --- /dev/null +++ b/learn/transaction/unbond/index.html @@ -0,0 +1,617 @@ + + + + + + + + + + + + + Unbond Transaction | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Unond Transaction

+ +

Unbond transaction is used to unbond a validator. +An unbonded validator cannot participate in the sortition algorithm anymore, and after 21 days, the stake can be withdrawn. +This is called the “unbond interval” and is defined in the consensus parameter.

+ +

Payload Structure

+ +

The unbond transaction has a payload consists the following field:

+ + + + + + + + + + + + + + +
SizeField
21 bytesValidator address
+ +
    +
  • Validator address is the address of validator that is unbonded.
  • +
+ +
+
+
+ + + + + diff --git a/learn/transaction/withdraw/index.html b/learn/transaction/withdraw/index.html new file mode 100644 index 000000000..77786bf5b --- /dev/null +++ b/learn/transaction/withdraw/index.html @@ -0,0 +1,626 @@ + + + + + + + + + + + + + Withdraw Transaction | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Withdraw Transaction

+ +

Withdraw transaction is used to withdraw the staked coins from an unbonded +validator

+ +

Payload Structure

+ +

The withdraw transaction has a payload consists the following fields:

+ + + + + + + + + + + + + + + + + + + + + + +
SizeField
21 bytesSender address
21 bytesReceiver address
8 bytesAmount
+ +
    +
  • Sender address is the address of the sender validator.
  • +
  • Receiver address is the address of the receiver account.
  • +
  • Amount is the amount of coins that should be withdrawn
  • +
+ +
+
+
+ + + + + diff --git a/mstile-150x150.png b/mstile-150x150.png new file mode 100644 index 000000000..6c2539a90 Binary files /dev/null and b/mstile-150x150.png differ diff --git a/robots.txt b/robots.txt new file mode 100644 index 000000000..0097513b3 --- /dev/null +++ b/robots.txt @@ -0,0 +1 @@ +Sitemap: https://pactus.org/sitemap.xml diff --git a/safari-pinned-tab.svg b/safari-pinned-tab.svg new file mode 100644 index 000000000..43c436d31 --- /dev/null +++ b/safari-pinned-tab.svg @@ -0,0 +1,27 @@ + + + + +Created by potrace 1.14, written by Peter Selinger 2001-2017 + + + + + diff --git a/site.webmanifest b/site.webmanifest new file mode 100644 index 000000000..c00b17332 --- /dev/null +++ b/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-256x256.png", + "sizes": "256x256", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 000000000..c8089a7bd --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,217 @@ + + + +https://pactus.org/2022/08/29/dev-meeting.html +2022-08-29T00:00:00+00:00 + + +https://pactus.org/2022/09/04/dev-meeting.html +2022-09-04T00:00:00+00:00 + + +https://pactus.org/2022/09/18/dev-meeting.html +2022-09-18T00:00:00+00:00 + + +https://pactus.org/2022/09/20/release-0-9-0.html +2022-09-20T00:00:00+00:00 + + +https://pactus.org/2022/09/24/testnet-0-launched.html +2022-09-24T00:00:00+00:00 + + +https://pactus.org/2022/10/30/dev-meeting.html +2022-10-30T00:00:00+00:00 + + +https://pactus.org/2022/11/24/release-0-9-1.html +2022-11-24T00:00:00+00:00 + + +https://pactus.org/2023/03/01/what-is-testnet.html +2023-03-01T00:00:00+00:00 + + +https://pactus.org/2023/04/21/testnet-0-concluded.html +2023-04-21T00:00:00+00:00 + + +https://pactus.org/2023/05/08/release-0-10-0.html +2023-05-08T00:00:00+00:00 + + +https://pactus.org/2023/05/09/testnet-1-launched.html +2023-05-09T00:00:00+00:00 + + +https://pactus.org/2023/05/29/release-0-11-0.html +2023-05-29T00:00:00+00:00 + + +https://pactus.org/2023/06/19/release-0-12-0.html +2023-06-19T00:00:00+00:00 + + +https://pactus.org/2023/07/01/release-0-13-0.html +2023-07-01T00:00:00+00:00 + + +https://pactus.org/2023/07/05/testnet-500-validators.html +2023-07-05T00:00:00+00:00 + + +https://pactus.org/2023/07/09/dev-meeting.html +2023-07-09T00:00:00+00:00 + + +https://pactus.org/2023/08/01/testnet-1-concluded.html +2023-08-01T00:00:00+00:00 + + +https://pactus.org/2023/08/22/dev-report.html +2023-08-22T00:00:00+00:00 + + +https://pactus.org/2023/09/04/introduction-to-pips.html +2023-09-04T00:00:00+00:00 + + +https://pactus.org/2023/09/24/dev-report-pre-testnet-2.html +2023-09-24T00:00:00+00:00 + + +https://pactus.org/2023/09/28/how-sspos-works-in-simple-word.html +2023-09-28T00:00:00+00:00 + + +https://pactus.org/2023/10/15/release-0-15-0.html +2023-10-15T00:00:00+00:00 + + +https://pactus.org/2023/10/15/testnet-2-launched.html +2023-10-15T00:00:00+00:00 + + +https://pactus.org/2023/10/21/release-0-15-1.html +2023-10-21T00:00:00+00:00 + + +https://pactus.org/2023/10/21/release-0-15-2.html +2023-10-21T00:00:00+00:00 + + +https://pactus.org/blog/ + + +https://pactus.org/ + + +https://pactus.org/contributing/ + + +https://pactus.org/community/ + + +https://pactus.org/download/ + + +https://pactus.org/learn/blockchain/cryptography/ + + +https://pactus.org/learn/blockchain/state-hash/ + + +https://pactus.org/learn/blockchain/incentive/ + + +https://pactus.org/learn/blockchain/serialization/ + + +https://pactus.org/learn/blockchain/account/ + + +https://pactus.org/learn/blockchain/block/ + + +https://pactus.org/learn/blockchain/address/ + + +https://pactus.org/learn/blockchain/genesis/ + + +https://pactus.org/learn/blockchain/validator/ + + +https://pactus.org/learn/consensus/protocol/ + + +https://pactus.org/learn/consensus/parameters/ + + +https://pactus.org/learn/consensus/committee/ + + +https://pactus.org/learn/consensus/sortition/ + + +https://pactus.org/learn/consensus/specification/ + + +https://pactus.org/learn/consensus/proof-of-stake/ + + +https://pactus.org/learn/transaction/withdraw/ + + +https://pactus.org/learn/transaction/fee/ + + +https://pactus.org/learn/transaction/transfer/ + + +https://pactus.org/learn/transaction/format/ + + +https://pactus.org/learn/transaction/sortition/ + + +https://pactus.org/learn/transaction/bond/ + + +https://pactus.org/learn/transaction/unbond/ + + +https://pactus.org/learn/smart-contract/storage/ + + +https://pactus.org/learn/ + + +https://pactus.org/user-guides/use-wallet-cli/ + + +https://pactus.org/user-guides/run-pactus-cli/ + + +https://pactus.org/user-guides/run-pactus-docker/ + + +https://pactus.org/user-guides/run-pactus-gui/ + + +https://pactus.org/user-guides/send-transactions-gui/ + + +https://pactus.org/user-guides/ + + +https://pactus.org/about/roadmap/ + + +https://pactus.org/about/faq/ + + +https://pactus.org/about/what-is-pactus/ + + diff --git a/user-guides/index.html b/user-guides/index.html new file mode 100644 index 000000000..706ed2fc9 --- /dev/null +++ b/user-guides/index.html @@ -0,0 +1,358 @@ + + + + + + + + + + + + + User Guides | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+

User Guides

+ +

Here, you can find some guidance to help you use and interact with the Pactus blockchain.

+ +

Beginner

+ + + +

Advanced

+ + + +
+
+
+
+ + + + + diff --git a/user-guides/run-pactus-cli/index.html b/user-guides/run-pactus-cli/index.html new file mode 100644 index 000000000..7b212b850 --- /dev/null +++ b/user-guides/run-pactus-cli/index.html @@ -0,0 +1,595 @@ + + + + + + + + + + + + + How to run Pactus in Command Line mode? | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

How to run Pactus in Command Line mode?

+ +

Preface

+ +

Pactus can be run in different modes, including the command-line interface (CLI) and the graphical user interface (GUI). +This tutorial will guide you through the steps to run Pactus in CLI mode, suitable for advanced users.

+ +

Prerequisites

+ +

Before proceeding with the steps below, ensure that you have the following:

+ +
    +
  • A computer running Windows, macOS, or Linux
  • +
  • Suitable internet connection
  • +
+ +

Download

+ +

To get started, follow the steps below based on your operating system:

+ +

Windows: Download and extract the Pactus CLI file from +here.

+ +

Linux and macOS: You have two options:

+ +
    +
  • +

    Download and extract the Pactus CLI file from here.

    +
  • +
  • +

    Use the following command in the Terminal:

    +
  • +
+ +
curl --proto '=https' --tlsv1.2 -sSL  https://github.com/pactus-project/pactus/releases/download/v0.15.2/pactus_downloader.sh | sh
+
+ +

This command will download the CLI archive file, verify it, and extract it for you.

+ +

Once you have downloaded and extracted the Pactus CLI file, you can proceed to the next step.

+ +

Initializing the Node

+ +

Now you need to create a wallet and setup a working directory for your node. +A working directory is a place where you save blockchain data and wallets. +Open the Terminal and run the following command:

+ + +
+ +
+ +
./pactus-daemon init -w ~/pactus --testnet
+
+ +

This command creates your wallet and setup the working working directory at ~/pactus.

+ + +
+ +
+ +
./pactus-daemon init -w ~/pactus --testnet
+
+ +

This command creates your wallet and setup the working working directory at ~/pactus.

+ + +
+ +
+ +
pactus-daemon.exe init -w c:\pactus --testnet
+
+ +

This command creates your wallet and setup the working working directory at c:\pactus.

+ + +
+ +
+ +

Make sure you write down your 12-word mnemonic on a piece of paper to recover your wallet in the future +in case your computer is lost, damaged, or stolen.

+ +

The working directory contains:

+ +
    +
  • Default wallet
  • +
  • Genesis file
  • +
  • Config file
  • +
+ +

Feel free to explore the contents of these files as needed, particularly the config file. +The config file contains parameters that can customize your node.

+ +

Restoring the “Default Wallet”

+ +

If you ever need to restore your node, for instance on a new device, +you can use the --restore option followed by your mnemonic:

+ + +
+ +
+ +
./pactus-daemon init -w ~/pactus --testnet --restore "<your-mnemonic>"
+
+ +

Replace <your-mnemonic> with your previously noted mnemonic phrase. +This command will restore your wallet in the ~/pactus directory.

+ + +
+ +
+ +
./pactus-daemon init -w ~/pactus --testnet --restore "<your-mnemonic>"
+
+ +

Replace <your-mnemonic> with your previously noted mnemonic phrase. +This command will restore your wallet in the ~/pactus directory.

+ + +
+ +
+ +
pactus-daemon.exe init -w c:\pactus --testnet --restore "<your-mnemonic>"
+
+ +

Replace <your-mnemonic> with your previously noted mnemonic phrase. +This command will restore your wallet in the c:\pactus directory.

+ + +
+ +
+ +

Running the Node

+ +

Now you can start the node and sync with the network. Run the following command in the Terminal:

+ + +
+ +
+ +
./pactus-daemon start -w ~/pactus
+
+ + +
+ +
+ +
./pactus-daemon start -w ~/pactus
+
+ + +
+ +
+ +
pactus-daemon.exe start -w c:\pactus
+
+ + +
+ +
+ +

When the Pactus node starts running, it begins syncing with the network. +This process may take some time, as your node needs to download and verify the entire blockchain history. +Please be patient while your node syncs.

+ +

To become a validator and participate in the +consensus algorithm to earn rewards, you first need to +stake some coins. In the next +tutorial, +we will explain how to send a Bond transaction to become a validator.

+ +
+ +

By running a Pactus node, you contribute to the decentralization and security of the Pactus blockchain network. +Thank you for your participation!

+ + + + + +
+
+
+
+ + + + + diff --git a/user-guides/run-pactus-docker/index.html b/user-guides/run-pactus-docker/index.html new file mode 100644 index 000000000..0671f0262 --- /dev/null +++ b/user-guides/run-pactus-docker/index.html @@ -0,0 +1,524 @@ + + + + + + + + + + + + + How to run Pactus using Docker? | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

How to run Pactus using Docker?

+ +

Preface

+ +

Docker is a tool that simplifies the process of creating, deploying, and running applications using containers. +With containers, developers can bundle all the necessary parts of an application, including libraries and dependencies, +and deploy them as a single package.

+ +

In this document, we will guide you on how to run Pactus using Docker, step by step.

+ +

Prerequisites

+ +

The only thing you need is installing docker in your machine. +If you are using Windows please make sure you have installed WSL.

+ +

Docker Images

+ +

The Pactus docker images are available at Docker Hub. +You can pull the latest image with this command:

+ +
docker pull pactus/pactus
+
+ +

Initializing the node

+ +

Now you need to create a wallet and setup a working directory for your node. +A working directory is a place where you save blockchain data and wallets. +Open the Terminal and run the following command:

+ + +
+ +
+ +
docker run -it --rm -v ~/pactus/testnet:/pactus pactus/pactus init -w /pactus --testnet
+
+ +

This command creates your wallet and setup the working working directory at ~/pactus/testnet.

+ + +
+ +
+ +
docker run -it --rm -v ~/pactus/testnet:/pactus pactus/pactus init -w /pactus --testnet
+
+ +

This command creates your wallet and setup the working working directory at ~/pactus/testnet.

+ + +
+ +
+ +
docker run -it --rm -v c:\pactus\testnet:/pactus pactus/pactus init -w /pactus --testnet
+
+ +

This command creates your wallet and setup the working working directory at c:\pactus\testnet.

+ + +
+ +
+ +

Make sure you write down your 12-word mnemonic on a piece of paper to recover your wallet in the future +in case your computer is lost, damaged, or stolen.

+ +

The working directory contains:

+ +
    +
  • Default wallet
  • +
  • Genesis file
  • +
  • Config file
  • +
+ +

Feel free to take a look at these files.

+ +

Running the node

+ +

Now you can start the node and sync with the network. Run the following command in the Terminal:

+ + +
+ +
+ +
docker run -it -v ~/pactus/testnet:/pactus -p 8080:8080 -p 21777:21777 --name pactus-testnet pactus/pactus start -w /pactus
+
+ + +
+ +
+ +
docker run -it -v ~/pactus/testnet:/pactus -p 8080:8080 -p 21777:21777 --name pactus-testnet pactus/pactus start -w /pactus
+
+ + +
+ +
+ +
docker run -it -v c:\pactus\testnet:/pactus -p 8080:8080 -p 21777:21777 --name pactus-testnet pactus/pactus start -w /pactus
+
+ + +
+ +
+ +

To run pactus-testnet in background just add a -d flag in the command.

+ +

Hint: Remember to pass in your wallet passphrase as well with -p flag after /pactus.

+ +
docker run -it -v ~/pactus/testnet:/pactus -p 8080:8080 -p 21777:21777 -d --name pactus-testnet pactus/pactus start -w /pactus -p {YOUR_PASSPHRASE}
+
+ +
docker run -it -v c:\pactus\testnet:/pactus -p 8080:8080 -p 21777:21777 -d --name pactus-testnet pactus/pactus start -w /pactus -p {YOUR_PASSPHRASE}
+
+ +

You can stop/start docker:

+ +
docker stop pactus-testnet
+docker start pactus-testnet
+
+ +

Or check the logs:

+ +
docker logs pactus-testnet --tail 1000 -f
+
+ +
+ +

By running a Pactus node, you contribute to the decentralization and security of the Pactus blockchain network. +Thank you for your participation!

+ + + + + +
+
+
+
+ + + + + diff --git a/user-guides/run-pactus-gui/code_certificate_warning.png b/user-guides/run-pactus-gui/code_certificate_warning.png new file mode 100644 index 000000000..dc03ca8cc Binary files /dev/null and b/user-guides/run-pactus-gui/code_certificate_warning.png differ diff --git a/user-guides/run-pactus-gui/default_wallet.png b/user-guides/run-pactus-gui/default_wallet.png new file mode 100644 index 000000000..e9852b0f6 Binary files /dev/null and b/user-guides/run-pactus-gui/default_wallet.png differ diff --git a/user-guides/run-pactus-gui/index.html b/user-guides/run-pactus-gui/index.html new file mode 100644 index 000000000..0a8beffa6 --- /dev/null +++ b/user-guides/run-pactus-gui/index.html @@ -0,0 +1,491 @@ + + + + + + + + + + + + + How to run Pactus in Graphic Mode? | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

How to run Pactus in Graphic Mode?

+ +

Preface

+ +

Pactus can be run in different modes, including the command-line interface (CLI) and the graphical user interface (GUI). +This tutorial will guide you through the steps to run Pactus in GUI mode, suitable for beginner to advanced users.

+ +

Prerequisites

+ +

Before proceeding with the steps below, ensure that you have the following:

+ +
    +
  • A computer running Windows, macOS, or Linux
  • +
  • Suitable internet connection
  • +
+ +

Download

+ +

Download the Pactus GUI installer or archived file from +here.

+ +

Code certificate issue

+ +

Windows and macOS users may encounter a warning message stating that Pactus is an untrusted application. +This is because Pactus does not have a +code signing certificate.

+ +

Code certificate issue

+ +

A code certificate is a digital signature that verifies the identity and authenticity of the software publisher. +However, obtaining a code certificate is complex and expensive process, and requires registering a company and +passing Know Your Customer (KYC) checks.

+ +

As Pactus is an open-source and community-based application, we don’t have a code certificate yet. +Therefore, you can safely ignore the warning message and proceed with installing Pactus.

+ +

Installing

+ +

To install Pactus GUI, simply follow the on-screen instructions provided by the installer. +The process is straightforward and similar to installing any other application on your computer.

+ +

Installing Pactus

+ +

Initializing

+ +

When you run Pactus for the first time, a wizard dialog will appear to guide you through the wallet creation and +initialization process. This process consists of several steps:

+ +

Initialize Mode

+ +

On the first page, you will ask you how you want to create your wallet. +Select the option to “Create a new wallet from scratch” and proceed to the next page.

+ +

Initialize mode

+ +

Wallet Seed

+ +

The next page will display your wallet seed phrase, which consists of 12 words. +It is essential to securely back up this seed phrase, as it is required for wallet recovery +in case your computer is lost, damaged, or stolen.

+ +

Wallet seed

+ +

Warning: Keep your wallet seed phrase private and secure. +If someone else gains access to your seed phrase, they can control your wallet and funds.

+ +

Seed Confirmation

+ +

In this step, you will be asked to confirm your seed phrase. +Input the 12 words you received in the previous step into the dialog. +If the seed phrase is entered correctly, you will be able to proceed to the next page.

+ +

Seed confirmation

+ +

Wallet Password

+ +

On this page, you will be asked to set a password for your wallet. +Enter a strong password in the first dialog box and confirm it in the second one. +This password will be used to encrypt your wallet and protect it from unauthorized access.

+ +

Set wallet password

+ +

Note: Choose a strong password and keep it safe. +If you forget or lose your password, you will need your seed phrase to regain access to your wallet.

+ +

Number of Validators

+ +

Each node in the Pactus blockchain can run up to 32 validators, and each validator can stake up to +1000 coins. Here, you can define how many validators you want to create for your node. +Select the number of validators based on the amount of coins you want to stake.

+ +

Number of validators

+ +

If you want to stake more than 32,000 coins, you need to set up a new node.

+ +

Node Information

+ +

The last page of the initialization process shows the node information, such as the working directory, validator address, +and reward address. Review this information and click “Close” to complete the initialization process.

+ +

Node information

+ +

Upon closing the wizard dialog, your Pactus node will start running. You are now ready to use Pactus in GUI mode.

+ +

Running the Pactus Node

+ +

After completing the initialization process, you are ready to run the Pactus node. +Running a Pactus node allows you to synchronize with the network, enabling you to view and manage your wallet and +sending transactions.

+ +

Syncing with the Network

+ +

When the Pactus node starts running, it begins syncing with the network. This process may take some time, +as your node needs to download and verify the entire blockchain history. +Please be patient while your node syncs.

+ +

Syncing progress

+ +

Default Wallet

+ +

You can check the “Default Wallet” tab to access your wallet information. Please note that the displayed +information may not be accurate until the syncing process is complete.

+ +

Default Wallet tab

+ +

In the “Default Wallet” tab, you can view your account details, including your balance and +address information such as the validator and reward addresses. +Your computer acts as a node and is recognized by the validator address in the Pactus network. +The reward address is the account address where you collect the +rewards earned by participating in +the consensus algorithm and proposing new blocks.

+ +

To become a validator and participate in the +consensus algorithm to earn rewards, you first need to +stake some coins. In the next +tutorial, +we will explain how to send a Bond transaction to become a validator.

+ +
+ +

By running a Pactus node, you contribute to the decentralization and security of the Pactus blockchain network. +Thank you for your participation!

+ + + + + +
+
+
+
+ + + + + diff --git a/user-guides/run-pactus-gui/initialize_mode.png b/user-guides/run-pactus-gui/initialize_mode.png new file mode 100644 index 000000000..b049dadff Binary files /dev/null and b/user-guides/run-pactus-gui/initialize_mode.png differ diff --git a/user-guides/run-pactus-gui/installing.png b/user-guides/run-pactus-gui/installing.png new file mode 100644 index 000000000..dc9b2085f Binary files /dev/null and b/user-guides/run-pactus-gui/installing.png differ diff --git a/user-guides/run-pactus-gui/node_information.png b/user-guides/run-pactus-gui/node_information.png new file mode 100644 index 000000000..0cf2abe0d Binary files /dev/null and b/user-guides/run-pactus-gui/node_information.png differ diff --git a/user-guides/run-pactus-gui/number_of_validators.png b/user-guides/run-pactus-gui/number_of_validators.png new file mode 100644 index 000000000..8f4f401bb Binary files /dev/null and b/user-guides/run-pactus-gui/number_of_validators.png differ diff --git a/user-guides/run-pactus-gui/seed_confirmation.png b/user-guides/run-pactus-gui/seed_confirmation.png new file mode 100644 index 000000000..175f749db Binary files /dev/null and b/user-guides/run-pactus-gui/seed_confirmation.png differ diff --git a/user-guides/run-pactus-gui/syncing_progress.png b/user-guides/run-pactus-gui/syncing_progress.png new file mode 100644 index 000000000..b56c6a27f Binary files /dev/null and b/user-guides/run-pactus-gui/syncing_progress.png differ diff --git a/user-guides/run-pactus-gui/wallet_password.png b/user-guides/run-pactus-gui/wallet_password.png new file mode 100644 index 000000000..7ad4a5e9f Binary files /dev/null and b/user-guides/run-pactus-gui/wallet_password.png differ diff --git a/user-guides/run-pactus-gui/wallet_seed.png b/user-guides/run-pactus-gui/wallet_seed.png new file mode 100644 index 000000000..5bfaf9185 Binary files /dev/null and b/user-guides/run-pactus-gui/wallet_seed.png differ diff --git a/user-guides/send-transactions-gui/bond-transaction-dialog.png b/user-guides/send-transactions-gui/bond-transaction-dialog.png new file mode 100644 index 000000000..9f92cbd87 Binary files /dev/null and b/user-guides/send-transactions-gui/bond-transaction-dialog.png differ diff --git a/user-guides/send-transactions-gui/index.html b/user-guides/send-transactions-gui/index.html new file mode 100644 index 000000000..8b5f2fd51 --- /dev/null +++ b/user-guides/send-transactions-gui/index.html @@ -0,0 +1,391 @@ + + + + + + + + + + + + + How to send transactions in Graphic Mode? | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

How to send transactions in Graphic Mode?

+ +

Preface

+ +

The Pactus Blockchain offers a Graphical User Interface (GUI) that comes with a built-in wallet to create, +sign and broadcast transactions. +This tutorial aims to guide you step-by-step on how to use the GUI application to send transactions to the Pactus blockchain. +Whether you are a beginner or an advanced user, this tutorial is suitable for you.

+ +

Prerequisites

+ +

Before we begin, you’ll need to run the Pactus GUI application and ensure that it is synced with the network. +You can find detailed instructions on how to do this in the following tutorial.

+ +

Sending a Transfer Transaction

+ +

To send a transfer transaction, click on the “Transaction” menu and +select “Transfer”. +A new window will appear where you can select the +account address from which you wish to send the “transfer” transaction, +as well as the recipient’s account address and the amount you wish to send.

+ +

After reviewing the transaction details and ensuring that they are correct, +click on the “Send” button to sign and broadcast the transaction to the Pactus blockchain.

+ +

Transfer Transaction Dialog

+ +

It’s important to note that the transaction fee +will be calculated based on the amount you’re sending.

+ +

Sending a Bond Transaction

+ +

To send a bond transaction, click on the “Transaction” menu +and select “Bond”. +A new window will appear where you can select the account address from which you wish to send the “bond” transaction, +as well as the recipient’s validator address and +the amount you wish to stake.

+ +

Bond Transaction Dialog

+ +

It’s important to note that the transaction fee +will be calculated based on the amount you’re sending.

+ + + + + +
+
+
+
+ + + + + diff --git a/user-guides/send-transactions-gui/transfer-transaction-dialog.png b/user-guides/send-transactions-gui/transfer-transaction-dialog.png new file mode 100644 index 000000000..f680d23af Binary files /dev/null and b/user-guides/send-transactions-gui/transfer-transaction-dialog.png differ diff --git a/user-guides/use-wallet-cli/index.html b/user-guides/use-wallet-cli/index.html new file mode 100644 index 000000000..a7be17b67 --- /dev/null +++ b/user-guides/use-wallet-cli/index.html @@ -0,0 +1,1110 @@ + + + + + + + + + + + + + How to use wallet in Command Line mode? | Pactus blockchain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

How to use wallet in Command Line mode?

+ +

Preface

+ +

The Pactus Blockchain provides a wallet application that allows users to interact with the Pactus blockchain +without the need to run a node. +This is ideal for users who do not wish to operate a node but still want to create a personal wallet to manage their funds. +This tutorial will guide you step-by-step on how to use the wallet application.

+ +

Download

+ +

To get started, download and extract the Pactus CLI file from +here.

+ +
+ +

Wallet commands

+ +

In this section, we will explore various wallet commands that help you create, manage, +and recover your Pactus wallet.

+ +

Create a wallet

+ +

First, you need to create a wallet. To create a new wallet, run the following command:

+ + +
+ +
+ +
./pactus-wallet --path ~/pactus/wallets/default_wallet create
+
+ +

This command creates a new wallet and stores it in the ~/pactus/wallets/default_wallet.

+ + +
+ +
+ +
./pactus-wallet --path ~/pactus/wallets/default_wallet create
+
+ +

This command creates a new wallet and stores it in the ~/pactus/wallets/default_wallet.

+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\default_wallet create --testnet
+
+ +

This command creates a new wallet and stores it in the c:\pactus\wallets\default_wallet.

+ + +
+ +
+ +

Don’t forget to back up your wallet seed, as it allows you to recover your wallet if you lose it.

+ +

Wallet password

+ +

You can change the wallet password by running this command:

+ + +
+ +
+ +
./pactus-wallet --path ~/pactus/wallets/default_wallet password
+
+ + +
+ +
+ +
./pactus-wallet --path ~/pactus/wallets/default_wallet password
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\default_wallet password
+
+ + +
+ +
+ +

If you forget your password, you can still recover your wallet using the wallet seed.

+ +

Wallet seed

+ +

You can obtain the wallet seed by running this command:

+ + +
+ +
+ +
./pactus-wallet --path ~/pactus/wallets/default_wallet seed
+
+ + +
+ +
+ +
./pactus-wallet --path ~/pactus/wallets/default_wallet seed
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\default_wallet seed
+
+ + +
+ +
+ +

The wallet seed is encrypted within your wallet, and +you’ll need to enter the wallet password to access it.

+ +

Recovering Wallet

+ +

If you lose your wallet, you can recover it by running this command:

+ + +
+ +
+ +
./pactus-wallet --path ~/pactus/wallets/recovered_wallet recover
+
+ + +
+ +
+ +
./pactus-wallet --path ~/pactus/wallets/recovered_wallet recover
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\recovered_wallet recover
+
+ + +
+ +
+ +

Please note that if you lose your seed, there is no way to recover your wallet.

+ +
+ +

Address commands

+ +

In this section, we’ll cover address commands that help you manage your wallet addresses.

+ +

Creating new address

+ +

You can create a new address by running this command:

+ + +
+ +
+ +
./pactus-wallet --path ~/pactus/wallets/default_wallet address new
+
+ + +
+ +
+ +
./pactus-wallet --path ~/pactus/wallets/default_wallet address new
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\default_wallet address new
+
+ + +
+ +
+ +

You can also assign a label to your address to better organize your address book.

+ +

List of addresses

+ +

To view the list of wallet addresses, use this command:

+ + +
+ +
+ +
./pactus-wallet --path ~/pactus/wallets/default_wallet address all
+
+ + +
+ +
+ +
./pactus-wallet --path ~/pactus/wallets/default_wallet address all
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\default_wallet address all
+
+ + +
+ +
+ +

Get Public key

+ +

To obtain the public key for a specific address, run this command:

+ + +
+ +
+ +
./pactus-wallet --path ~/pactus/wallets/default_wallet address pub <ADDRESS>
+
+ + +
+ +
+ +
./pactus-wallet --path ~/pactus/wallets/default_wallet address pub <ADDRESS>
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\default_wallet address pub <ADDRESS>
+
+ + +
+ +
+ +

Replace <ADDRESS> with the address for which you want to retrieve its public key.

+ +

Get Private key

+ +

You can get the public key of your address by this command:

+ + +
+ +
+ +
./pactus-wallet --path ~/pactus/wallets/default_wallet address pub <ADDRESS>
+
+ + +
+ +
+ +
./pactus-wallet --path ~/pactus/wallets/default_wallet address pub <ADDRESS>
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\default_wallet address pub <ADDRESS>
+
+ + +
+ +
+ +

Replace <ADDRESS> with the address for which you want to retrieve its private key. +Keep your private key secure. If someone gains access to your private key, +they will have full control over that address.

+ +
+ +

Transaction commands

+ +

In this section, we’ll cover transaction commands that help you create, sign, and +broadcast transactions on the Pactus Blockchain. +You’ll need to provide the password to sign the transaction. +Please note that once a transaction is broadcasted, it cannot be reversed.

+ +

Sending Transfer transaction

+ +

To create, sign, and broadcast a +Transfer transaction, use the following command:

+ + +
+ +
+ +
./pactus-wallet --path ~/pactus/wallets/default_wallet tx transfer <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +
./pactus-wallet --path ~/pactus/wallets/default_wallet tx transfer <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\default_wallet tx transfer <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +

In this command, <FROM> should be one of the addresses in your wallet as the sender address, +and <TO> is the receiver address.

+ +

Sending Bond transaction

+ +

To create, sign, and broadcast a +Bond transaction, use the following command:

+ + +
+ +
+ +
./pactus-wallet --path ~/pactus/wallets/default_wallet tx bond <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +
./pactus-wallet --path ~/pactus/wallets/default_wallet tx bond <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\default_wallet tx bond <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +

In this command, <FROM> should be one of the addresses in your wallet as the sender address, +and <TO> is the receiver validator address.

+ +

If the validator associated with this address does not exist yet, +you need to provide the public key to create it:

+ + +
+ +
+ +
./pactus-wallet --path ~/pactus/wallets/default_wallet tx bond --pub <PUBLIC_KEY> <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +
./pactus-wallet --path ~/pactus/wallets/default_wallet --pub <PUBLIC_KEY> <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\default_wallet --pub <PUBLIC_KEY> <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +

Replace <PUBLIC_KEY> with the validator’s public key, +which is the public key of the <TO> address.

+ +

Sending Unbond transaction

+ +

To create, sign, and broadcast a +Unbond transaction, use the following command:

+ + +
+ +
+ +
./pactus-wallet --path ~/pactus/wallets/default_wallet tx unbond <ADDRESS>
+
+ + +
+ +
+ +
./pactus-wallet --path ~/pactus/wallets/default_wallet tx unbond <ADDRESS>
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\default_wallet tx unbond <ADDRESS>
+
+ + +
+ +
+ +

In this command, <ADDRESS> is the address of the validator that you want to unbond.

+ +

Sending Withdraw transaction

+ +

To create, sign, and broadcast a +Withdraw transaction, use the following command:

+ + +
+ +
+ +
./pactus-wallet --path ~/pactus/wallets/default_wallet tx unbond <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +
./pactus-wallet --path ~/pactus/wallets/default_wallet tx unbond <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\default_wallet tx withdraw <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ + + + + +
+
+
+
+ + + + + diff --git a/zh/2022/08/29/dev-meeting.html b/zh/2022/08/29/dev-meeting.html new file mode 100644 index 000000000..e7d1d4c34 --- /dev/null +++ b/zh/2022/08/29/dev-meeting.html @@ -0,0 +1,365 @@ + + + + + + + + + + + + + Dev meeting | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Dev meeting

+ +

Meeting Summary

+ +

The meeting took place on 04 September 2022, at 2:00 PM UTC via Google Meet, +with team members from different time zones joining to discuss key aspects of the Pactus project.

+ +

NanoMsg instead of ZeroMQ

+ +

During the meeting, Joseph suggested using Nanomsg instead of ZeroMQ because building ZeroMQ is not easy, +especially in Windows. Additionally, we can use the pure Go implementation of Nanomsg.

+ +

The format of block events was defined as follows:

+ +
<event_id: 1 byte><event_data: variant><height: 4 bytes><seq_num: 4 bytes>
+
+ +

As a consequence of this, smart contracts events can be defined more easily and +Infura-like services become simple, as we can just replay the events.

+ +

Reviewing a Pull Request

+ +

Nagaraj’s pull request reviewed.

+ +

Renaming project

+ +

The team discussed renaming (rebranding) the project and decided to create an online survey to +gather suggestions for a new name. +Everyone is encouraged to participate in the survey and suggest new names for the project.

+ + + + +
+
+
+
+ + + + diff --git a/zh/2022/09/04/dev-meeting.html b/zh/2022/09/04/dev-meeting.html new file mode 100644 index 000000000..6030ce1e4 --- /dev/null +++ b/zh/2022/09/04/dev-meeting.html @@ -0,0 +1,474 @@ + + + + + + + + + + + + + Dev meeting | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Dev meeting

+ +

Meeting Summary

+ +

The meeting took place on 29 August 2022, at 2:00 PM UTC via Google Meet, +with team members from different time zones joining to discuss key aspects of the Pactus project.

+ +

Project renamed to Pactus

+ +

During the last meeting, the team conducted an online survey to rename the project. +A total of 31 responses were received, and the following names were suggested:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameVotes
Sirius11
Pactus10
Nova7
Texo6
Zemus6
Helios6
Tutti5
Haki5
Aegeus4
Virgo4
Zentora3
Zinova3
Xerxes2
Ledgeria2
Solidus2
Welt2
Ventura2
Zebra2
Miranet2
Monetha2
FutureHub1
Muonet1
Mentha1
Hypatios0
Chaintopia0
Sycee0
Lepus0
+ +

After reviewing the responses, the team chose “Pactus” as the new name for the project. 🎉 +The project will be moved to “pactus-project/pactus,” and the team plans to announce it on social media.

+ +

Discussion on GUI

+ +

In terms of the GUI, Joseph suggested using Flutter, and the team agreed. +To interact with the wallet, gRPC APIs will be provided, and the GUI will use these APIs.

+ + + + +
+
+
+
+ + + + diff --git a/zh/2022/09/18/dev-meeting.html b/zh/2022/09/18/dev-meeting.html new file mode 100644 index 000000000..74910f092 --- /dev/null +++ b/zh/2022/09/18/dev-meeting.html @@ -0,0 +1,384 @@ + + + + + + + + + + + + + Dev meeting | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Dev meeting

+ +

Meeting Summary

+ +

The meeting took place on 18 September 2022, at 2:00 PM UTC via Google Meet, +with team members from different time zones joining to discuss key aspects of the Pactus project.

+ +

Discussion about Testnet

+ +

The team discussed Testnet and related issues, including IP block issues that were found by Hadi. +Due to sanctions, some IPs are blocked, so the team will run a support node to assist users inside Iran. +The GUI application had some issues on Windows, but they were fixed and tested by Hadi.

+ +

Discussion about Website

+ +

The website still has some issues, such as the need to rename the animation to “Pactus” and the lack of a logo. +The community suggested some logos. Additionally, the roadmap page is missing.

+ +

Status of social medias

+ +

The team discussed the status of social media platforms, including:

+ +
    +
  • Discord: 70 members
  • +
  • Instagram: 87 followers
  • +
  • Telegram: 20 followers
  • +
  • Linkedin: 20 followers
  • +
  • Twitter: Not yet
  • +
+ +

The team also decided to announce the project on social media on 29 September.

+ +

Consensus parameters

+ +

The team discussed the current consensus parameters:

+ +
    +
  • Total supply: 21 million coins
  • +
  • Reward: 1 coin per block
  • +
  • Block time: 10 second
  • +
  • Committee size: 21 members
  • +
  • Bond interval: one hour
  • +
  • Unbond interval: 21 days
  • +
  • Fee fraction: 0.0001
  • +
  • Min fee: 0.0000001
  • +
  • Max fee: 0.01
  • +
  • Maximum stake: 12381
  • +
+ + + + +
+
+
+
+ + + + diff --git a/zh/2022/09/20/release-0-9-0.html b/zh/2022/09/20/release-0-9-0.html new file mode 100644 index 000000000..f3582c3b9 --- /dev/null +++ b/zh/2022/09/20/release-0-9-0.html @@ -0,0 +1,354 @@ + + + + + + + + + + + + + Pactus 0.9.0 released | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Pactus 0.9.0 released

+ +

Overview

+ +

Pactus Blockchain Release Version 0.9.0 +is now available for download. +This release includes a new graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Download

+ +

This version has been implemented for Testnet-0 and is preparing for the upcoming Mainnet launch. +To get started with the Pactus Blockchain Testnet-0, simply download +the latest version and run the Pactus software.

+ +

Join the Testnet now and get ready for the future!

+ + + + +
+
+
+
+ + + + diff --git a/zh/2022/09/24/testnet-0-launched.html b/zh/2022/09/24/testnet-0-launched.html new file mode 100644 index 000000000..6d6a6a44d --- /dev/null +++ b/zh/2022/09/24/testnet-0-launched.html @@ -0,0 +1,350 @@ + + + + + + + + + + + + + Testnet-0 launch announcement | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Testnet-0 launch announcement

+ +

testnet

+ +

The Pactus blockchain Testnet-0 is now accessible. +To participate, simply download the Pactus application version 0.9.0 and +connect to the Testnet without any special configurations. +For test coins, please visit our Discord channel and share your validator address.

+ +

By taking part in the Testnet, you can familiarize yourself with the Pactus blockchain and +get ready for the Mainnet launch. +Testnet participants will also be given higher priority during the Mainnet launch.

+ +

Please share your feedback with us to help improve the user experience in future versions of the software.

+ + + + +
+
+
+
+ + + + diff --git a/zh/2022/10/30/dev-meeting.html b/zh/2022/10/30/dev-meeting.html new file mode 100644 index 000000000..63046033a --- /dev/null +++ b/zh/2022/10/30/dev-meeting.html @@ -0,0 +1,377 @@ + + + + + + + + + + + + + Dev meeting | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Dev meeting

+ +

Meeting Summary

+ +

The meeting took place on 30 October 2022, at 2:00 PM UTC via Google Meet, +with team members from different time zones joining to discuss key aspects of the Pactus project.

+ +

In memory of Mahsa Amini

+ +

The meeting started in memory of Mahsa Amini. +We in the Pactus family stand in solidarity with courageous people who are fighting for equality, equity and freedom in Iran.

+ +

Woman Life Freedom

+ +

Launching Block explorer

+ +

The beta version of the block explorer has been launched 🚀 and is now available at +https://pacscan.org.

+ +

Nagaraj explained the block explorer and some of the features.

+ +

Project road map

+ +

Project road map was discussed.

+ +

IdeaKita pitch deck

+ +

Ali presented the Pactus pitch deck for the IdeaKita in Malaysia. +The IdeaKita program, under the Malaysia Digital Economy Corporation (MDEC), is designed to +support entrepreneurs and startups in Malaysia.

+ +

Latest development progress

+ +

The latest pull requests were reviewed:

+ + + + + + +
+
+
+
+ + + + diff --git a/zh/2022/11/24/release-0-9-1.html b/zh/2022/11/24/release-0-9-1.html new file mode 100644 index 000000000..0d83c1e5c --- /dev/null +++ b/zh/2022/11/24/release-0-9-1.html @@ -0,0 +1,369 @@ + + + + + + + + + + + + + Pactus 0.9.1 released | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Pactus 0.9.1 released

+ +

Overview

+ +

Pactus Blockchain Release Version 0.9.1 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Download

+ +

This version has been implemented for Testnet-0 and is preparing for the upcoming Mainnet launch. +To start using the Pactus Blockchain Testnet-0, +you can download the latest version from download page +and join the Testnet.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +
    +
  • Blocks can be fully decoded when queried in gRPC
  • +
  • The HTTP module now uses gRPC module, making node configuration simpler by removing the CapnP module
  • +
  • Reducing the blockchain size by saving blocks by number instead of hash
  • +
  • The wallet can hold unconfirmed transactions
  • +
  • The wallet can use different gRPC servers
  • +
  • The GUI displays committee information
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

+ + + + +
+
+
+
+ + + + diff --git a/zh/2023/03/01/what-is-testnet.html b/zh/2023/03/01/what-is-testnet.html new file mode 100644 index 000000000..67e34875a --- /dev/null +++ b/zh/2023/03/01/what-is-testnet.html @@ -0,0 +1,421 @@ + + + + + + + + + + + + + What is a Testnet? | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

What is a Testnet?

+ +

Mainnet vs Testnet?

+ +

If you have ever wondered what Testnet is and how it is different from Mainnet, read this article to the end to find out!

+ +

Mainnet and Testnet are two widely used terminologies in the Blockchain ecosystem; +so it is important to understand the meaning and differences while working in the industry or +following announcements of the Blockchain projects like Pactus.

+ +

Here’s a quick explanation: +Before the actual live version of a Blockchain network that is used for real transactions, +functions and smart-contracts (which is referred as Mainnet), +there is a test version of the Blockchain network for testing purposes (which is referred as Testnet). +In Testnet, a safe environment is provided to help developers experiment and test their applications, +and make sure that everything functions smoothly in the Mainnet version.

+ +

Testnet

+ +

A Testnet is a simulation of a Blockchain, in which developers can test all the functionalities of +their Blockchain network without risking their assets and convenience of end-users. +Using Testnet, any possible error, bug or malfunctions can be fixed before the Mainnet launch. +Testnet also can be an experimental environment for new features, updates and upgrades. +So several Testnet networks of the same version or newer version of the Mainnet can be implemented on the roadmap.

+ +

What are use cases of Testnet?

+ +

A secure environment to test development ideas and updates. +So many features and minor details in Pactus project have been successfully developed so far using the Testnet; such as:

+ +
    +
  • extra details and information on Pactus-GUI;
  • +
  • well-functioning Pactus Blockchain explorer to access transactions and block details;
  • +
  • Upgrades that led to decreasing the size of the Pactus network
  • +
+ +

Providing a safe testing ground for resolve scalability and security problems, as well as decentralization issues. +Pactus network is also a secure and purely decentralized network. However in the last updates during the Testnet, +developers are now able to decrease the database size by approximately 10% without compromising performance. +They did it by utilizing block height instead of hash to store blocks within the database. (you can find out more +here).

+ +

Testing new versions, patches and features on Testnet. it is vital for enhancing the security, load testing, +Blockchain migration, integration tests, and etc. This is why you can now use the latest version of Pactus-GUI +that works like clockwork and is extremely secure.

+ +

Testing the functions of cryptocurrency without disrupting the Mainnet. In the Testnet of Pactus Blockchain, +you as a user or validator can use all the features to send, receive, bond or unbond your assets in the Pactus-GUI.

+ +

Development and simulation of smart contract features and DApps. Note that many Blockchain projects like Pactus, +can be used as smart-contract platforms. So the Testnet can be designed in different stages to test and improve +different applications of the network.

+ +

Please note that after a certain period of time, when developers get satisfied with the functionality and debugging process, +they launch Mainnet. Mainnet has its own independent genesis blocks; +so the assets and addresses that users use in Testnet are not valid inside the new Mainnet Blockchain anymore. +In fact the whole Blockchain network starts working from the scratch and users and validators start to +work with real tokens and transactions instead of the simulated ones. But since Testnet has an important effect +on the health and improvement of the network, in Pactus Blockchain, we have several advantages +for the people who join the Testnet.

+ +

Why should you join the Testnet?

+ +

There are different contributors in a Blockchain network; +Some people are developers and programmers that use the Testnet to contribute, enhance and lead the project to a better future. +Testnet is actually vital for them to perform their changes and try their innovations and ideas.

+ +

But you might also be an end user; you might want to either be a validator and stake your assets to earn more Pactus coins, +or you might want to learn how to use the network for future personal applications. Either way, +you might find it handy to give it a try and be familiar with Pactus-GUI and its different features.

+ +

However, there is another advantage for end users who join the Testnet. +While using the network, running a node or testing the Pactus-GUI in Testnet period, you are contributing to +the community to find improvement potentials, that’s why there are more advantages contemplated for the Testnet users; +Soon our Mainnet will be launched and also Pactus network will be announced and listed in well-known exchanges. +As an early contributor, you will have the advantage of getting some extra initial tokens at the beginning of Mainnet launch. +So that you can use it to run a validator node and earn more from staking your assets. This airdrop is considered +for every individual who installs Pactus-GUI and starts a node in Testnet.

+ +

There are other positive conditions you may experience as an early contributor.

+ +
    +
  • Advanced and very responsive support for your issues (we dedicate more time to provide you with solutions)
  • +
  • Embracing your suggestions, improvement ideas, needs and information you may require to have a better user experience.
  • +
+ + + + +
+
+
+
+ + + + diff --git a/zh/2023/04/21/testnet-0-concluded.html b/zh/2023/04/21/testnet-0-concluded.html new file mode 100644 index 000000000..0dbf08abc --- /dev/null +++ b/zh/2023/04/21/testnet-0-concluded.html @@ -0,0 +1,374 @@ + + + + + + + + + + + + + Story of Testnet-0 | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Story of Testnet-0

+ +

What is Testnet?

+ +

Testnet is a testing environment where developers and users can try out the functionality of a blockchain project, +without putting real assets or data at risk. +It helps to ensure that the final product is reliable and secure for users to use. +If you like to read more about the Testnet you can check out our post on +“What is Testnet?”.

+ +

Summary of Testnet-0

+ +

In September 2022, we launched our first Testnet. +The purpose of this Testnet was to +check the consensus protocol, +test different transaction types, +and ensure the stability of the blockchain. +We also wanted to test the sortition algorithm +to make sure it works properly.

+ +

The committee +for the Testnet-0 was set to five validators, and more than 19 validators joined during the Testnet period. +Over 2 million blocks were created, and more than 3.2 million transactions were processed during this time. +The size of the blockchain is approximately 1 gigabyte. +The maximum number of transactions recorded in a single block was 386. With a block time of 10 seconds, +we can confirm that Pactus blockchain can support up to 30 transactions per second (TPS), +which is a reasonable number for TPS. Based on real-time statistics available at realtps, +we can see that Pactus is among the top 10 blockchains in terms of TPS.

+ +

At this point, the development team decided to end the Testnet-0 and move on to the next one, +Testnet-1. We are planning to run the Testnet-1 to prepare for the MainNet launch. +We will provide updates on our progress and share the details of the new Testnet soon.

+ +

As promised, participants in Testnets will be given priority as validators for the MainNet, +and will receive bounty tokens from the bootstrap accounts to set up their validator. +We are grateful to all those who participated in Testnet-0, and we encourage them to join our next Testnet to +help us improve Pactus. +As a community-based project, we rely on the support of our community members, and we value any help we receive.

+ + + + +
+
+
+
+ + + + diff --git a/zh/2023/05/08/release-0-10-0.html b/zh/2023/05/08/release-0-10-0.html new file mode 100644 index 000000000..9fc067502 --- /dev/null +++ b/zh/2023/05/08/release-0-10-0.html @@ -0,0 +1,397 @@ + + + + + + + + + + + + + Pactus 0.10.0 released | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Pactus 0.10.0 released

+ +

Overview

+ +

Pactus Blockchain Version 0.10.0 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Highlight

+ +

The main update in this version allows users to set up multiple validators in one node. +Users can set up to 32 validators in a single node, and each validator can stake up to 1,000 coins.

+ +

Multi validators

+ +

Download

+ +

This version has been implemented for Testnet-1 and +is being prepared for the upcoming Mainnet launch. +To start using Pactus Blockchain Testnet-1, download the latest version from the +download page and join the Testnet.

+ +

These guides can help you to run and configure your node:

+ + + +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • removing address from account (#454)
  • +
  • supporting multiple consensus instances (#450)
  • +
  • adding sortition interval to the parameters (#442)
  • +
+ +

Fix

+ +
    +
  • gui: check if the node has an active consensus instance (#458)
  • +
  • Use of a Persistent Merkle tree to enhance performance of calculating the +state hash; fully tested in Testnet-0 (#432)
  • +
  • GetBlockchainInfo API in gRPC now returns the total number of validators and accounts (#439)
  • +
  • wallet path as argument (#455)
  • +
  • adding reward addresses to config (#453)
  • +
  • removing committers from the certificate hash (#444)
  • +
  • prevent data race conditions in committee (#452)
  • +
  • using 2^256 for the vrf denominator (#445)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

+ + + + +
+
+
+
+ + + + diff --git a/zh/2023/05/09/testnet-1-launched.html b/zh/2023/05/09/testnet-1-launched.html new file mode 100644 index 000000000..38391f764 --- /dev/null +++ b/zh/2023/05/09/testnet-1-launched.html @@ -0,0 +1,380 @@ + + + + + + + + + + + + + Testnet-1 launch announcement | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Testnet-1 launch announcement

+ +

Overview

+ +

The Pactus blockchain Testnet-1 is now available for participation. +This version simulates the Mainnet environment and evaluate the system’s performance, stability, +and security in a controlled environment. +The primary goal of this version of Testnet is to determine the efficient and secure committee size for the Mainnet.

+ +

Key Aspects

+ +
    +
  • Simulating the Mainnet environment
  • +
  • Determining the actual block creation time
  • +
  • Assessing the staking mechanism and consensus protocol
  • +
  • Evaluating network usage under different loads
  • +
  • Evaluating the syncing process for new nodes joining the network
  • +
  • Ensuring network stability with over 1000 validators
  • +
  • Evaluating transaction performance
  • +
  • Conducting stress tests
  • +
  • Performing security tests, including double spend attacks, Sybil attacks +(nodes with different identities), and forking resistance
  • +
+ +

Joining Testnet-1

+ +

To join the Testnet, download Pactus software +version 0.10.0 and +connect to Testnet without any special configuration or hardware. +You can run the software on your personal computer or laptop. +To acquire test coins, visit the Discord channel and +provide your validator address.

+ +

Benefits for Participation

+ +

By taking part in the Testnet, users can familiarize themselves with the Pactus blockchain and +be well-prepared for the Mainnet launch. +Testnet participants will also receive higher priority during the Mainnet launch and +get free coins for initial staking on the Mainnet.

+ +

Your Feedback Matters

+ +

User feedback plays a vital role in the improvement of the Pactus blockchain. +Share your thoughts and experiences to contribute to the enhancement of future software versions.

+ + + + +
+
+
+
+ + + + diff --git a/zh/2023/05/29/release-0-11-0.html b/zh/2023/05/29/release-0-11-0.html new file mode 100644 index 000000000..260f7cc05 --- /dev/null +++ b/zh/2023/05/29/release-0-11-0.html @@ -0,0 +1,409 @@ + + + + + + + + + + + + + Pactus 0.11.0 released | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Pactus 0.11.0 released

+ +

Overview

+ +

Pactus Blockchain Version 0.11.0 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Highlights

+ +

The main update in this version is the fix for the relay +connection issue. +A relay is a peer in the network that facilitates the connection between two peers, +particularly when they are using home internet.

+ +

Another significant update is that sending a Bond transaction +is now more user-friendly. +Users no longer need to set the validator public key if they want to bond Test PAC coins to their validators.

+ +

Bond transaction dialog

+ +

Download

+ +

This version has been implemented for Testnet-1 and +is being prepared for the upcoming Mainnet launch. +To start using Pactus Blockchain Testnet-1, download the latest version from the +download page and join the Testnet.

+ +

These guides can help you to run and configure your node:

+ + + +

How to Upgrade

+ +

If you are running an older version, shut it down. +Uninstall the previous version and install the newer version. +If you are using the archived version, simply use the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Fix

+ +
    +
  • gui: showing the total number of validators (#474)
  • +
  • network: fixing relay connection issue (#475)
  • +
  • consensus: rejecting vote with round numbers exceeding the limit (#466)
  • +
  • increase failed counter when stream got error (#489)
  • +
  • boosting syncing process (#482)
  • +
  • waiting for proposal in pre-commit phase (#486)
  • +
  • retrieving public key from wallet for bond transactions (#485)
  • +
  • restoring config file to the default (#484)
  • +
  • defining ChainType in genesis to detect the type of network (#483)
  • +
  • reducing the default Argon2d to consume less memory (#480)
  • +
  • adding password option to the start commands (#473)
  • +
+ +

Refactor

+ +
    +
  • rename send to transfer. (#469)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

+ + + + +
+
+
+
+ + + + diff --git a/zh/2023/06/19/release-0-12-0.html b/zh/2023/06/19/release-0-12-0.html new file mode 100644 index 000000000..28d89a012 --- /dev/null +++ b/zh/2023/06/19/release-0-12-0.html @@ -0,0 +1,407 @@ + + + + + + + + + + + + + Pactus 0.12.0 released | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Pactus 0.12.0 released

+ +

Overview

+ +

Pactus Blockchain Version 0.12.0 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Highlights

+ +

This version is focused on improving the sync time to make it faster. +This is achieved by implementing a caching mechanism that executes transactions more quickly and +improves the calculation of total power (stake) of the blockchain in a more effective way.

+ +

Syncing progress

+ +

Download

+ +

This version has been implemented for Testnet-1 and +is being prepared for the upcoming Mainnet launch. +To start using Pactus Blockchain Testnet-1, download the latest version from the +download page and join the Testnet.

+ +

These guides can help you to run and configure your node:

+ + + +

How to Upgrade

+ +

If you are running an older version, shut it down. +Uninstall the previous version and install the newer version. +If you are using the archived version, simply use the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • add GetAccountByNumber API to get account by number (#511)
  • +
+ +

Fix

+ +
    +
  • caching account and validator in store (#513)
  • +
  • get recent blocks by stamp (#509)
  • +
  • closing the mDNS connection upon stopping the network (#508)
  • +
  • updating linkedmap to use generic (#507)
  • +
  • removing state from cache (#506)
  • +
  • Typo in GUI (#499)
  • +
  • supporting localnet (#492)
  • +
+ +

Refactor

+ +
    +
  • update total power calculation based on power change(deltas) (#518)
  • +
  • GetValidators return all validators in state validators map (#512)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

+ + + + +
+
+
+
+ + + + diff --git a/zh/2023/07/01/release-0-13-0.html b/zh/2023/07/01/release-0-13-0.html new file mode 100644 index 000000000..65c32ea96 --- /dev/null +++ b/zh/2023/07/01/release-0-13-0.html @@ -0,0 +1,398 @@ + + + + + + + + + + + + + Pactus 0.13.0 released | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Pactus 0.13.0 released

+ +

Overview

+ +

Pactus Blockchain Version 0.13.0 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Highlights

+ +

Users can now restore the default_wallet during the node initialization. +If users have a backup of the seed phrase (mnemonic) for the default_wallet, +they can now restore it and re-initialize the node.

+ +

Restore mode

+ +

Download

+ +

This version has been implemented for Testnet-1 and +is being prepared for the upcoming Mainnet launch. +To start using Pactus Blockchain Testnet-1, download the latest version from the +download page and join the Testnet.

+ +

These guides can help you to run and configure your node:

+ + + +

How to Upgrade

+ +

If you are running an older version, shut it down. +Uninstall the previous version and install the newer version. +If you are using the archived version, simply use the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Fix

+ +
    +
  • implemented restore wallet base on input seed (#553)
  • +
  • measuring total sent and received bytes (#552)
  • +
  • add validate seed and restore wallet (#533)
  • +
  • HTTP: Missing handlers (#549)
  • +
  • gui: update about dialog and menu items in help (#532)
  • +
+ +

Refactor

+ +
    +
  • implementing TestSuite (#535)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

+ + + + +
+
+
+
+ + + + diff --git a/zh/2023/07/05/testnet-500-validators.html b/zh/2023/07/05/testnet-500-validators.html new file mode 100644 index 000000000..ee39fc69b --- /dev/null +++ b/zh/2023/07/05/testnet-500-validators.html @@ -0,0 +1,372 @@ + + + + + + + + + + + + + 500 validators joined Testnet | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

500 validators joined Testnet

+ +

For a Proof of Stake blockchain, validators are important for +maintaining the network’s integrity and security. They are similar to miners in Proof of Work blockchains like Bitcoin.

+ +

Pactus as a real Proof of Stake blockchain, has achieved a significant milestone. +More than 500 validators joined the Testnet +in less than 2 months. +This accomplishment proves that Pactus is reliable, resilient, and trustworthy. More importantly, it sets new standards +in the blockchain world. In fact, the Pactus Testnet is even more decentralized than some well-known blockchains.

+ +

500 validators of Testnet

+ +

One key reason why Pactus can accommodate more validators is its powerful +consensus mechanism. +The consensus mechanism in Pactus eliminates the need for delegation, making it possible for anyone to become a validator. +Additionally, the user-friendly application ensures that even those new to blockchain can easily contribute to the network.

+ +

What is the next

+ +

To remain competitive in the market, Pactus recognizes the importance of prioritizing user space. +We aim to ensure that running Pactus is affordable and accessible to anyone, regardless of their technical expertise or +available resources.

+ +

To achieve this, the Pactus team constantly monitors network, storage, and computational usage, striving to keep them +at minimal levels. +By doing so, we enable more individuals to participate in the Pactus blockchain.

+ +

Currently, the Pactus team is working on optimizing and reducing network usage. This effort will lead to reduced costs, +especially for users who are using home internet connections.

+ +

Furthermore, we are planning to introduce a pruning mode, allowing users to run the Pactus blockchain with significantly +less storage. +Although we believe the storage size is already small, our goal is to enable users to +retain only the most recent blockchain history. +This approach ensures that the blockchain size remains as compact as possible by disregarding some history of the blockchain.

+ + + + +
+
+
+
+ + + + diff --git a/zh/2023/07/09/dev-meeting.html b/zh/2023/07/09/dev-meeting.html new file mode 100644 index 000000000..b3238c274 --- /dev/null +++ b/zh/2023/07/09/dev-meeting.html @@ -0,0 +1,378 @@ + + + + + + + + + + + + + Dev meeting | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Dev meeting

+ +

Meeting Summary

+ +

The meeting took place on 09 July 2023, at 2:00 PM UTC via Google Meet, +with team members from different time zones joining to discuss key aspects of the Pactus project.

+ +

Overview to the Network Module

+ +

The meeting began with an overview of the Network module in Pactus. +This module uses Libp2p as its underlying network protocol.

+ +

The Network module is agnostic about the content of the message and +handles two types of messages: Gossip messages, which are broadcasted, +and Stream messages, which are sent directly to a specific peer. +The team discussed the relay nodes that enable communication for nodes behind NAT. +Upon receiving a message, the module publishes an event. +The two types of events are Gossip events and Steam events.

+ +

Network messages

+ +

The team discussed the issue of Relay connections resetting, and explored solutions such as +hole punching or using UDP and IPv6.

+ +

Some users in the Testnet reported high network usage. +The team discussed implementing metrics for LibP2P to monitor network usage effectively. +The discussion related to this issue can be found here. +Additionally, the team discussed the customization of network resources, +including setting limits for inbound and outbound connections.

+ +

Overview to the Sync Module

+ +

Moving on, the Sync module was discussed. +Unlike the Network module, the Sync module has full knowledge about the messages and packets. +The module handles a range of message types, which can be found +here.

+ +

It was suggested that we need to define metrics for each message type. +There was also a discussion about the need for reducing the messages to optimize the use of network resources.

+ +

The team decided to continue discussing these topics in future meetings. +They also plan to work on improving the Network and Sync modules based on these discussions.

+ + + + +
+
+
+
+ + + + diff --git a/zh/2023/08/01/testnet-1-concluded.html b/zh/2023/08/01/testnet-1-concluded.html new file mode 100644 index 000000000..2947a7ac3 --- /dev/null +++ b/zh/2023/08/01/testnet-1-concluded.html @@ -0,0 +1,403 @@ + + + + + + + + + + + + + Story of Testnet-1 | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Story of Testnet-1

+ +

About Testnet

+ +

Testnet is a testing environment where developers and users can try out the functionality of a blockchain project, +without putting real assets or data at risk. +It helps to ensure that the final product is reliable and secure for users to use. +If you like to read more about the Testnet you can check out our post on +“What is Testnet?”.

+ +

Summary

+ +

In May 2023, we launched our second Testnet. +The main purpose of this Testnet was to measure block time creation and the responsiveness of the blockchain. +The development team also focused on evaluating the network’s performance. +Additionally, the overall performance of the software and the syncing process were closely examined and assessed.

+ +

The committee for Testnet-1 was set to 21 validators, +and 584 validators joined during the Testnet period. +More than 600,000 blocks were created, and more than 1 million transactions were processed during this time. +The size of the blockchain is about 300 megabytes.

+ +

About 300,000 coins were staked during this period, it was almost 50% of the total generated coins. +It shows that users, even in Testnet, tend to stake their coins.

+ +

Staking chart

+ +

We were able to extract the confirmation time of transactions. +More than 97% of transactions were confirmed in just one block after submission. +This indicates that the transaction pool and broadcasting models are working fine.

+ +

Transaction confirmation chart

+ +

Based on logs from one of the validators, the time for creating a block is about 3 seconds in normal cases. +More than 97% of blocks are committed in the first rounds.

+ +

Consensus round chart

+ +

During Testnet-1, we released three versions(Version +0.11.0, +0.12.0, +0.13.0), and the upgrade process was smooth. +At this time, the development team decided to stop Testnet-1 and work on improvements that are not backward compatible, +including:

+ +
    +
  • Improving the consensus protocol
  • +
  • Reducing the blockchain size
  • +
  • Optimizing the network usage
  • +
+ +

After stabilizing the changes, we will announce the next Testnet, and hopefully, this will be the pre-launch Testnet.

+ +

Spacial thanks to the community

+ +

This Testnet was important for us. +It helped us learn what we need to do to make Pactus work even better. +Without the community that supports us and dedicates their time and resources to testing and feedback, +we wouldn’t have been able to progress as we have.

+ +

we thank all of them for their valuable contributions. +As promised, participants in Testnets will be given priority as validators for the MainNet, and +will receive bounty tokens from the bootstrap accounts to set up their validator.

+ +

We are grateful to all those who participated in Testnet-1, and +we encourage them to join our next Testnet to help us improve Pactus. +As a community-based project, we rely on the support of our community members, and we value any help we receive.

+ + + + +
+
+
+
+ + + + diff --git a/zh/2023/08/22/dev-report.html b/zh/2023/08/22/dev-report.html new file mode 100644 index 000000000..e4c6ef036 --- /dev/null +++ b/zh/2023/08/22/dev-report.html @@ -0,0 +1,372 @@ + + + + + + + + + + + + + Dev report | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Dev report

+ +

Abstract

+ +

there is several activities in pactus github this month, here is a clear report and explain of activities.

+ +

Github Pactus

+ +

Linters

+ +

one of new changes in pactus project is new linters we added this month. +what is linters? +linters are just a set of rules for the style of source codes, they force developers to write new codes +in correct, clean and safe way.

+ +

why we use them? +the reason we are using linters in Pactus and add new ones, is to make the code more safe, +and also make it easy to work on for new contributors because we are focus on being decentralized even in development.

+ +

Linters we added till now

+ +

TLA+ spec

+ +

one another new change in Pactus is updating TLA+ spec, which is related to consensus, +as you know we had some problem with consensus in Testnet-1, we fixed the issues and now we are trying to make it more clean.

+ +

link to changes

+ +

if you wish you can learn more about Pactus consensus here.

+ +

Refactoring

+ +

some of previous Pactus dependencies was so old, so we start refactoring them and use new libraries. +also we used some libraries with higher performance which is make Pactus full node more faster in mainnet.

+ +

one of refactors

+ + + + +
+
+
+
+ + + + diff --git a/zh/2023/09/04/introduction-to-pips.html b/zh/2023/09/04/introduction-to-pips.html new file mode 100644 index 000000000..a76dfe8f8 --- /dev/null +++ b/zh/2023/09/04/introduction-to-pips.html @@ -0,0 +1,380 @@ + + + + + + + + + + + + + Introduction to PIPs | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Introduction to PIPs

+ +

Introduction to PIPs

+ +

In our commitment to transparency and innovation, we’re excited to introduce a major step in Pactus’s journey: +the Pactus Improvement Proposals, or PIPs.

+ +

PIPs image

+ +

What are PIPs?

+ +

Pactus Improvement Proposals (PIPs) define standards for the ongoing development and enhancement of the Pactus platform. +Each PIP has a unique number like PIP-2, +PIP-3, and so on. +These proposals provide technical details for suggested modifications or enactments, serving as a guide for development.

+ +

The PIP process

+ +

The PIP process is open, allowing any member of the Pactus community to propose a PIP. +The author should provide a summary, motivation, and a detailed technical explanation. +The Pactus Laboratory team will carefully review each PIP. +Security considerations must be addressed before finalizing a PIP. +Once finalized, it can be added to the code. +This process helps avoid unexpected issues during development and maintain consistency and safety.

+ +

The Origins of PIPs

+ +

The Pactus Improvement Proposals (PIPs) was inspired by the +Ethereum Improvement Proposals (EIPs) system, +which had its roots in the Bitcoin Improvement Proposals (BIPs) and +Python Enhancement Proposals (PEPs).

+ +

New Feature Policy

+ +

From now on, all major changes or new features in the Pactus project require a PIP. +Any implementation must reference its specific PIP. +Without approval from Pactus Laboratory team, changes won’t be approved and added to the codebase.

+ +

PIPs Repository

+ +

For a complete list of Pactus Improvement Proposals, visit this link. +The corresponding GitHub repository is accessible here.

+ +

PIPs repository on Github

+ + + + +
+
+
+
+ + + + diff --git a/zh/2023/09/24/dev-report-pre-testnet-2.html b/zh/2023/09/24/dev-report-pre-testnet-2.html new file mode 100644 index 000000000..819ac7b60 --- /dev/null +++ b/zh/2023/09/24/dev-report-pre-testnet-2.html @@ -0,0 +1,390 @@ + + + + + + + + + + + + + Dev Report pre-testnet2 | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Dev Report pre-testnet2

+ +

Abstract

+ +

there is several activities in Pactus github in September month, here is a clear report and explain of activities.

+ +

Github Pactus

+ +

Implementing PIP 2, 3 and 4

+ +

After starting Pactus Labs and PIPs, +we start implementing each accepted PIP one by one to improve Pactus, here is a list of implemented PIPs:

+ + + +

Network

+ +

There is some very good change and new features for Pactus network module, +this list contain a list of important changes in Pactus networking:

+ + + +

gRPC and nanomessage services

+ +

We also updated, improved and enhanced gRPC and nanomessage services for better developer experience, +for third-party and side project developers, here is some changes:

+ + + +

Refactoring and other new feature or debugs

+ +

We had some not implemented feature request, not fixed bugs and some issue with new golang version, +list of this changes:

+ + + + + + +
+
+
+
+ + + + diff --git a/zh/2023/09/28/how-sspos-works-in-simple-word.html b/zh/2023/09/28/how-sspos-works-in-simple-word.html new file mode 100644 index 000000000..19c5fbd11 --- /dev/null +++ b/zh/2023/09/28/how-sspos-works-in-simple-word.html @@ -0,0 +1,424 @@ + + + + + + + + + + + + + How SSPoS (Solid State Proof of Stake) works in simple word | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

How SSPoS (Solid State Proof of Stake) works in simple word

+ +

Abstract

+ +

In all Blockchain protocols, there is a concept called a consensus mechanism. +This mechanism is used to enable nodes to reach an agreement +on the state of the Blockchain they are +maintaining, in order to have a synchronized and integrated Blockchain.

+ +

For now, we have a lot of consensus mechanisms in the Blockchain world. +Pactus Blockchain uses the SSPoS (Solid State Proof of State) which is a new consensus model.

+ +

To explain how it works let’s start with explaining one of the first and simplest +consensus mechanisms (or if you already know them, just jump into the last part named SSPoS).

+ +

Solid State Proof of Stake

+ +

PoW (Proof of Work)

+ +

In the proof of work model, each node in the network should solve a complex mathematical +problem that requires lots of computing resources to make a new block.

+ +

In this way, it’s highly unlikely that anyone would be able to change +past transactions and change Blockchain states such as balances, +without expending equivalent computational power.

+ +

By doing this we ensure the security and integrity of the Blockchain.

+ +

The concept was adapted from digital tokens by Hal Finney in 2004 +through the idea of “reusable proof of work” using the 160-bit secure hash algorithm 1 (SHA-1).

+ +

Bitcoin uses this consensus model.

+ +

PoS (Proof of Stake)

+ +

On the other hand, PoS or Proof of Stake is another consensus mechanism that instead of miners has validators!

+ +

Validators lock a number of their assets in the Blockchain and they can transfer or use it +till it is locked which we call staking. +after each Block is committed one of the validators will be chosen randomly (more amount of stake, +more chance to be chosen) when a validator is chosen +it proposes a block and announces it to other nodes to be validated, +when a supermajority of validators accept the block it’s going to be committed.

+ +

In this system, validators have no incentive to behave maliciously or dishonestly. +If they do, they risk losing the stake amount.

+ +

More amount of validators in a PoS Blockchain makes it more secure, +decentralized, and trustable, but it also makes the validation and consensus process slower and more difficult.

+ +

Ethereum uses this model.

+ +

DPoS (Delegated Proof of Stake)

+ +

DPoS or Delegated Proof of Stake, is a variant of the PoS consensus algorithm. +users entrust their stakes to a small group of “delegates”. +These delegates are responsible for validating transactions +and creating blocks. The number of delegates is limited +to ensure accountability and efficiency in the validation process.

+ +

Some Blockchains like Cardano and Tron use DPoS.

+ +

DPoS tries to solve the issue of PoS which when validators +increase we have an inefficient validation process. but the main issue with DPoS itself is putting a lot +of trust in the hands of a small number of delegates, +which goes against the principle of “don’t trust, verify”.

+ +

SSPoS (Solid State Proof of Stake)

+ +

BUT, HOW ABOUT SSPoS? HOW ABOUT PACTUS?

+ +

In Pactus Blockchain, we have something called Solid State Proof of Stake +and we try to fix the previous model’s issue, let me explain.

+ +

Pactus uses a dynamic committee of validators with a fixed size of 21, +but the members of the committee randomly change in each round, +based on stake amount the chance of being chosen is higher. on the other hand, +the number of validators out on the committee is unlimited, allowing anyone +to become a validator by staking coins.

+ +

At each block, validators participate in a sortition algorithm by generating a random number +between zero and the total staked coins. If the number is less +than the validator’s stake, they can enter the committee and replace the oldest committee member.

+ +

So, in SSPoS models which are a variant of PoS, we can reach a consensus, +without using high computation resources, having an inefficient +validation process by increasing validator numbers, +and also without breaking the principle of “don’t trust, verify”.

+ + + + +
+
+
+
+ + + + diff --git a/zh/2023/10/15/release-0-15-0.html b/zh/2023/10/15/release-0-15-0.html new file mode 100644 index 000000000..c93e8039d --- /dev/null +++ b/zh/2023/10/15/release-0-15-0.html @@ -0,0 +1,464 @@ + + + + + + + + + + + + + Pactus 0.15.0 released | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Pactus 0.15.0 released

+ +

Overview

+ +

Pactus Blockchain Version 0.15.0 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Splash screen

+ +

Download

+ +

This version is the bootstrap version for +Testnet-2. +To start using Pactus Blockchain Testnet-1, download the latest version from the +download page and join the Testnet.

+ +

These guides can help you to run and configure your node:

+ + + +
+ If you participated in Testnet-1, ensure to delete your previous working directory and + create a new wallet. +

+ By default, the working directory is located at "C:\Users\<name>\pactus" on Windows, + or "~/pactus" on Unix-compatible platforms. +
+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • gui: adding the splash screen (#743)
  • +
  • add absentees votes to the certificate (#746)
  • +
  • logger: short stringer for loggers (#732)
  • +
  • implementing pip-7 (#731)
  • +
  • implementing pip-11 (#712)
  • +
  • implementing pip-8 (#711)
  • +
  • implementing pip-9 (#706)
  • +
  • new API to get Public key by address (#704)
  • +
  • Adding address field for AccountInfo (#703)
  • +
  • CreateValidatorEvent and CreateAccountEvent for nanomsg (#702)
  • +
  • implementing PIP-2 and PIP-3 (#699)
  • +
  • Adding Hole Punching to network (#697)
  • +
  • write logs into file (#673)
  • +
  • check protocol support before sending connect/disconnect event (#683)
  • +
  • updating genesis for pre-testnet-2 (#679)
  • +
  • adding udp protocol for network (#672)
  • +
  • implementing pip-4 (#671)
  • +
  • Notifee service events (#628)
  • +
  • adding MinimumStake parameter (#574)
  • +
  • adding Sent and Received bytes per message metrics for peers (#618)
  • +
  • add reason to BlockResponse messages (#607)
  • +
  • Add CalcualteFee in GRPC (#601)
  • +
  • add sent bytes and received bytes metrics to peerset plus update grpc (#606)
  • +
  • added metrics of libp2p with supporting prometheus (#588)
  • +
  • Check node address is valid (#565)
  • +
  • add LastSent and LastReceived properties to peer (#569)
  • +
+ +

Fix

+ +
    +
  • data race issue on updating certificate (#747)
  • +
  • network: async connection (#744)
  • +
  • adding query vote timer for CP phase (#738)
  • +
  • trim transactions in proposed block (#737)
  • +
  • fixing query votes and proposal issue (#736)
  • +
  • fixing issue when a block has max transactions (#735)
  • +
  • consensus: anti-entroy mechanism for the consensus (#734)
  • +
  • logger: invalid level parsing error (#733)
  • +
  • cache certificate by height (#730)
  • +
  • fixing a crash on consensus (#729)
  • +
  • consensus: prevent double entry in new height (#728)
  • +
  • resolve consensus halt caused by time discrepancy in network. (#727)
  • +
  • unsorted addresses in wallet listing (#721)
  • +
  • send query votes message, if there is no proposal yet (#723)
  • +
  • fixing logger level issue (#722)
  • +
  • fixing syncing stuck issue (#720)
  • +
  • fixing some minor issues on pre-testnet (#719)
  • +
  • supporting go version 1.21 and higher (#692)
  • +
  • ensure log rotation using tests (#693)
  • +
  • restoring at the first block (#691)
  • +
  • swagger doesn’t work with multiple proto files (#687)
  • +
  • fixing wallet-cli issues (#686)
  • +
  • prevent stripping public key for subsidy transactions (#678)
  • +
  • updating the consensus protocol (#668)
  • +
  • aggregating signature for hello message (#640)
  • +
  • error case for logger (#634)
  • +
  • adding committers to the certificate (#623)
  • +
  • updating sortition executor (#608)
  • +
  • update buf and fixing proto generation issue (#600)
  • +
  • adding block hash to peer (#584)
  • +
  • copy to clipboard option for address and pubkey (#583)
  • +
  • public key aggregate (#576)
  • +
  • remove GetValidators rpc method (#573)
  • +
  • missing swagger ui for grpc get account by number (#564)
  • +
  • incorrect handler for validator by number (#563)
  • +
+ +

Refactor

+ +
    +
  • sync: refactoring syncing process (#676)
  • +
  • remove payload prefix from payload transaction type (#669)
  • +
  • change Hello message from broadcasting to direct messaging (#665)
  • +
  • committee: using generic list for validators (#667)
  • +
  • rename SanityCheck to BasicCheck (#643)
  • +
  • cli: Migrating from mow.cli to cobra for wallet (#629)
  • +
  • cli: replacing mow.cli with cobra for daemon (#621)
  • +
  • logger: using fast JSON logger (zerolog) (#613)
  • +
  • Using Generics for calculating Min and Max for numeric type #604 (#609)
  • +
  • Updating LRU cache to version 2 #514 (#602)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

+ + + + +
+
+
+
+ + + + diff --git a/zh/2023/10/15/testnet-2-launched.html b/zh/2023/10/15/testnet-2-launched.html new file mode 100644 index 000000000..d872b5cde --- /dev/null +++ b/zh/2023/10/15/testnet-2-launched.html @@ -0,0 +1,388 @@ + + + + + + + + + + + + + Testnet-2 launch announcement | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Testnet-2 launch announcement

+ +

Overview

+ +

Exciting news for the Pactus Community: Testnet-2 is has launched! +The journey through Testnet-1 +brought success and invaluable experiences, with over 500 validators joining the network. +Despite its noteworthy achievements, it also faced challenges that led to a tough decision: to pause the Testnet and +thoroughly address these issues. +After two months of dedicated work and testing, many problems have been resolved, and +we feel confident launching the Testnet again. +Testnet-2 comes with substantial improvements compared to its predecessor by enhancing the core of the Pactus Blockchain. +Notably, the new consensus mechanism and improved overall network performance.

+ +

At this point, we want to assure the Pactus community that this version of +the Testnet will not stop until the mainnet launches, +and our main focus is on improving its overall performance and launching the Mainnet.

+ +

If you’re new to the concept of Testnet, check out our informative post: +What is the Testnet?

+ +

Key Focus Areas

+ +

Testnet-2 has important tasks ahead. +Firstly, we aim to confirm that the new consensus mechanism is both safe and efficient. +A close eye will be kept on the network’s performance, ensuring it operates as expected. +For Testnet-2, the committee +size has been expanded to 51 members. +Both the committee’s performance and block production will be closely monitored. +The goal is a blockchain that remains stable and trustworthy, +even with thousands of validators in the network, +ensuring it manages its regular duties seamlessly.

+ +

How To Join

+ +

Want to join the Testnet-2? Great! It’s super easy. +Just download the latest Pactus software and you’re good to go. +no fancy setups or special gear needed. +You can run the software straight from your personal computer or laptop. +Need some test coins? Pop over to our Discord channel and share your validator address there.

+ +

Benefits for Participation

+ +

By taking part in the Testnet, users can familiarize themselves with the Pactus blockchain and +be well-prepared for the Mainnet launch. +Testnet participants will also receive higher priority during the Mainnet launch and +get free coins for initial staking on the Mainnet.

+ +

Your Feedback Matters

+ +

User feedback plays a vital role in the improvement of the Pactus blockchain. +Share your thoughts and experiences to contribute to the enhancement of future software versions.

+ + + + +
+
+
+
+ + + + diff --git a/zh/2023/10/21/release-0-15-1.html b/zh/2023/10/21/release-0-15-1.html new file mode 100644 index 000000000..1510f9ac2 --- /dev/null +++ b/zh/2023/10/21/release-0-15-1.html @@ -0,0 +1,384 @@ + + + + + + + + + + + + + Pactus 0.15.1 released | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Pactus 0.15.1 released

+ +

Overview

+ +

Pactus Blockchain Version 0.15.1 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Highlites

+ +

This version address an unforeseen issue in the consensus protocol. +We kindly ask all validators to upgrade their nodes to this version.

+ +

Download

+ +

This version has been implemented for Testnet-1 and +is being prepared for the upcoming Mainnet launch. +To start using Pactus Blockchain Testnet-2, download the latest version from the +download page and join the Testnet.

+ + + +

How to Upgrade

+ +

If you are running an older version, shut it down. +Uninstall the previous version and install the newer version. +If you are using the archived version, simply use the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Fix

+ +
    +
  • consensus: strong termination for the binary agreement (#765)
  • +
  • consensus: not increase the voting power on duplicated binary votes (#762)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

+ + + + +
+
+
+
+ + + + diff --git a/zh/2023/10/21/release-0-15-2.html b/zh/2023/10/21/release-0-15-2.html new file mode 100644 index 000000000..f62fd3ac2 --- /dev/null +++ b/zh/2023/10/21/release-0-15-2.html @@ -0,0 +1,398 @@ + + + + + + + + + + + + + Pactus 0.15.2 released | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Pactus 0.15.2 released

+ +

Overview

+ +

Pactus Blockchain Version 0.15.2 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Highlights

+ +

This version allows nodes to set limits on the number of connections they can establish. +By default, each node can have a minimum of 8 connections and a maximum of 16 connections. +Users can easily change these numbers in the configuration file.

+ +

Download

+ +

This version has been implemented for Testnet-2 and +is being prepared for the upcoming Mainnet launch. +To start using Pactus Blockchain Testnet-2, download the latest version from the +download page and join the Testnet.

+ +

These guides can help you to download, install and configure your node:

+ + + +

How to Upgrade

+ +

If you are running an older version, shut it down. +Uninstall the previous version and install the newer version. +If you are using the archived version, simply use the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • add community bootstrap nodes to testnet config (#764)
  • +
  • network: implementing connection manager (#773)
  • +
  • network: adding bootstrapper mode to the network config (#760)
  • +
+ +

Fix

+ +
    +
  • network: ensure relay is not used when there is no direct connection
  • +
  • network: close connection when unbale to get supported protocols (#781)
  • +
  • network: enabling peer exchange for bootstrappers (#779)
  • +
  • network: set connection limit for the resource manager (#775)
  • +
  • sync: peer status set to known on sucessfull handshaking (#774)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

+ + + + +
+
+
+
+ + + + diff --git a/zh/404.html b/zh/404.html new file mode 100644 index 000000000..3b1f19857 --- /dev/null +++ b/zh/404.html @@ -0,0 +1,192 @@ + + + + + + + + + + + + + Error 404, Page Not Found | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

404

+ +

Page not found :(

+

The requested page could not be found.

+
+ + + diff --git a/zh/about/faq/index.html b/zh/about/faq/index.html new file mode 100644 index 000000000..b2b9b9aef --- /dev/null +++ b/zh/about/faq/index.html @@ -0,0 +1,986 @@ + + + + + + + + + + + + + 常见问题解答 | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+

常见问题解答

+

该常见问题解答页面旨在提供有关Pactus的常见问题和关注点的有用信息和指导。 +

+
+ +
+ + + + + + + +
+
+
+ + 经济问题 +
+
+ +
+ +
+
+
+ + 交易问题 +
+
+ +
+ + + +
+
***
+ +
+ +
+
+
+ + 常规问题 +
+
+ + + +

+ Pactus是什么意思? +

+
+ Pactus一词源自拉丁语,意为共同协议、契约或交易。 在英语中,Pact一词源自拉丁词汇Pactus。 + + +
+ + + +

+ Pactus是其他任何区块链的副本吗? +

+
+ 不,Pactus不是任何其他区块链的副本或衍生品。它是一种全新而独特的区块链协议,从头开始设计。Pactus使用的共识机制是独特的,专门为解决权益证明区块链中验证者的可扩展性问题而创建。 + + +
+ + + +

+ Pactus是否有ICO? +

+
+ 不,Pactus没有ICO(首次代币发行),也没有预定义或特权账户。 Pactus区块链从零开始,所有的币都是通过共识机制铸造的。 这确保了币的分配是公平的,没有财富的集中化。 + + +
+ + + +

+ Where can I buy Pactus coins? +

+
+ Pactus does not have any pre-sales coins. The only way to obtain Pactus coins at the moment is by installing the Pactus software and actively participating in block validation. By engaging in the network and contributing to block validation, you will be rewarded with Pactus coins. + + +
+ + + +

+ 为什么开发Pactus? +

+
+ Pactus的开发目标是在不影响安全性和去中心化的前提下扩展区块链规模。 为了实现这一目标,Pactus采用了独特的共识机制,可以在10秒内创建区块。 此外,Pactus旨在让所有用户更容易使用,无论他们的技术专业知识或财务资源如何。

我们致力于去中心化和公平,这反映在我们从零开始启动Pactus区块链, 并确保所有币都是通过共识机制铸造的,而不是通过ICO或特权账户铸造。 + + +
+ + + +

+ Pactus解决了其他区块链无法解决的问题是什么? +

+
+ Pactus tries to solve several problems faced by other blockchain networks, including:

Scalability: Pactus has a unique consensus mechanism that is specifically designed to address the scalability issue without sacrificing the security and decentralization.

Accessibility: Running a node on Pactus is designed to be more accessible to normal users compared to other blockchains.

Fairness in distribution: Pactus has a fair and transparent coin distribution model, and all coins are generated through the consensus mechanism.

Storage cost: Pactus offers a novel storage solution by allowing users to allocate dedicated storage files, reducing storage costs and simplifying the smart contracts. + + +
+ + + +

+ Pactus与比特币有何不同? +

+
+ Pactus和比特币是两种不同类型的区块链网络。 + 比特币使用称为工作量证明的过程来保护其网络,而Pactus使用一种称为股权证明的不同方法。 +这意味着,验证者负责对进入的区块进行投票,必须持有网络的一定数量的代币,即押金,以防止恶意行为。 + + +
+ + + +

+ Pactus与以太坊有何不同? +

+
+ Pactus and Ethereum are both Proof of Stake blockchains, but they differ in their approach to running a validator. Running a validator on Ethereum can be challenging and requires 32 Ethereum coins to stake. In contrast, Pactus is designed to be more accessible to normal users. There is no minimum stake requirement, and you can run the Pactus node on personal Computers with basic hardware. This approach reflects our commitment to promoting decentralization and making blockchain technology accessible to a wider audience. + + +
+ +
+ +
+
+
+ + 验证节点问题 +
+
+ + + +

+ 什么是验证节点? +

+
+ 在Pactus上,验证者负责处理交易和创建区块,通过这样的方式帮助保护网络并使其去中心化。 他们使用自己的代币作为押金以确保网络的安全,并获得其贡献的奖励。 + + +
+ + + +

+ 我可以质押的最小和最大金额是多少? +

+
+ In Pactus, there is no minimum limit for staking coins, but the maximum amount you can stake is 1000 coins. If you want to stake more than 1000 coins, you can run a new validator. Running multiple validators keeps the network more decentralized and helps maintain its security and stability. + + +
+ + + +

+ Why is there a limit for maximum stake? +

+
+ The limit for the maximum stake per validator enhances decentralization and prevents validators from gaining too much power, which could potentially lead them to control the committee. The maximum staking limit is part of the consensus parameters and can be changed in the future through consensus among the validators. + +
+ + + +

+ Can I run multiple validators on one computer? +

+
+ The Pactus software allows you to run up to 32 validators on a single node. Running multiple validators may require slightly more memory, but it has no impact on storage, and has a negligible effect on CPU and networking usage. Running multiple validators on a single node enables users to distribute their stake across multiple validators, especially when they want to stake more than the maximum stake per validator. This eliminates the need for additional resources and simplifies node management. + + +
+ + + +

+ 验证者如何获得奖励? +

+
+ Once a validator proposes a valid block and it is accepted by the network, the validator receives one coin as a block reward. The reward is an incentive given to validators for their contribution to the network. + + +
+ + + +

+ Pactus中的区块奖励是多少? +

+
+ Pactus的区块奖励是固定的,每个区块始终为1枚币。这种平坦奖励方案有助于确保简单性、公平性和更好的币分配。 + + + Pactus中的区块奖励是多少? + +
+ +
+ +
+
+
+ + 共识问题 +
+
+ + + +

+ Pactus区块链是如何工作的? +

+
+ Pactus使用一个验证者委员会来创建新的区块。 委员会由21个验证者组成,但委员会成员随时间随机变化。 每10秒,委员会中的验证者(称为提案者)收集所有有效交易,将它们添加到一个区块中, 并与委员会中的其他验证者分享。 如果委员会中的超过2/3的利益相关者签署并认可提议的区块, 区块就会被提交,区块中的所有交易将得到执行。 这个过程每10秒重复一次。 + + + Pactus区块链是如何工作的? + +
+ + + +

+ 验证者如何进入委员会? +

+
+ To enter the committee in Pactus, validators participate in a sortition process that occurs at each block. In this process, validators generate a provable random number between zero and the total staked coins, and if the number is less than their stake, they can send a transaction known as sortition transaction with the proof of sortition. Once the sortition transaction is included in a block, the validator replaces the oldest committee member. + + +
+ + + +

+ 委员会内如何选择区块提议者? +

+
+ 在委员会内部,区块提议者是根据他们进入委员会的时间进行选择的。 这意味着选择过程遵循先来先提出的顺序。 + + +
+ + + +

+ 是否可以让多个验证者同时进入委员会? +

+
+ The process of sortition in Pactus is random, so it's possible for more than one validator to enter the committee at once, or no validator at all. However, on average, one validator should join the committee at each block. + + +
+ + + +

+ Pactus区块链是否可能同时出现两个有效区块? +

+
+ 在Pactus区块链中,不可能同时出现两个有效区块。 Pactus的共识算法防止了同时出现两个区块提议者的可能性。 这确保了网络中不会出现分叉。 + + +
+ +
+ +
+
+
+ + 经济问题 +
+
+ + + +

+ Pactus币的总供应量是多少? +

+
+ Pactus的总供应量为2100万枚币,每枚币被分为10亿个单位。每10秒钟会生成一枚新的币,每天会产生8640枚币,每年约300万枚币。所有币将在7年内产生。 + + + Pactus币的总供应量是多少? + +
+ + + +

+ 什么是国库账户? +

+
+ 国库账户是Pactus区块链中的一个特殊账户,持有总供应量2100万个币。它在创世时创建,没有与之关联的密钥对,这意味着任何人都无法访问或控制它。每当创建一个区块时,从国库账户中转移一枚币到提案者账户作为区块奖励。 + + +
+ +
+ +
+
+
+ + 交易问题 +
+
+ + + +

+ 什么是转账交易? +

+
+ 转账交易是一种允许用户将Pactus币从一个账户转移到另一个账户的交易类型。 + + +
+ + + +

+ 什么是绑定交易? +

+
+ A bond transaction is a type of transaction that allows users to become a validator by staking some coins. The amount of stake determines the voting power in the consensus. + + +
+ + + +

+ 什么是随机交易? +

+
+ 随机交易是一种交易类型,允许验证者进入委员会。 + + +
+ + + +

+ 什么是解除绑定交易? +

+
+ An unbond transaction is a type of transaction that allows users to unbond their validator. Once a validator is unbonded, they can no longer participate in the consensus mechanism. + + +
+ + + +

+ 什么是提现交易? +

+
+ 提现交易是一种交易类型,允许验证者从网络中提取他们抵押的币。 + + +
+ +
+ +
+
+
+ + 手续费问题 +
+
+ + + +

+ Pactus的交易费是如何计算的? +

+
+ Pactus的交易费是使用基于百分比的费用模型来计算的。 这意味着费用是转账金额的百分比,有最低和最高费用。 百分比、最低费用和最高费用参数是区块链参数的一部分, 可以通过所有验证者的共识机制进行更改。 + + +
+ + + +

+ 最低和最高费用是多少? +

+
+ 这些参数旨在提供更大的控制力来管理费用结构, 并确保费用保持在一定范围内。 如果交易的计算费用低于最低费用,则使用最低费用。 同样,如果计算的费用超过了最高费用,则使用最高费用。 这有助于防止用户为交易支付过高或过低的费用, 并在费用结构上提供更大的可预测性和公平性。 + + +
+ + + +

+ 为什么选择基于百分比的费用模型? +

+
+ 选择基于百分比的费用模型是因为它为用户提供了更加公平和可预测的费用结构, 因为费用与转移金额成比例。 它还允许更大的灵活性来调整费用结构, 以更好地满足区块链及其用户的需求, 因为百分比、最低费用和最高费用参数可以通过所有验证者同意的共识机制进行更改。 + + +
+ +
+ +
+ + + + +
+ +
+
+
+
+ + + + + diff --git a/zh/about/roadmap/index.html b/zh/about/roadmap/index.html new file mode 100644 index 000000000..4f0d23635 --- /dev/null +++ b/zh/about/roadmap/index.html @@ -0,0 +1,486 @@ + + + + + + + + + + + + + 路线图 | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+

路线图

+ +
+
✅ 已完成任务
+
🚧 正在进行的任务
+
⏳ 即将进行的任务
+
+ +
+
+
+
+
+
+
Smart Contract Engine
+
Q3 2024
+
+
+
+
+
+
+
Mobile Wallet
+
Q2 2024
+
+
+
+
+
+
+
Main Net Launch
+
Q1 2024
+
+
+
+
+
+
+ +
Oct 2023
+
+
+
+
+
+
+ +
Oct 2023
+
+
+
+
+
+
+ +
Aug 2023
+
+
+
+
+
+
+ +
Jul 2023
+
+
+
+
+
+
+ +
June 2023
+
+
+
+
+
+
+ +
May 2023
+
+
+
+
+
+
+ +
May 2023
+
+
+
+
+
+
+ +
May 2023
+
+
+
+
+
+
+ +
April 2023
+
+
+
+
+
+
+ +
September 2022
+
+
+
+
+
+
+ +
September 2022
+
+
+
+
+
+
+ +
+
+
+
+ + + + + diff --git a/zh/about/what-is-pactus/index.html b/zh/about/what-is-pactus/index.html new file mode 100644 index 000000000..1c8e9225e --- /dev/null +++ b/zh/about/what-is-pactus/index.html @@ -0,0 +1,375 @@ + + + + + + + + + + + + + 什么是帕克图斯? | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+

什么是帕克图斯?

+ +
+ +
+
+

帕克图斯是一个专注于去中心化的区块链

+ 帕克图斯建立在这样一个原则之上,即仅通过去中心化才能实现公平和透明的系统。 与许多其他区块链平台不同,帕克图斯旨在通过消除委托和矿工的需要,消除集中化和操纵的潜力。 这使任何人都可以成为该生态系统的一部分,并确保平台保持真正的去中心化。 + +
+
+ +
+
+

帕克图斯是一种用户友好的区块链

+ 帕克图斯旨在创建一种用户友好的区块链,任何人都可以轻松使用,而不仅仅是技术专家。 我们的协议旨在简单易用、易于维护和开发。帕克图斯提供了一个简单的GUI应用程序, 使用户可以轻松运行节点。 + +
+
+ +
+
+

帕克图斯采用基于百分比的费用模型

+ 交易费用是基于百分比模型计算的,设定了最小和最大费用。这些参数提供了更大的费用结构控制, 防止过高或过低的支付。基于百分比的模型确保公平和可预测性, 可通过所有验证人的共识进行调整。 + +
+
+ +
+
+

帕克图斯的专用去中心化存储

+ 在帕克图斯中,用户可以购买一个专用存储文件,可每年更新, 从而降低存储和智能合约执行成本。这一独特功能可以为去中心化平台开辟新的协议之路。 + +
+
+ +
+ +
+
+
+
+ + + + + diff --git a/zh/android-chrome-192x192.png b/zh/android-chrome-192x192.png new file mode 100644 index 000000000..8a8e2b6d8 Binary files /dev/null and b/zh/android-chrome-192x192.png differ diff --git a/zh/android-chrome-256x256.png b/zh/android-chrome-256x256.png new file mode 100644 index 000000000..827219e8a Binary files /dev/null and b/zh/android-chrome-256x256.png differ diff --git a/zh/apple-touch-icon.png b/zh/apple-touch-icon.png new file mode 100644 index 000000000..1fa36ea07 Binary files /dev/null and b/zh/apple-touch-icon.png differ diff --git a/zh/assets/css/custom.css b/zh/assets/css/custom.css new file mode 100644 index 000000000..6ce37f1d7 --- /dev/null +++ b/zh/assets/css/custom.css @@ -0,0 +1 @@ +body{font-family:"Open Sans",sans-serif;font-weight:400;color:#4c4c4c;background-color:#edeef0;max-width:1200px;margin:0 auto}.navbar .nav-top{height:86px}.navbar .fixed-menu{width:220px}.navbar .logo img{width:200px}a{text-decoration:none}a a:hover:not(.btn){color:#021a34 !important}h1,h2{font-weight:500;line-height:1.25;padding-bottom:12px;padding-top:14px}h1{font-weight:600}.motto .title{font-weight:600;font-size:32px;padding-top:18px}.motto .motto{font-weight:500;font-size:21px}.btn-fixed{border-width:2px;border-style:solid;width:220px;height:46px;text-transform:uppercase;font-weight:700;border-radius:0%;vertical-align:middle !important;line-height:46px;padding:0;margin:16px}.btn-fixed.btn-more{color:#021a34;border-color:#021a34}.btn-fixed.btn-more:hover{background-color:#021a34;color:#edeef0 !important}.btn-fixed.btn-faq{border-color:#021a34;background-color:#021a34;color:#edeef0}.btn-fixed.btn-faq:hover{background-color:#021a34;color:#edeef0 !important}.btn-fixed.btn-community{border-color:#e03c3c;background-color:#e03c3c;color:#edeef0 !important}.btn-fixed.btn-community:hover{background-color:#e03c3c;color:#edeef0 !important}.footer .text-muted{color:#edeef0 !important;font-size:12px}.footer .text-muted a{color:#edeef0 !important}.pactus-video video{max-width:100%;width:100%;margin-left:auto;margin-right:auto;display:block}.highlighter-rouge .highlight pre{padding:32px 12px 12px 12px;color:#edeef0;position:relative;overflow:auto;direction:ltr}.highlighter-rouge .highlight pre button{position:absolute;top:6px;right:8px;padding:2px;background-color:gray;color:#404040;border-radius:5px;border:ridge 1px gray}.highlighter-rouge .highlight pre button:hover{cursor:pointer;background-color:#bcbabb}.nav-tabs{border-color:#404040 !important}.nav-tabs a{color:#404040}.nav-tabs .nav-link{border-width:0 !important}.nav-tabs .nav-link:not(.active):hover{background-color:gray !important;color:#edeef0 !important}.nav-tabs .active{color:#edeef0 !important;background-color:#404040 !important}table tbody tr:nth-child(2n+1) td{background-color:#eee}blockquote{background:#eee;border-left:10px solid #ccc;padding:16px;quotes:"“" "”" "‘" "’"}blockquote:before{color:#ccc;content:open-quote;font-size:64px;line-height:.1em;vertical-align:-0.4em}blockquote p{margin-top:16px}blockquote p:first-child{display:inline;padding-bottom:160px;margin-bottom:160px}.footer{background-color:#021a34 !important;color:#edeef0 !important}.footer .section{font-size:1.75rem;font-weight:500;line-height:1.25;padding-bottom:20px}.footer li{padding-bottom:8px !important}.footer.anchor a{color:#fff}.footer.anchor a:link{color:#eff1ef;background-color:rgba(0,0,0,0) !important;text-decoration:none !important}.footer.anchor a:hover{color:#eff1ef !important}.community img{margin:4px}#btn-back-to-top{background-color:#021a34;color:#edeef0;position:fixed;bottom:20px;right:20px;display:none}.edit-bar{padding-top:30px}.edit-bar .edit-btn,.edit-bar .edit-btn>a:hover{color:#4c4c4c;text-decoration:none}.all-posts .post-link{padding-bottom:8px}.blog-post .post-date{padding-bottom:10px;color:gray}.blog-post .content{padding-top:22px;min-height:600px}.partners img{padding-top:24px}.hexdump{font-family:monospace;font-size:12px;padding-bottom:1rem}.hexdump .offset{border-right:2px solid #708090;color:#789}.hexdump .ascii{color:dimgray}.faq h3{margin-top:20px;padding-top:16px;border-top:1px solid #4c4c4c}.faq a{text-decoration:none}.faq .group{padding-top:16px}.faq .group .col{font-weight:600;padding-bottom:10px}.faq .separator{padding-top:12px;padding-bottom:12px}.toc .btn,.toc a{color:#4c4c4c !important}.toc .btn-section{padding:.25rem .5rem;font-weight:600;background-color:rgba(0,0,0,0)}.toc .btn-section:hover,.toc .btn-section:focus{background-color:#d2f4ea}.toc .btn-section::before{width:1.25em;line-height:0;content:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='rgba%280,0,0,.5%29' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 14l6-6-6-6'/%3e%3c/svg%3e");transition:transform .35s ease;transform-origin:.5em 50%}.toc .btn-page a{padding:.1875rem .5rem;margin-top:.125rem;margin-left:1.25rem}.toc .btn-page a:hover,.toc .btn-page a:focus,.toc .btn-page .selected{background-color:#d2f4ea}.timeline{position:relative}.timeline::after{content:"";position:absolute;width:6px;background-color:#939597;top:0;bottom:0;left:50%;margin-left:-3px}.timeline-card{position:relative;background-color:inherit;width:50%}.timeline-card .card-title{padding-bottom:12px;font-size:1.3rem;font-weight:500}.timeline-card::after{line-height:38px;font-size:24px;position:absolute;text-align:center;width:48px;height:48px;right:-24px;top:15px;border-radius:50%;z-index:1}.timeline-card.completed::after{content:"✅";background-color:#eee;border:5px solid #77b255}.timeline-card.ongoing::after{content:"🚧";background-color:#eee;border:5px solid #ffcb4b}.timeline-card.upcoming::after{content:"⏳";background-color:#eee;border:5px solid #478ec2}.timeline-card.left{padding:0px 50px 20px 0px;left:0}.timeline-card.right{padding:0px 0px 20px 50px;left:50%}.timeline-card.left::before{content:"";position:absolute;height:20px;width:20px;background:#fff;box-sizing:border-box;transform:rotate(45deg) translate(-50%);top:34px;z-index:0;right:34px;border:1px solid rgba(0,0,0,.175)}.timeline-card.right::before{content:"";position:absolute;height:20px;width:20px;background:#fff;box-sizing:border-box;transform:rotate(45deg) translate(-50%);top:34px;z-index:0;left:48px;border:1px solid rgba(0,0,0,.175)}.timeline-card.right::after{left:-24px}@media screen and (max-width: 600px){.timeline::after{left:31px}.timeline-card{width:100%;padding-left:80px !important;padding-right:25px !important}.timeline-card::before{left:80px !important}.timeline-card.left::after,.timeline-card.right::after{left:8px !important}.timeline-card.left::before{right:auto}.timeline-card.right{left:0%}}.learn h2{border-top:1px solid gray}/*# sourceMappingURL=custom.css.map */ \ No newline at end of file diff --git a/zh/assets/css/custom.css.map b/zh/assets/css/custom.css.map new file mode 100644 index 000000000..4131e3d24 --- /dev/null +++ b/zh/assets/css/custom.css.map @@ -0,0 +1 @@ +{"version":3,"sourceRoot":"","sources":["../../_sass/_styles.scss","../../_sass/_vars.scss","../../_sass/_hexdump.scss","../../_sass/_faq.scss","../../_sass/_toc.scss","../../_sass/_roadmap.scss","../../_sass/_learn.scss"],"names":[],"mappings":"CAEA,KACE,mCACA,gBACA,MCFW,QDGX,iBCJS,QDKT,iBACA,cAIA,iBACE,YAGF,oBACE,YAGF,kBACE,YAIJ,EACE,qBAEA,oBACE,yBAIJ,MAEE,gBACA,iBACA,oBACA,iBAGF,GACE,gBAIA,cACE,gBACA,eACA,iBAGF,cACE,gBACA,eAKJ,WACE,iBACA,mBACA,YACA,YACA,yBACA,gBACA,iBACA,iCACA,iBACA,UACA,YAEA,oBACE,MCzEY,QD0EZ,aC1EY,QD4EZ,0BACE,iBC7EU,QD8EV,yBAIJ,mBACE,aCnFY,QDoFZ,iBCpFY,QDqFZ,MCnFO,QDqFP,yBACE,iBCxFU,QDyFV,yBAIJ,yBACE,aC1Fc,QD2Fd,iBC3Fc,QD4Fd,yBAEA,+BACE,iBC/FY,QDgGZ,yBAMJ,oBACE,yBACA,eAEA,sBACE,yBAMJ,oBACE,eACA,WACA,iBACA,kBACA,cAIJ,kCACE,4BACA,MC9HS,QD+HT,kBACA,cACA,cAEA,yCACE,kBACA,QACA,UAEA,YACA,sBACA,cACA,kBACA,sBAEA,+CACE,eACA,yBAKN,UACE,gCAEA,YACE,cAGF,oBACE,0BAEA,uCACE,iCACA,yBAIJ,kBACE,yBACA,oCAKF,kCACE,sBAIJ,WACE,gBACA,4BACA,aACA,uBAEA,kBACE,WACA,mBACA,eACA,iBACA,sBAGF,aACE,gBAGF,yBACE,eACA,qBACA,oBAIJ,QACE,oCACA,yBAEA,iBACE,kBACA,gBACA,iBACA,oBAGF,WACE,8BAIA,iBACE,WAGF,sBACE,cACA,0CACA,gCAGF,uBACE,yBAMJ,eACE,WAIJ,iBACE,iBCnPc,QDoPd,MClPS,QDmPT,eACA,YACA,WACA,aAGF,UACE,iBAGA,gDAEE,MC9PS,QD+PT,qBAKF,sBACE,mBAKF,sBACE,oBACA,WAEF,oBACE,iBACA,iBAKF,cACE,iBEzRJ,SACE,sBACA,eACA,oBAGF,iBACE,+BACA,WAEF,gBACE,cCRA,QACE,gBACA,iBACA,6BAGF,OACE,qBAGF,YACE,iBAEA,iBACE,gBACA,oBAIJ,gBACE,iBACA,oBCrBF,iBAEE,yBAGF,kBACE,qBACA,gBACA,+BAGF,gDAEE,yBAGF,0BACE,aACA,cACA,yQACA,+BACA,0BAGF,iBACE,uBACA,mBACA,oBAGF,uEAGE,yBCjCJ,UACE,kBAGA,iBACE,WACA,kBACA,UACA,iBAXS,QAYT,MACA,SACA,SACA,iBAKJ,eACE,kBACA,yBACA,UAEA,2BACE,oBACA,iBACA,gBAGF,sBACE,iBACA,eACA,kBACA,kBACA,WACA,YACA,YACA,SACA,kBACA,UAGF,gCACE,YACA,sBACA,yBAGF,8BACE,aACA,sBACA,yBAGF,+BACE,YACA,sBACA,yBAIF,oBACE,0BACA,OAIF,qBACE,0BACA,SAIF,4BACE,WACA,kBACA,YACA,WACA,gBACA,sBACA,wCACA,SACA,UACA,WACA,kCAIF,6BACE,WACA,kBACA,YACA,WACA,gBACA,sBACA,wCACA,SACA,UACA,UACA,kCAIF,4BACE,WAKJ,qCAEE,iBACE,UAIF,eACE,WACA,6BACA,8BAGA,uBACE,qBAIF,uDAEE,oBAGF,4BACE,WAIF,qBACE,SCzIJ,UACE,WLCS","sourcesContent":["@import \"vars\";\n\nbody {\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n color: $font-color;\n background-color: $bg-color;\n max-width: 1200px;\n margin: 0 auto;\n}\n\n.navbar {\n .nav-top {\n height: 86px;\n }\n\n .fixed-menu {\n width: 220px;\n }\n\n .logo img {\n width: 200px;\n }\n}\n\na {\n text-decoration: none;\n\n a:hover:not(.btn) {\n color: $primary-color !important;\n }\n}\n\nh1,\nh2 {\n font-weight: 500;\n line-height: 1.25;\n padding-bottom: 12px;\n padding-top: 14px;\n}\n\nh1 {\n font-weight: 600;\n}\n\n.motto {\n .title {\n font-weight: 600;\n font-size: 32px;\n padding-top: 18px;\n }\n\n .motto {\n font-weight: 500;\n font-size: 21px;\n }\n\n}\n\n.btn-fixed {\n border-width: 2px;\n border-style: solid;\n width: 220px;\n height: 46px;\n text-transform: uppercase;\n font-weight: 700;\n border-radius: 0%;\n vertical-align: middle !important;\n line-height: 46px;\n padding: 0;\n margin: 16px;\n\n &.btn-more {\n color: $primary-color;\n border-color: $primary-color;\n\n &:hover {\n background-color: $primary-color;\n color: $bg-color !important;\n }\n }\n\n &.btn-faq {\n border-color: $primary-color;\n background-color: $primary-color;\n color: $bg-color;\n\n &:hover {\n background-color: $primary-color;\n color: $bg-color !important;\n }\n }\n\n &.btn-community {\n border-color: $community-color;\n background-color: $community-color;\n color: $bg-color !important;\n\n &:hover {\n background-color: $community-color;\n color: $bg-color !important;\n }\n }\n}\n\n.footer {\n .text-muted {\n color: $bg-color !important;\n font-size: 12px;\n\n a {\n color: $bg-color !important;\n }\n }\n}\n\n.pactus-video {\n video {\n max-width: 100%;\n width: 100%;\n margin-left: auto;\n margin-right: auto;\n display: block;\n }\n}\n\n.highlighter-rouge .highlight pre {\n padding: 32px 12px 12px 12px;\n color: $bg-color;\n position: relative;\n overflow: auto;\n direction: ltr;\n\n button {\n position: absolute;\n top: 6px;\n right: 8px;\n\n padding: 2px;\n background-color: #808080;\n color: #404040;\n border-radius: 5px;\n border: ridge 1px #808080;\n\n &:hover {\n cursor: pointer;\n background-color: #bcbabb;\n }\n }\n}\n\n.nav-tabs {\n border-color: #404040 !important;\n\n a {\n color: #404040;\n }\n\n .nav-link {\n border-width: 0 !important;\n\n &:not(.active):hover {\n background-color: #808080 !important;\n color: $bg-color !important;\n }\n }\n\n .active {\n color: $bg-color !important;\n background-color: #404040 !important;\n }\n}\n\ntable {\n tbody tr:nth-child(2n + 1) td {\n background-color: #eee;\n }\n}\n\nblockquote {\n background: #eee;\n border-left: 10px solid #ccc;\n padding: 16px;\n quotes: \"\\201C\"\"\\201D\"\"\\2018\"\"\\2019\";\n\n &:before {\n color: #ccc;\n content: open-quote;\n font-size: 64px;\n line-height: 0.1em;\n vertical-align: -0.4em;\n }\n\n p {\n margin-top: 16px;\n }\n\n & p:first-child {\n display: inline;\n padding-bottom: 160px;\n margin-bottom: 160px;\n }\n}\n\n.footer {\n background-color: $primary-color !important;\n color: $bg-color !important;\n\n .section {\n font-size: 1.75rem;\n font-weight: 500;\n line-height: 1.25;\n padding-bottom: 20px;\n }\n\n li {\n padding-bottom: 8px !important;\n }\n\n &.anchor {\n a {\n color: #ffffff;\n }\n\n a:link {\n color: rgb(239, 241, 239);\n background-color: transparent !important;\n text-decoration: none !important;\n }\n\n a:hover {\n color: rgb(239, 241, 239) !important;\n }\n }\n}\n\n.community {\n img {\n margin: 4px;\n }\n}\n\n#btn-back-to-top {\n background-color: $primary-color;\n color: $bg-color;\n position: fixed;\n bottom: 20px;\n right: 20px;\n display: none;\n}\n\n.edit-bar {\n padding-top: 30px;\n // border-top: $border-top;\n\n .edit-btn,\n .edit-btn>a:hover {\n color: $font-color;\n text-decoration: none;\n }\n}\n\n.all-posts {\n .post-link {\n padding-bottom: 8px;\n }\n}\n\n.blog-post {\n .post-date {\n padding-bottom: 10px;\n color: #808080;\n }\n .content {\n padding-top: 22px;\n min-height: 600px;\n }\n}\n\n.partners {\n img {\n padding-top: 24px;\n }\n}\n","$primary-color: #021a34;\n$secondary-color: #23547b;\n$bg-color: #edeef0;\n$font-color: #4c4c4c;\n$community-color: #e03c3c;\n$border-top: 1px solid gray;\n",".hexdump {\n font-family: monospace;\n font-size: 12px;\n padding-bottom: 1rem;\n}\n\n.hexdump .offset {\n border-right: 2px solid #708090;\n color: #778899;\n}\n.hexdump .ascii {\n color: #696969;\n}\n","@import \"vars\";\n\n.faq {\n h3 {\n margin-top: 20px;\n padding-top: 16px;\n border-top: 1px solid $font-color;\n }\n\n a {\n text-decoration: none;\n }\n\n .group {\n padding-top: 16px;\n\n .col {\n font-weight: 600;\n padding-bottom: 10px;\n }\n }\n\n .separator {\n padding-top: 12px;\n padding-bottom: 12px;\n }\n}\n","@import \"vars\";\n\n.toc {\n .btn,\n a {\n color: $font-color !important;\n }\n\n .btn-section {\n padding: 0.25rem 0.5rem;\n font-weight: 600;\n background-color: transparent;\n }\n\n .btn-section:hover,\n .btn-section:focus {\n background-color: #d2f4ea;\n }\n\n .btn-section::before {\n width: 1.25em;\n line-height: 0;\n content: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='rgba%280,0,0,.5%29' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 14l6-6-6-6'/%3e%3c/svg%3e\");\n transition: transform 0.35s ease;\n transform-origin: 0.5em 50%;\n }\n\n .btn-page a {\n padding: 0.1875rem 0.5rem;\n margin-top: 0.125rem;\n margin-left: 1.25rem;\n }\n\n .btn-page a:hover,\n .btn-page a:focus,\n .btn-page .selected {\n background-color: #d2f4ea;\n }\n}\n","$line-color: #939597;\n\n/* The actual timeline (the vertical ruler) */\n.timeline {\n position: relative;\n\n /* The actual timeline (the vertical ruler) */\n &::after {\n content: \"\";\n position: absolute;\n width: 6px;\n background-color: $line-color;\n top: 0;\n bottom: 0;\n left: 50%;\n margin-left: -3px;\n }\n}\n\n/* Container around content */\n.timeline-card {\n position: relative;\n background-color: inherit;\n width: 50%;\n\n .card-title {\n padding-bottom: 12px;\n font-size: 1.3rem;\n font-weight: 500;\n }\n /* The circles on the timeline */\n &::after {\n line-height: 38px;\n font-size: 24px;\n position: absolute;\n text-align: center;\n width: 48px;\n height: 48px;\n right: -24px;\n top: 15px;\n border-radius: 50%;\n z-index: 1;\n }\n\n &.completed::after {\n content: \"✅\";\n background-color: #eeeeee;\n border: 5px solid #77b255;\n }\n\n &.ongoing::after {\n content: \"🚧\";\n background-color: #eeeeee;\n border: 5px solid #ffcb4b;\n }\n\n &.upcoming::after {\n content: \"⏳\";\n background-color: #eeeeee;\n border: 5px solid #478ec2;\n }\n\n /* Place the container to the left */\n &.left {\n padding: 0px 50px 20px 0px;\n left: 0;\n }\n\n /* Place the container to the right */\n &.right {\n padding: 0px 0px 20px 50px;\n left: 50%;\n }\n\n /* Add arrows to the left container (pointing right) */\n &.left::before {\n content: \"\";\n position: absolute;\n height: 20px;\n width: 20px;\n background: white;\n box-sizing: border-box;\n transform: rotate(45deg) translate(-50%);\n top: 34px;\n z-index: 0;\n right: 34px;\n border: 1px solid rgba(0, 0, 0, 0.175);\n }\n\n /* Add arrows to the right container (pointing left) */\n &.right::before {\n content: \"\";\n position: absolute;\n height: 20px;\n width: 20px;\n background: white;\n box-sizing: border-box;\n transform: rotate(45deg) translate(-50%);\n top: 34px;\n z-index: 0;\n left: 48px;\n border: 1px solid rgba(0, 0, 0, 0.175);\n }\n\n /* Fix the circle for containers on the right side */\n &.right::after {\n left: -24px;\n }\n}\n\n/* Media queries - Responsive timeline on screens less than 600px wide */\n@media screen and (max-width: 600px) {\n /* Place the timeline to the left */\n .timeline::after {\n left: 31px;\n }\n\n /* Full-width containers */\n .timeline-card {\n width: 100%;\n padding-left: 80px !important;\n padding-right: 25px !important;\n\n /* Make sure that all arrows are pointing leftwards */\n &::before {\n left: 80px !important;\n }\n\n /* Make sure all circles are at the same spot */\n &.left::after,\n &.right::after {\n left: 8px !important;\n }\n\n &.left::before {\n right: auto;\n }\n\n /* Make all right containers behave like the left ones */\n &.right {\n left: 0%;\n }\n }\n}\n","@import \"vars\";\n\n.learn {\n h2 {\n border-top: $border-top;\n }\n}\n"],"file":"custom.css"} \ No newline at end of file diff --git a/zh/blog/index.html b/zh/blog/index.html new file mode 100644 index 000000000..6e17a8f0a --- /dev/null +++ b/zh/blog/index.html @@ -0,0 +1,486 @@ + + + + + + + + + + + + + 博客 | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

所有文章

+ + + feed + +
+ +
+ + +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + + + +
+ +
+
+
+
+ + + + + diff --git a/zh/browserconfig.xml b/zh/browserconfig.xml new file mode 100644 index 000000000..b3930d0f0 --- /dev/null +++ b/zh/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #da532c + + + diff --git a/zh/community/index.html b/zh/community/index.html new file mode 100644 index 000000000..a2e245d29 --- /dev/null +++ b/zh/community/index.html @@ -0,0 +1,374 @@ + + + + + + + + + + + + + 社区 | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+

加入帕克图斯社区

+ +

加入帕克图斯社区,您将成为一个全球创新者、思想家和实践者网络的一部分, 所有这些人都有一个共同的愿景,即利用区块链技术构建更美好的未来。无论您是开发人员、企业家、投资者, 还是一个区块链爱好者,在这里,都有一个属于您的位置。
所以,让我们携手并肩,创造改变吧!

+ + + +
+
+
+
+ + + + + diff --git a/zh/contributing/index.html b/zh/contributing/index.html new file mode 100644 index 000000000..b3393e2ca --- /dev/null +++ b/zh/contributing/index.html @@ -0,0 +1,399 @@ + + + + + + + + + + + + + 贡献 | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+

贡献

+ + +

As an open-source platform, Pactus blockchain empowers from its community. +Whether you’re a developer, designer, or enthusiast, your contributions can make a meaningful impact.

+ +

There are several ways to support the Pactus project:

+ +

Run a Node

+ +

One of the most effective ways to contribute to the Pactus network is by running a node. +A “node” is a software program that downloads a copy of the Pactus blockchain and +ensure the network keeps running safe and decentralized.

+ +

These guides can help you to run and configure your node:

+ + + +

Become a Validator

+ +

Validators play an important role in the Pactus blockchain by verifying transactions and +adding them to the blockchain. +By becoming a validator, you can earn rewards +for contributing to the network’s security and decentralization.

+ +

To become a validator, you will need to stake a certain amount of Pactus coins. +These guides can help you to send a Bond transaction and stake some coins:

+ + + +

Develop

+ +

Pactus is an open-source project that welcomes and encourages contributions from developers. +By contributing to the project, you can help improve the Pactus platform and create new features that +benefit the entire community.

+ +

You can check our Contributing page +for more information on how to get involved and contribute to the project.

+ +

Translation

+ +

Another way to contribute to the Pactus project is by translating this website into other languages and +improving its content.

+ +

Spread the Word

+ +

The more people who know about Pactus, the more opportunities there are for collaboration and growth. +Share our project on social media, attend Pactus events, or simply tell your friends and colleagues about us.

+ +
+ +

Together, Let’s build a better future for blockchain technology.

+ + +
+
+
+
+ + + + + diff --git a/zh/download/index.html b/zh/download/index.html new file mode 100644 index 000000000..85424893b --- /dev/null +++ b/zh/download/index.html @@ -0,0 +1,489 @@ + + + + + + + + + + + + + 下载 | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+

下载帕克图斯

+ +

在此页面上,您可以找到如何下载和获取帕克图斯软件的最新版本。

+ +
+ +

🏗️ 从源代码编译

+ +

帕克图斯项目是作为开源软件分发的,因此安装的首选方法是从 GitHub存储库克隆源代码并编译源代码。

+ +

有关编译帕克图斯的说明在安装页面中提供。

+ +
+ +

⬇️ 下载稳定版

+ +

您还可以下载最新的稳定版本的帕克图斯。 这些版本会在发布GitHub存储库中的新版本时自动更新。

+ +

帕克图斯图形用户界面(GUI)

+ +

您可以以图形用户界面(GUI)模式运行帕克图斯,适用于初学者和高级用户。

+ +

帕克图斯图形用户界面(GUI)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
File nameKindOSArch
pactus-gui_0.15.2_darwin_amd64.tar.gzArchivemacOS64-bit
pactus-gui_0.15.2_darwin_amd64.dmgDMGmacOS64-bit
pactus-gui_0.15.2_linux_amd64.tar.gzArchiveLinux64-bit
pactus-gui_0.15.2_windows_amd64.zipArchiveWindows64-bit
pactus-gui_0.15.2_windows_amd64_installer.exeInstallerWindows64-bit
+ +
+ 不受信任的应用程序

请注意,预编译的二进制文件不包含任何 <a href=https://pactus.org/user-guides/run-pactus-gui/#code-certificate-issue\>代码签名证书</a>。 在Windows和macOS中,下载的二进制文件可能会被检测为不受信任的应用程序。 + +
+ +

一旦您下载了帕克图斯GUI,您可以按照本教程设置和运行节点: + 如何以图形模式运行帕克图斯?

+ +
+ +

帕克图斯命令行界面(CLI)

+ +

高级用户可以以命令行界面(CLI)模式运行帕克图斯。

+ +

帕克图斯命令行界面(CLI)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
File nameOSArch
pactus-cli_0.15.2_android_arm64.tar.gzAndroidARM64
pactus-cli_0.15.2_darwin_amd64.tar.gzmacOS64-bit
pactus-cli_0.15.2_darwin_arm64.tar.gzmacOSARM64
pactus-cli_0.15.2_freebsd_amd64.tar.gzFreeBSD64-bit
pactus-cli_0.15.2_freebsd_arm.tar.gzFreeBSDARM
pactus-cli_0.15.2_linux_amd64.tar.gzLinux64-bit
pactus-cli_0.15.2_linux_arm64.tar.gzLinuxARM64
pactus-cli_0.15.2_windows_386.zipWindows32-bit
pactus-cli_0.15.2_windows_amd64.zipWindows64-bit
+ +

一旦您下载了帕克图斯CLI,您可以按照本教程设置和运行节点: + 如何以命令行模式运行帕克图斯?

+ +
+ +

🐳 Docker容器

+ +

高级用户可以从Docker Hub获取帕克图斯docker镜像。

+ +

您可以按照本教程使用Docker设置和运行节点: + 如何使用Docker运行帕克图斯?

+ +
+
+
+
+ + + + + diff --git a/zh/favicon-128x128.png b/zh/favicon-128x128.png new file mode 100644 index 000000000..56c2f6cb2 Binary files /dev/null and b/zh/favicon-128x128.png differ diff --git a/zh/favicon-16x16.png b/zh/favicon-16x16.png new file mode 100644 index 000000000..4babb6356 Binary files /dev/null and b/zh/favicon-16x16.png differ diff --git a/zh/favicon-32x32.png b/zh/favicon-32x32.png new file mode 100644 index 000000000..e22d5d721 Binary files /dev/null and b/zh/favicon-32x32.png differ diff --git a/zh/favicon-64x64.png b/zh/favicon-64x64.png new file mode 100644 index 000000000..e8d111c2e Binary files /dev/null and b/zh/favicon-64x64.png differ diff --git a/zh/favicon.ico b/zh/favicon.ico new file mode 100644 index 000000000..64080c0ee Binary files /dev/null and b/zh/favicon.ico differ diff --git a/zh/feed.xml b/zh/feed.xml new file mode 100644 index 000000000..476ab72ee --- /dev/null +++ b/zh/feed.xml @@ -0,0 +1,1106 @@ +Jekyll2023-10-26T18:16:52+00:00https://pactus.org/feed.xmlPactus blockchainPactus 0.15.1 released2023-10-21T00:00:00+00:002023-10-21T00:00:00+00:00https://pactus.org/2023/10/21/release-0-15-1Overview + +

Pactus Blockchain Version 0.15.1 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Highlites

+ +

This version address an unforeseen issue in the consensus protocol. +We kindly ask all validators to upgrade their nodes to this version.

+ +

Download

+ +

This version has been implemented for Testnet-1 and +is being prepared for the upcoming Mainnet launch. +To start using Pactus Blockchain Testnet-2, download the latest version from the +download page and join the Testnet.

+ + + +

How to Upgrade

+ +

If you are running an older version, shut it down. +Uninstall the previous version and install the newer version. +If you are using the archived version, simply use the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Fix

+ +
    +
  • consensus: strong termination for the binary agreement (#765)
  • +
  • consensus: not increase the voting power on duplicated binary votes (#762)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

]]>
Pactus 0.15.2 released2023-10-21T00:00:00+00:002023-10-21T00:00:00+00:00https://pactus.org/2023/10/21/release-0-15-2Overview + +

Pactus Blockchain Version 0.15.2 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Highlights

+ +

This version allows nodes to set limits on the number of connections they can establish. +By default, each node can have a minimum of 8 connections and a maximum of 16 connections. +Users can easily change these numbers in the configuration file.

+ +

Download

+ +

This version has been implemented for Testnet-2 and +is being prepared for the upcoming Mainnet launch. +To start using Pactus Blockchain Testnet-2, download the latest version from the +download page and join the Testnet.

+ +

These guides can help you to download, install and configure your node:

+ + + +

How to Upgrade

+ +

If you are running an older version, shut it down. +Uninstall the previous version and install the newer version. +If you are using the archived version, simply use the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • add community bootstrap nodes to testnet config (#764)
  • +
  • network: implementing connection manager (#773)
  • +
  • network: adding bootstrapper mode to the network config (#760)
  • +
+ +

Fix

+ +
    +
  • network: ensure relay is not used when there is no direct connection
  • +
  • network: close connection when unbale to get supported protocols (#781)
  • +
  • network: enabling peer exchange for bootstrappers (#779)
  • +
  • network: set connection limit for the resource manager (#775)
  • +
  • sync: peer status set to known on sucessfull handshaking (#774)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

]]>
Pactus 0.15.0 released2023-10-15T00:00:00+00:002023-10-15T00:00:00+00:00https://pactus.org/2023/10/15/release-0-15-0Overview + +

Pactus Blockchain Version 0.15.0 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Splash screen

+ +

Download

+ +

This version is the bootstrap version for +Testnet-2. +To start using Pactus Blockchain Testnet-1, download the latest version from the +download page and join the Testnet.

+ +

These guides can help you to run and configure your node:

+ + + +
+ If you participated in Testnet-1, ensure to delete your previous working directory and + create a new wallet. +

+ By default, the working directory is located at "C:\Users\<name>\pactus" on Windows, + or "~/pactus" on Unix-compatible platforms. +
+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • gui: adding the splash screen (#743)
  • +
  • add absentees votes to the certificate (#746)
  • +
  • logger: short stringer for loggers (#732)
  • +
  • implementing pip-7 (#731)
  • +
  • implementing pip-11 (#712)
  • +
  • implementing pip-8 (#711)
  • +
  • implementing pip-9 (#706)
  • +
  • new API to get Public key by address (#704)
  • +
  • Adding address field for AccountInfo (#703)
  • +
  • CreateValidatorEvent and CreateAccountEvent for nanomsg (#702)
  • +
  • implementing PIP-2 and PIP-3 (#699)
  • +
  • Adding Hole Punching to network (#697)
  • +
  • write logs into file (#673)
  • +
  • check protocol support before sending connect/disconnect event (#683)
  • +
  • updating genesis for pre-testnet-2 (#679)
  • +
  • adding udp protocol for network (#672)
  • +
  • implementing pip-4 (#671)
  • +
  • Notifee service events (#628)
  • +
  • adding MinimumStake parameter (#574)
  • +
  • adding Sent and Received bytes per message metrics for peers (#618)
  • +
  • add reason to BlockResponse messages (#607)
  • +
  • Add CalcualteFee in GRPC (#601)
  • +
  • add sent bytes and received bytes metrics to peerset plus update grpc (#606)
  • +
  • added metrics of libp2p with supporting prometheus (#588)
  • +
  • Check node address is valid (#565)
  • +
  • add LastSent and LastReceived properties to peer (#569)
  • +
+ +

Fix

+ +
    +
  • data race issue on updating certificate (#747)
  • +
  • network: async connection (#744)
  • +
  • adding query vote timer for CP phase (#738)
  • +
  • trim transactions in proposed block (#737)
  • +
  • fixing query votes and proposal issue (#736)
  • +
  • fixing issue when a block has max transactions (#735)
  • +
  • consensus: anti-entroy mechanism for the consensus (#734)
  • +
  • logger: invalid level parsing error (#733)
  • +
  • cache certificate by height (#730)
  • +
  • fixing a crash on consensus (#729)
  • +
  • consensus: prevent double entry in new height (#728)
  • +
  • resolve consensus halt caused by time discrepancy in network. (#727)
  • +
  • unsorted addresses in wallet listing (#721)
  • +
  • send query votes message, if there is no proposal yet (#723)
  • +
  • fixing logger level issue (#722)
  • +
  • fixing syncing stuck issue (#720)
  • +
  • fixing some minor issues on pre-testnet (#719)
  • +
  • supporting go version 1.21 and higher (#692)
  • +
  • ensure log rotation using tests (#693)
  • +
  • restoring at the first block (#691)
  • +
  • swagger doesn’t work with multiple proto files (#687)
  • +
  • fixing wallet-cli issues (#686)
  • +
  • prevent stripping public key for subsidy transactions (#678)
  • +
  • updating the consensus protocol (#668)
  • +
  • aggregating signature for hello message (#640)
  • +
  • error case for logger (#634)
  • +
  • adding committers to the certificate (#623)
  • +
  • updating sortition executor (#608)
  • +
  • update buf and fixing proto generation issue (#600)
  • +
  • adding block hash to peer (#584)
  • +
  • copy to clipboard option for address and pubkey (#583)
  • +
  • public key aggregate (#576)
  • +
  • remove GetValidators rpc method (#573)
  • +
  • missing swagger ui for grpc get account by number (#564)
  • +
  • incorrect handler for validator by number (#563)
  • +
+ +

Refactor

+ +
    +
  • sync: refactoring syncing process (#676)
  • +
  • remove payload prefix from payload transaction type (#669)
  • +
  • change Hello message from broadcasting to direct messaging (#665)
  • +
  • committee: using generic list for validators (#667)
  • +
  • rename SanityCheck to BasicCheck (#643)
  • +
  • cli: Migrating from mow.cli to cobra for wallet (#629)
  • +
  • cli: replacing mow.cli with cobra for daemon (#621)
  • +
  • logger: using fast JSON logger (zerolog) (#613)
  • +
  • Using Generics for calculating Min and Max for numeric type #604 (#609)
  • +
  • Updating LRU cache to version 2 #514 (#602)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

]]>
Testnet-2 launch announcement2023-10-15T00:00:00+00:002023-10-15T00:00:00+00:00https://pactus.org/2023/10/15/testnet-2-launchedOverview + +

Exciting news for the Pactus Community: Testnet-2 is has launched! +The journey through Testnet-1 +brought success and invaluable experiences, with over 500 validators joining the network. +Despite its noteworthy achievements, it also faced challenges that led to a tough decision: to pause the Testnet and +thoroughly address these issues. +After two months of dedicated work and testing, many problems have been resolved, and +we feel confident launching the Testnet again. +Testnet-2 comes with substantial improvements compared to its predecessor by enhancing the core of the Pactus Blockchain. +Notably, the new consensus mechanism and improved overall network performance.

+ +

At this point, we want to assure the Pactus community that this version of +the Testnet will not stop until the mainnet launches, +and our main focus is on improving its overall performance and launching the Mainnet.

+ +

If you’re new to the concept of Testnet, check out our informative post: +What is the Testnet?

+ +

Key Focus Areas

+ +

Testnet-2 has important tasks ahead. +Firstly, we aim to confirm that the new consensus mechanism is both safe and efficient. +A close eye will be kept on the network’s performance, ensuring it operates as expected. +For Testnet-2, the committee +size has been expanded to 51 members. +Both the committee’s performance and block production will be closely monitored. +The goal is a blockchain that remains stable and trustworthy, +even with thousands of validators in the network, +ensuring it manages its regular duties seamlessly.

+ +

How To Join

+ +

Want to join the Testnet-2? Great! It’s super easy. +Just download the latest Pactus software and you’re good to go. +no fancy setups or special gear needed. +You can run the software straight from your personal computer or laptop. +Need some test coins? Pop over to our Discord channel and share your validator address there.

+ +

Benefits for Participation

+ +

By taking part in the Testnet, users can familiarize themselves with the Pactus blockchain and +be well-prepared for the Mainnet launch. +Testnet participants will also receive higher priority during the Mainnet launch and +get free coins for initial staking on the Mainnet.

+ +

Your Feedback Matters

+ +

User feedback plays a vital role in the improvement of the Pactus blockchain. +Share your thoughts and experiences to contribute to the enhancement of future software versions.

]]>
How SSPoS (Solid State Proof of Stake) works in simple word2023-09-28T00:00:00+00:002023-09-28T00:00:00+00:00https://pactus.org/2023/09/28/how-sspos-works-in-simple-wordAbstract + +

In all Blockchain protocols, there is a concept called a consensus mechanism. +This mechanism is used to enable nodes to reach an agreement +on the state of the Blockchain they are +maintaining, in order to have a synchronized and integrated Blockchain.

+ +

For now, we have a lot of consensus mechanisms in the Blockchain world. +Pactus Blockchain uses the SSPoS (Solid State Proof of State) which is a new consensus model.

+ +

To explain how it works let’s start with explaining one of the first and simplest +consensus mechanisms (or if you already know them, just jump into the last part named SSPoS).

+ +

Solid State Proof of Stake

+ +

PoW (Proof of Work)

+ +

In the proof of work model, each node in the network should solve a complex mathematical +problem that requires lots of computing resources to make a new block.

+ +

In this way, it’s highly unlikely that anyone would be able to change +past transactions and change Blockchain states such as balances, +without expending equivalent computational power.

+ +

By doing this we ensure the security and integrity of the Blockchain.

+ +

The concept was adapted from digital tokens by Hal Finney in 2004 +through the idea of “reusable proof of work” using the 160-bit secure hash algorithm 1 (SHA-1).

+ +

Bitcoin uses this consensus model.

+ +

PoS (Proof of Stake)

+ +

On the other hand, PoS or Proof of Stake is another consensus mechanism that instead of miners has validators!

+ +

Validators lock a number of their assets in the Blockchain and they can transfer or use it +till it is locked which we call staking. +after each Block is committed one of the validators will be chosen randomly (more amount of stake, +more chance to be chosen) when a validator is chosen +it proposes a block and announces it to other nodes to be validated, +when a supermajority of validators accept the block it’s going to be committed.

+ +

In this system, validators have no incentive to behave maliciously or dishonestly. +If they do, they risk losing the stake amount.

+ +

More amount of validators in a PoS Blockchain makes it more secure, +decentralized, and trustable, but it also makes the validation and consensus process slower and more difficult.

+ +

Ethereum uses this model.

+ +

DPoS (Delegated Proof of Stake)

+ +

DPoS or Delegated Proof of Stake, is a variant of the PoS consensus algorithm. +users entrust their stakes to a small group of “delegates”. +These delegates are responsible for validating transactions +and creating blocks. The number of delegates is limited +to ensure accountability and efficiency in the validation process.

+ +

Some Blockchains like Cardano and Tron use DPoS.

+ +

DPoS tries to solve the issue of PoS which when validators +increase we have an inefficient validation process. but the main issue with DPoS itself is putting a lot +of trust in the hands of a small number of delegates, +which goes against the principle of “don’t trust, verify”.

+ +

SSPoS (Solid State Proof of Stake)

+ +

BUT, HOW ABOUT SSPoS? HOW ABOUT PACTUS?

+ +

In Pactus Blockchain, we have something called Solid State Proof of Stake +and we try to fix the previous model’s issue, let me explain.

+ +

Pactus uses a dynamic committee of validators with a fixed size of 21, +but the members of the committee randomly change in each round, +based on stake amount the chance of being chosen is higher. on the other hand, +the number of validators out on the committee is unlimited, allowing anyone +to become a validator by staking coins.

+ +

At each block, validators participate in a sortition algorithm by generating a random number +between zero and the total staked coins. If the number is less +than the validator’s stake, they can enter the committee and replace the oldest committee member.

+ +

So, in SSPoS models which are a variant of PoS, we can reach a consensus, +without using high computation resources, having an inefficient +validation process by increasing validator numbers, +and also without breaking the principle of “don’t trust, verify”.

]]>
Dev Report pre-testnet22023-09-24T00:00:00+00:002023-09-24T00:00:00+00:00https://pactus.org/2023/09/24/dev-report-pre-testnet-2Abstract + +

there is several activities in Pactus github in September month, here is a clear report and explain of activities.

+ +

Github Pactus

+ +

Implementing PIP 2, 3 and 4

+ +

After starting Pactus Labs and PIPs, +we start implementing each accepted PIP one by one to improve Pactus, here is a list of implemented PIPs:

+ + + +

Network

+ +

There is some very good change and new features for Pactus network module, +this list contain a list of important changes in Pactus networking:

+ + + +

gRPC and nanomessage services

+ +

We also updated, improved and enhanced gRPC and nanomessage services for better developer experience, +for third-party and side project developers, here is some changes:

+ + + +

Refactoring and other new feature or debugs

+ +

We had some not implemented feature request, not fixed bugs and some issue with new golang version, +list of this changes:

+ +]]>
Introduction to PIPs2023-09-04T00:00:00+00:002023-09-04T00:00:00+00:00https://pactus.org/2023/09/04/introduction-to-pipsIntroduction to PIPs + +

In our commitment to transparency and innovation, we’re excited to introduce a major step in Pactus’s journey: +the Pactus Improvement Proposals, or PIPs.

+ +

PIPs image

+ +

What are PIPs?

+ +

Pactus Improvement Proposals (PIPs) define standards for the ongoing development and enhancement of the Pactus platform. +Each PIP has a unique number like PIP-2, +PIP-3, and so on. +These proposals provide technical details for suggested modifications or enactments, serving as a guide for development.

+ +

The PIP process

+ +

The PIP process is open, allowing any member of the Pactus community to propose a PIP. +The author should provide a summary, motivation, and a detailed technical explanation. +The Pactus Laboratory team will carefully review each PIP. +Security considerations must be addressed before finalizing a PIP. +Once finalized, it can be added to the code. +This process helps avoid unexpected issues during development and maintain consistency and safety.

+ +

The Origins of PIPs

+ +

The Pactus Improvement Proposals (PIPs) was inspired by the +Ethereum Improvement Proposals (EIPs) system, +which had its roots in the Bitcoin Improvement Proposals (BIPs) and +Python Enhancement Proposals (PEPs).

+ +

New Feature Policy

+ +

From now on, all major changes or new features in the Pactus project require a PIP. +Any implementation must reference its specific PIP. +Without approval from Pactus Laboratory team, changes won’t be approved and added to the codebase.

+ +

PIPs Repository

+ +

For a complete list of Pactus Improvement Proposals, visit this link. +The corresponding GitHub repository is accessible here.

+ +

PIPs repository on Github

]]>
Dev report2023-08-22T00:00:00+00:002023-08-22T00:00:00+00:00https://pactus.org/2023/08/22/dev-reportAbstract + +

there is several activities in pactus github this month, here is a clear report and explain of activities.

+ +

Github Pactus

+ +

Linters

+ +

one of new changes in pactus project is new linters we added this month. +what is linters? +linters are just a set of rules for the style of source codes, they force developers to write new codes +in correct, clean and safe way.

+ +

why we use them? +the reason we are using linters in Pactus and add new ones, is to make the code more safe, +and also make it easy to work on for new contributors because we are focus on being decentralized even in development.

+ +

Linters we added till now

+ +

TLA+ spec

+ +

one another new change in Pactus is updating TLA+ spec, which is related to consensus, +as you know we had some problem with consensus in Testnet-1, we fixed the issues and now we are trying to make it more clean.

+ +

link to changes

+ +

if you wish you can learn more about Pactus consensus here.

+ +

Refactoring

+ +

some of previous Pactus dependencies was so old, so we start refactoring them and use new libraries. +also we used some libraries with higher performance which is make Pactus full node more faster in mainnet.

+ +

one of refactors

]]>
Story of Testnet-12023-08-01T00:00:00+00:002023-08-01T00:00:00+00:00https://pactus.org/2023/08/01/testnet-1-concludedAbout Testnet + +

Testnet is a testing environment where developers and users can try out the functionality of a blockchain project, +without putting real assets or data at risk. +It helps to ensure that the final product is reliable and secure for users to use. +If you like to read more about the Testnet you can check out our post on +“What is Testnet?”.

+ +

Summary

+ +

In May 2023, we launched our second Testnet. +The main purpose of this Testnet was to measure block time creation and the responsiveness of the blockchain. +The development team also focused on evaluating the network’s performance. +Additionally, the overall performance of the software and the syncing process were closely examined and assessed.

+ +

The committee for Testnet-1 was set to 21 validators, +and 584 validators joined during the Testnet period. +More than 600,000 blocks were created, and more than 1 million transactions were processed during this time. +The size of the blockchain is about 300 megabytes.

+ +

About 300,000 coins were staked during this period, it was almost 50% of the total generated coins. +It shows that users, even in Testnet, tend to stake their coins.

+ +

Staking chart

+ +

We were able to extract the confirmation time of transactions. +More than 97% of transactions were confirmed in just one block after submission. +This indicates that the transaction pool and broadcasting models are working fine.

+ +

Transaction confirmation chart

+ +

Based on logs from one of the validators, the time for creating a block is about 3 seconds in normal cases. +More than 97% of blocks are committed in the first rounds.

+ +

Consensus round chart

+ +

During Testnet-1, we released three versions(Version +0.11.0, +0.12.0, +0.13.0), and the upgrade process was smooth. +At this time, the development team decided to stop Testnet-1 and work on improvements that are not backward compatible, +including:

+ +
    +
  • Improving the consensus protocol
  • +
  • Reducing the blockchain size
  • +
  • Optimizing the network usage
  • +
+ +

After stabilizing the changes, we will announce the next Testnet, and hopefully, this will be the pre-launch Testnet.

+ +

Spacial thanks to the community

+ +

This Testnet was important for us. +It helped us learn what we need to do to make Pactus work even better. +Without the community that supports us and dedicates their time and resources to testing and feedback, +we wouldn’t have been able to progress as we have.

+ +

we thank all of them for their valuable contributions. +As promised, participants in Testnets will be given priority as validators for the MainNet, and +will receive bounty tokens from the bootstrap accounts to set up their validator.

+ +

We are grateful to all those who participated in Testnet-1, and +we encourage them to join our next Testnet to help us improve Pactus. +As a community-based project, we rely on the support of our community members, and we value any help we receive.

]]>
Dev meeting2023-07-09T00:00:00+00:002023-07-09T00:00:00+00:00https://pactus.org/2023/07/09/dev-meetingMeeting Summary + +

The meeting took place on 09 July 2023, at 2:00 PM UTC via Google Meet, +with team members from different time zones joining to discuss key aspects of the Pactus project.

+ +

Overview to the Network Module

+ +

The meeting began with an overview of the Network module in Pactus. +This module uses Libp2p as its underlying network protocol.

+ +

The Network module is agnostic about the content of the message and +handles two types of messages: Gossip messages, which are broadcasted, +and Stream messages, which are sent directly to a specific peer. +The team discussed the relay nodes that enable communication for nodes behind NAT. +Upon receiving a message, the module publishes an event. +The two types of events are Gossip events and Steam events.

+ +

Network messages

+ +

The team discussed the issue of Relay connections resetting, and explored solutions such as +hole punching or using UDP and IPv6.

+ +

Some users in the Testnet reported high network usage. +The team discussed implementing metrics for LibP2P to monitor network usage effectively. +The discussion related to this issue can be found here. +Additionally, the team discussed the customization of network resources, +including setting limits for inbound and outbound connections.

+ +

Overview to the Sync Module

+ +

Moving on, the Sync module was discussed. +Unlike the Network module, the Sync module has full knowledge about the messages and packets. +The module handles a range of message types, which can be found +here.

+ +

It was suggested that we need to define metrics for each message type. +There was also a discussion about the need for reducing the messages to optimize the use of network resources.

+ +

The team decided to continue discussing these topics in future meetings. +They also plan to work on improving the Network and Sync modules based on these discussions.

]]>
500 validators joined Testnet2023-07-05T00:00:00+00:002023-07-05T00:00:00+00:00https://pactus.org/2023/07/05/testnet-500-validatorsFor a Proof of Stake blockchain, validators are important for +maintaining the network’s integrity and security. They are similar to miners in Proof of Work blockchains like Bitcoin.

+ +

Pactus as a real Proof of Stake blockchain, has achieved a significant milestone. +More than 500 validators joined the Testnet +in less than 2 months. +This accomplishment proves that Pactus is reliable, resilient, and trustworthy. More importantly, it sets new standards +in the blockchain world. In fact, the Pactus Testnet is even more decentralized than some well-known blockchains.

+ +

500 validators of Testnet

+ +

One key reason why Pactus can accommodate more validators is its powerful +consensus mechanism. +The consensus mechanism in Pactus eliminates the need for delegation, making it possible for anyone to become a validator. +Additionally, the user-friendly application ensures that even those new to blockchain can easily contribute to the network.

+ +

What is the next

+ +

To remain competitive in the market, Pactus recognizes the importance of prioritizing user space. +We aim to ensure that running Pactus is affordable and accessible to anyone, regardless of their technical expertise or +available resources.

+ +

To achieve this, the Pactus team constantly monitors network, storage, and computational usage, striving to keep them +at minimal levels. +By doing so, we enable more individuals to participate in the Pactus blockchain.

+ +

Currently, the Pactus team is working on optimizing and reducing network usage. This effort will lead to reduced costs, +especially for users who are using home internet connections.

+ +

Furthermore, we are planning to introduce a pruning mode, allowing users to run the Pactus blockchain with significantly +less storage. +Although we believe the storage size is already small, our goal is to enable users to +retain only the most recent blockchain history. +This approach ensures that the blockchain size remains as compact as possible by disregarding some history of the blockchain.

]]>
Pactus 0.13.0 released2023-07-01T00:00:00+00:002023-07-01T00:00:00+00:00https://pactus.org/2023/07/01/release-0-13-0Overview + +

Pactus Blockchain Version 0.13.0 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Highlights

+ +

Users can now restore the default_wallet during the node initialization. +If users have a backup of the seed phrase (mnemonic) for the default_wallet, +they can now restore it and re-initialize the node.

+ +

Restore mode

+ +

Download

+ +

This version has been implemented for Testnet-1 and +is being prepared for the upcoming Mainnet launch. +To start using Pactus Blockchain Testnet-1, download the latest version from the +download page and join the Testnet.

+ +

These guides can help you to run and configure your node:

+ + + +

How to Upgrade

+ +

If you are running an older version, shut it down. +Uninstall the previous version and install the newer version. +If you are using the archived version, simply use the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Fix

+ +
    +
  • implemented restore wallet base on input seed (#553)
  • +
  • measuring total sent and received bytes (#552)
  • +
  • add validate seed and restore wallet (#533)
  • +
  • HTTP: Missing handlers (#549)
  • +
  • gui: update about dialog and menu items in help (#532)
  • +
+ +

Refactor

+ +
    +
  • implementing TestSuite (#535)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

]]>
Pactus 0.12.0 released2023-06-19T00:00:00+00:002023-06-19T00:00:00+00:00https://pactus.org/2023/06/19/release-0-12-0Overview + +

Pactus Blockchain Version 0.12.0 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Highlights

+ +

This version is focused on improving the sync time to make it faster. +This is achieved by implementing a caching mechanism that executes transactions more quickly and +improves the calculation of total power (stake) of the blockchain in a more effective way.

+ +

Syncing progress

+ +

Download

+ +

This version has been implemented for Testnet-1 and +is being prepared for the upcoming Mainnet launch. +To start using Pactus Blockchain Testnet-1, download the latest version from the +download page and join the Testnet.

+ +

These guides can help you to run and configure your node:

+ + + +

How to Upgrade

+ +

If you are running an older version, shut it down. +Uninstall the previous version and install the newer version. +If you are using the archived version, simply use the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • add GetAccountByNumber API to get account by number (#511)
  • +
+ +

Fix

+ +
    +
  • caching account and validator in store (#513)
  • +
  • get recent blocks by stamp (#509)
  • +
  • closing the mDNS connection upon stopping the network (#508)
  • +
  • updating linkedmap to use generic (#507)
  • +
  • removing state from cache (#506)
  • +
  • Typo in GUI (#499)
  • +
  • supporting localnet (#492)
  • +
+ +

Refactor

+ +
    +
  • update total power calculation based on power change(deltas) (#518)
  • +
  • GetValidators return all validators in state validators map (#512)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

]]>
Pactus 0.11.0 released2023-05-29T00:00:00+00:002023-05-29T00:00:00+00:00https://pactus.org/2023/05/29/release-0-11-0Overview + +

Pactus Blockchain Version 0.11.0 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Highlights

+ +

The main update in this version is the fix for the relay +connection issue. +A relay is a peer in the network that facilitates the connection between two peers, +particularly when they are using home internet.

+ +

Another significant update is that sending a Bond transaction +is now more user-friendly. +Users no longer need to set the validator public key if they want to bond Test PAC coins to their validators.

+ +

Bond transaction dialog

+ +

Download

+ +

This version has been implemented for Testnet-1 and +is being prepared for the upcoming Mainnet launch. +To start using Pactus Blockchain Testnet-1, download the latest version from the +download page and join the Testnet.

+ +

These guides can help you to run and configure your node:

+ + + +

How to Upgrade

+ +

If you are running an older version, shut it down. +Uninstall the previous version and install the newer version. +If you are using the archived version, simply use the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Fix

+ +
    +
  • gui: showing the total number of validators (#474)
  • +
  • network: fixing relay connection issue (#475)
  • +
  • consensus: rejecting vote with round numbers exceeding the limit (#466)
  • +
  • increase failed counter when stream got error (#489)
  • +
  • boosting syncing process (#482)
  • +
  • waiting for proposal in pre-commit phase (#486)
  • +
  • retrieving public key from wallet for bond transactions (#485)
  • +
  • restoring config file to the default (#484)
  • +
  • defining ChainType in genesis to detect the type of network (#483)
  • +
  • reducing the default Argon2d to consume less memory (#480)
  • +
  • adding password option to the start commands (#473)
  • +
+ +

Refactor

+ +
    +
  • rename send to transfer. (#469)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

]]>
Testnet-1 launch announcement2023-05-09T00:00:00+00:002023-05-09T00:00:00+00:00https://pactus.org/2023/05/09/testnet-1-launchedOverview + +

The Pactus blockchain Testnet-1 is now available for participation. +This version simulates the Mainnet environment and evaluate the system’s performance, stability, +and security in a controlled environment. +The primary goal of this version of Testnet is to determine the efficient and secure committee size for the Mainnet.

+ +

Key Aspects

+ +
    +
  • Simulating the Mainnet environment
  • +
  • Determining the actual block creation time
  • +
  • Assessing the staking mechanism and consensus protocol
  • +
  • Evaluating network usage under different loads
  • +
  • Evaluating the syncing process for new nodes joining the network
  • +
  • Ensuring network stability with over 1000 validators
  • +
  • Evaluating transaction performance
  • +
  • Conducting stress tests
  • +
  • Performing security tests, including double spend attacks, Sybil attacks +(nodes with different identities), and forking resistance
  • +
+ +

Joining Testnet-1

+ +

To join the Testnet, download Pactus software +version 0.10.0 and +connect to Testnet without any special configuration or hardware. +You can run the software on your personal computer or laptop. +To acquire test coins, visit the Discord channel and +provide your validator address.

+ +

Benefits for Participation

+ +

By taking part in the Testnet, users can familiarize themselves with the Pactus blockchain and +be well-prepared for the Mainnet launch. +Testnet participants will also receive higher priority during the Mainnet launch and +get free coins for initial staking on the Mainnet.

+ +

Your Feedback Matters

+ +

User feedback plays a vital role in the improvement of the Pactus blockchain. +Share your thoughts and experiences to contribute to the enhancement of future software versions.

]]>
Pactus 0.10.0 released2023-05-08T00:00:00+00:002023-05-08T00:00:00+00:00https://pactus.org/2023/05/08/release-0-10-0Overview + +

Pactus Blockchain Version 0.10.0 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Highlight

+ +

The main update in this version allows users to set up multiple validators in one node. +Users can set up to 32 validators in a single node, and each validator can stake up to 1,000 coins.

+ +

Multi validators

+ +

Download

+ +

This version has been implemented for Testnet-1 and +is being prepared for the upcoming Mainnet launch. +To start using Pactus Blockchain Testnet-1, download the latest version from the +download page and join the Testnet.

+ +

These guides can help you to run and configure your node:

+ + + +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • removing address from account (#454)
  • +
  • supporting multiple consensus instances (#450)
  • +
  • adding sortition interval to the parameters (#442)
  • +
+ +

Fix

+ +
    +
  • gui: check if the node has an active consensus instance (#458)
  • +
  • Use of a Persistent Merkle tree to enhance performance of calculating the +state hash; fully tested in Testnet-0 (#432)
  • +
  • GetBlockchainInfo API in gRPC now returns the total number of validators and accounts (#439)
  • +
  • wallet path as argument (#455)
  • +
  • adding reward addresses to config (#453)
  • +
  • removing committers from the certificate hash (#444)
  • +
  • prevent data race conditions in committee (#452)
  • +
  • using 2^256 for the vrf denominator (#445)
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

]]>
Story of Testnet-02023-04-21T00:00:00+00:002023-04-21T00:00:00+00:00https://pactus.org/2023/04/21/testnet-0-concludedWhat is Testnet? + +

Testnet is a testing environment where developers and users can try out the functionality of a blockchain project, +without putting real assets or data at risk. +It helps to ensure that the final product is reliable and secure for users to use. +If you like to read more about the Testnet you can check out our post on +“What is Testnet?”.

+ +

Summary of Testnet-0

+ +

In September 2022, we launched our first Testnet. +The purpose of this Testnet was to +check the consensus protocol, +test different transaction types, +and ensure the stability of the blockchain. +We also wanted to test the sortition algorithm +to make sure it works properly.

+ +

The committee +for the Testnet-0 was set to five validators, and more than 19 validators joined during the Testnet period. +Over 2 million blocks were created, and more than 3.2 million transactions were processed during this time. +The size of the blockchain is approximately 1 gigabyte. +The maximum number of transactions recorded in a single block was 386. With a block time of 10 seconds, +we can confirm that Pactus blockchain can support up to 30 transactions per second (TPS), +which is a reasonable number for TPS. Based on real-time statistics available at realtps, +we can see that Pactus is among the top 10 blockchains in terms of TPS.

+ +

At this point, the development team decided to end the Testnet-0 and move on to the next one, +Testnet-1. We are planning to run the Testnet-1 to prepare for the MainNet launch. +We will provide updates on our progress and share the details of the new Testnet soon.

+ +

As promised, participants in Testnets will be given priority as validators for the MainNet, +and will receive bounty tokens from the bootstrap accounts to set up their validator. +We are grateful to all those who participated in Testnet-0, and we encourage them to join our next Testnet to +help us improve Pactus. +As a community-based project, we rely on the support of our community members, and we value any help we receive.

]]>
What is a Testnet?2023-03-01T00:00:00+00:002023-03-01T00:00:00+00:00https://pactus.org/2023/03/01/what-is-testnetMainnet vs Testnet? + +

If you have ever wondered what Testnet is and how it is different from Mainnet, read this article to the end to find out!

+ +

Mainnet and Testnet are two widely used terminologies in the Blockchain ecosystem; +so it is important to understand the meaning and differences while working in the industry or +following announcements of the Blockchain projects like Pactus.

+ +

Here’s a quick explanation: +Before the actual live version of a Blockchain network that is used for real transactions, +functions and smart-contracts (which is referred as Mainnet), +there is a test version of the Blockchain network for testing purposes (which is referred as Testnet). +In Testnet, a safe environment is provided to help developers experiment and test their applications, +and make sure that everything functions smoothly in the Mainnet version.

+ +

Testnet

+ +

A Testnet is a simulation of a Blockchain, in which developers can test all the functionalities of +their Blockchain network without risking their assets and convenience of end-users. +Using Testnet, any possible error, bug or malfunctions can be fixed before the Mainnet launch. +Testnet also can be an experimental environment for new features, updates and upgrades. +So several Testnet networks of the same version or newer version of the Mainnet can be implemented on the roadmap.

+ +

What are use cases of Testnet?

+ +

A secure environment to test development ideas and updates. +So many features and minor details in Pactus project have been successfully developed so far using the Testnet; such as:

+ +
    +
  • extra details and information on Pactus-GUI;
  • +
  • well-functioning Pactus Blockchain explorer to access transactions and block details;
  • +
  • Upgrades that led to decreasing the size of the Pactus network
  • +
+ +

Providing a safe testing ground for resolve scalability and security problems, as well as decentralization issues. +Pactus network is also a secure and purely decentralized network. However in the last updates during the Testnet, +developers are now able to decrease the database size by approximately 10% without compromising performance. +They did it by utilizing block height instead of hash to store blocks within the database. (you can find out more +here).

+ +

Testing new versions, patches and features on Testnet. it is vital for enhancing the security, load testing, +Blockchain migration, integration tests, and etc. This is why you can now use the latest version of Pactus-GUI +that works like clockwork and is extremely secure.

+ +

Testing the functions of cryptocurrency without disrupting the Mainnet. In the Testnet of Pactus Blockchain, +you as a user or validator can use all the features to send, receive, bond or unbond your assets in the Pactus-GUI.

+ +

Development and simulation of smart contract features and DApps. Note that many Blockchain projects like Pactus, +can be used as smart-contract platforms. So the Testnet can be designed in different stages to test and improve +different applications of the network.

+ +

Please note that after a certain period of time, when developers get satisfied with the functionality and debugging process, +they launch Mainnet. Mainnet has its own independent genesis blocks; +so the assets and addresses that users use in Testnet are not valid inside the new Mainnet Blockchain anymore. +In fact the whole Blockchain network starts working from the scratch and users and validators start to +work with real tokens and transactions instead of the simulated ones. But since Testnet has an important effect +on the health and improvement of the network, in Pactus Blockchain, we have several advantages +for the people who join the Testnet.

+ +

Why should you join the Testnet?

+ +

There are different contributors in a Blockchain network; +Some people are developers and programmers that use the Testnet to contribute, enhance and lead the project to a better future. +Testnet is actually vital for them to perform their changes and try their innovations and ideas.

+ +

But you might also be an end user; you might want to either be a validator and stake your assets to earn more Pactus coins, +or you might want to learn how to use the network for future personal applications. Either way, +you might find it handy to give it a try and be familiar with Pactus-GUI and its different features.

+ +

However, there is another advantage for end users who join the Testnet. +While using the network, running a node or testing the Pactus-GUI in Testnet period, you are contributing to +the community to find improvement potentials, that’s why there are more advantages contemplated for the Testnet users; +Soon our Mainnet will be launched and also Pactus network will be announced and listed in well-known exchanges. +As an early contributor, you will have the advantage of getting some extra initial tokens at the beginning of Mainnet launch. +So that you can use it to run a validator node and earn more from staking your assets. This airdrop is considered +for every individual who installs Pactus-GUI and starts a node in Testnet.

+ +

There are other positive conditions you may experience as an early contributor.

+ +
    +
  • Advanced and very responsive support for your issues (we dedicate more time to provide you with solutions)
  • +
  • Embracing your suggestions, improvement ideas, needs and information you may require to have a better user experience.
  • +
]]>
Pactus 0.9.1 released2022-11-24T00:00:00+00:002022-11-24T00:00:00+00:00https://pactus.org/2022/11/24/release-0-9-1Overview + +

Pactus Blockchain Release Version 0.9.1 +is now available for download. +This release includes a graphical user interface (GUI) that +is suitable for both beginners and experienced users. +It also includes a command-line interface (CLI) for advanced users and wallet software +that allows users to interact with the blockchain without the need to sync the entire blockchain.

+ +

Download

+ +

This version has been implemented for Testnet-0 and is preparing for the upcoming Mainnet launch. +To start using the Pactus Blockchain Testnet-0, +you can download the latest version from download page +and join the Testnet.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +
    +
  • Blocks can be fully decoded when queried in gRPC
  • +
  • The HTTP module now uses gRPC module, making node configuration simpler by removing the CapnP module
  • +
  • Reducing the blockchain size by saving blocks by number instead of hash
  • +
  • The wallet can hold unconfirmed transactions
  • +
  • The wallet can use different gRPC servers
  • +
  • The GUI displays committee information
  • +
+ +

You can find the full list of changes on Github, +as well as the source code

]]>
Dev meeting2022-10-30T00:00:00+00:002022-10-30T00:00:00+00:00https://pactus.org/2022/10/30/dev-meetingMeeting Summary + +

The meeting took place on 30 October 2022, at 2:00 PM UTC via Google Meet, +with team members from different time zones joining to discuss key aspects of the Pactus project.

+ +

In memory of Mahsa Amini

+ +

The meeting started in memory of Mahsa Amini. +We in the Pactus family stand in solidarity with courageous people who are fighting for equality, equity and freedom in Iran.

+ +

Woman Life Freedom

+ +

Launching Block explorer

+ +

The beta version of the block explorer has been launched 🚀 and is now available at +https://pacscan.org.

+ +

Nagaraj explained the block explorer and some of the features.

+ +

Project road map

+ +

Project road map was discussed.

+ +

IdeaKita pitch deck

+ +

Ali presented the Pactus pitch deck for the IdeaKita in Malaysia. +The IdeaKita program, under the Malaysia Digital Economy Corporation (MDEC), is designed to +support entrepreneurs and startups in Malaysia.

+ +

Latest development progress

+ +

The latest pull requests were reviewed:

+ +]]>
\ No newline at end of file diff --git a/zh/index.html b/zh/index.html new file mode 100644 index 000000000..959e823c1 --- /dev/null +++ b/zh/index.html @@ -0,0 +1,443 @@ + + + + + + + + + + + + + Home | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+
+ +
+
+
+
+
帕克图斯区块链
+
Building decentralized future together!
+
+ +
+
+
+ +
+
+
+

运行节点

+ 下载最新版本的帕克图斯区块链,创建您的钱包,并开始与网络同步。帕克图斯旨在轻量级且用户友好,易于操作。 + + +
+
+ 运行节点 +
+
+ +
+
+ 获取代币 +
+
+

获取代币

+ 一旦您的节点运行起来,您将需要获取一些代币以成为验证人。您可以加入我们的社区并获得一些免费的权益代币。 + + +
+
+ +
+
+

成为验证人

+ 通过抵押一些代币,您的节点将过渡为验证人,随后,每当您提出一个块时,您将获得一个新代币作为块奖励。 + +
+ 学习 +
+
+
+ 成为验证人 +
+
+ +
+
+ 让帕克图斯变得更好 +
+
+

让帕克图斯变得更好

+ 有许多方式可以支持帕克图斯并帮助其成长。让我们一起努力,使帕克图斯变得更好! + + +
+
+
+ +
+
+
+

Our Partners

+
+
+
+ + sensifia + +
+
+ + ipminter + +
+
+
+
+
+
+ + +
+ + diff --git a/zh/learn/blockchain/account/index.html b/zh/learn/blockchain/account/index.html new file mode 100644 index 000000000..8ee1410e6 --- /dev/null +++ b/zh/learn/blockchain/account/index.html @@ -0,0 +1,633 @@ + + + + + + + + + + + + + Account | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Account

+ +

An account is an entity that is identified by a unique address, +which can send transactions on the blockchain.

+ +

Account Structure

+ +

The account structure is 12 bytes long and consists the following fields:

+ + + + + + + + + + + + + + + + + + +
SizeField
4 bytesNumber
8 bytesBalance
+ +
    +
  • Number is a sequential and unique number assigned to each account when it is created for the first time. +The account number is used to calculate the state hash of the blockchain.
  • +
  • Balance holds the balance of the account, which is the amount of Pactus coins held by the account.
  • +
+ +

Treasury Account

+ +

The Treasury account is a special account that is defined at the genesis time. +The Treasury account holds the total supply of Pactus coins, which is fixed at 21 million coins, +and each coin is divided into 1 billion units.

+ +

In each block, one coin from the treasury account is transferred to the proposer account +as block reward.

+ +

This block reward serves as an incentive for validators to propose and validate new blocks on the blockchain. +As a result, the total number of Pactus coins in circulation increases gradually over time as new blocks +are added to the blockchain.

+ +
+
+
+ + + + + diff --git a/zh/learn/blockchain/address/index.html b/zh/learn/blockchain/address/index.html new file mode 100644 index 000000000..39e1a1129 --- /dev/null +++ b/zh/learn/blockchain/address/index.html @@ -0,0 +1,635 @@ + + + + + + + + + + + + + Address | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Address

+ +

An address is a unique identifier that is used to send and receive transactions on the Pactus blockchain. +It is represented as a string of 42 alphanumeric characters and always begins with the letters “pc1”. +Here is an example of an address on the Pactus blockchain:

+ +
pc1p4e92hx0erqyx939crndvthvpn7qcdhefc9r6s7
+
+ +

Address Structure

+ +

An address in the Pactus blockchain is made up of 21 bytes and it is derived from the public key. +The first byte of the address specifies the address type, +while the remaining 20 bytes represent the hash of the public key. +The hash function used is RIPEMD-160, +which is applied after Blake2b): +The resulting byte array is then converted into a bech32m1 string.

+ +

Pactus address structure

+ +

Address Type

+ +

The address type specifies the type of the address and its defined as below:

+ +
    +
  • 0: Treasury address
  • +
  • 1: Validator address
  • +
  • 2: Account address
  • +
+ +

Treasury Address

+ +

The Treasury address on the Pactus blockchain is a fixed address that is defined as follows:

+ +
TreasuryAddress: 000000000000000000000000000000000000000000
+
+ +

The address type for the Treasury address is set to zero, which +means there is no key associated with the Treasury address. +The remaining characters of the address are all zeros.

+ + + +
+
+
+ + + + + diff --git a/zh/learn/blockchain/block/index.html b/zh/learn/blockchain/block/index.html new file mode 100644 index 000000000..ab0c81d14 --- /dev/null +++ b/zh/learn/blockchain/block/index.html @@ -0,0 +1,751 @@ + + + + + + + + + + + + + Block | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Block

+ +

In the Pactus, a block is a set of data that contains a header, the certificate of the previous block +and list of the transactions. +Once a block comes with a valid certificate, it is committed and added to the blockchain, and +the certificate will be included in the next block. +A committed block is immutable, and any modifications to the block will invalidate the certificate.

+ +

Pactus blockchain

+ +

Block Header

+ +

The block header is a data structure in the Pactus blockchain that contains important information about +the block.

+ +

The block header is 138 bytes long and consists the following fields:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SizeField
1 byteVersion
4 bytesTimestamp
32 bytesPrevious Block Hash
32 bytesState Hash
48 bytesSortition Seed
21 bytesProposer Address
+ +
    +
  • Version is used to track the software or protocol upgrade, and the current block version is set to 1.
  • +
  • Timestamp is the time of the block as the number of seconds since January 1, 1970 (Unix Epoch).
  • +
  • Previous Block Hash is the hash of the previous block in the blockchain.
  • +
  • State Hash is the state hash of the blockchain at this block. +The State Hash ensures that all nodes in the network have the same state.
  • +
  • Sortition Seed is a verifiable and unpredictable seed data used by +the sortition algorithm.
  • +
  • Proposer Address is the address of the validator who created and proposed the block.
  • +
+ +

Block Certificate

+ +

A block certificate is a proof of commitment for the block in the Pactus blockchain. +It is the result of the Pactus consensus algorithm and ensures that the block has been agreed upon by committee members.

+ +

The block certificate consists the following fields:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SizeField
4 bytesHeight
2 bytesRound
VariantCommitters
VariantAbsentees
48 bytesSignature
+ +
    +
  • Height is the height of the certified block.
  • +
  • Round is the consensus round in which this certificate was issued. +If a proposer fails to propose a block in one round, another validator takes over as the proposer, +and the round number is increased.
  • +
  • Committers is the list of validator numbers in the committee for the current certificate..
  • +
  • Absentees is the list of validator numbers that are absent in the committee.
  • +
  • Signature is the signature for the certificate that ensures the majority of the committee members have validated and +signed the proposed block.
  • +
+ +

Transactions

+ +

Each block in the Pactus blockchain contains a list of transactions. +The maximum number of transactions in a block is determined by the +consensus parameters, and currently set to 1000. +The first transaction in each block is the reward transaction. +Once a block is committed and added to the blockchain, all the transactions inside the block will be executed. +This means that the state of the blockchain will be updated based on the transactions in the committed block.

+ +

Block Hash

+ +

The block hash is a unique identifier for each block, which is computed by hashing the following data:

+ +
    +
  • Block header data (138 bytes)
  • +
  • Previous certificate hash (32 bytes)
  • +
  • Merkle root hash of transactions (32 bytes)
  • +
  • Number of transactions (variant)
  • +
+ +

The previous certificate hash and the Merkle root hash of transactions are included in the block hash to +ensure that they cannot be modified. +The block hash is used to link the blocks together in the blockchain.

+ +

FAQ

+ +

Is there any empty block in Pactus?

+ +

There is no completely empty block in Pactus. +Each block contains at least one transaction, which is the reward transaction.

+ +

How are certificates issued?

+ +

In the Pactus blockchain, a validator called a Proposer is responsible for collecting all transactions and +creating a block every 10 seconds. +The Proposer broadcasts the proposed block to other validators inside the committee. +Other validators verify the proposed block, and if it is valid, they cast their votes in favor of the proposed block by +signing the combination of the block hash and the consensus round. +More details about the consensus mechanism can be found in the +consensus protocol document.

+ +

To issue a valid certificate, signatures from validators who hold more than ⅔ of the stake in +the committee are required. +Once enough votes are collected, the signatures are aggregated and combined into a single signature, and +the certificate is issued.

+ +

How are certificates verified?

+ +

To verify a certificate for a block, the block hash is computed, and +the aggregated public key can be formed using the Committers and Absentees list. +Then, the signature can be verified using the aggregated public key and +the aggregated signature inside the certificate.

+ +
+
+
+ + + + + diff --git a/zh/learn/blockchain/cryptography/index.html b/zh/learn/blockchain/cryptography/index.html new file mode 100644 index 000000000..8d45b5859 --- /dev/null +++ b/zh/learn/blockchain/cryptography/index.html @@ -0,0 +1,614 @@ + + + + + + + + + + + + + Cryptography | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Cryptography

+ +

The Pactus blockchain employs various advanced cryptographic algorithms, including hashing and signature schemes, +to protect user data and transactions.

+ +

Hashing Algorithm

+ +

Pactus uses a hashing algorithm called Blake2b. +This algorithm is known for being a fast and secure way of creating unique digital fingerprints of data.

+ +

Digital Signature

+ +

To ensure secure transactions, Pactus uses a signature scheme called +BLS (Boneh–Lynn–Shacham) +threshold signature for cryptographic signing and verification.

+ +

Signature Aggregation

+ +

One of the advantages of BLS signatures is signature aggregation. BLS individual signatures can be +combined into one single aggregated signature, so that the overall size does not grow beyond one +signature.

+ +

Non-Malleability

+ +

BLS signatures have an important property called non-malleability, +which means that it is impossible to generate two valid signatures for the same message. +In other words, each message has a unique signature, and signatures cannot be altered without invalidating the signature.

+ +
+
+
+ + + + + diff --git a/zh/learn/blockchain/genesis/index.html b/zh/learn/blockchain/genesis/index.html new file mode 100644 index 000000000..50cafc9a9 --- /dev/null +++ b/zh/learn/blockchain/genesis/index.html @@ -0,0 +1,635 @@ + + + + + + + + + + + + + Genesis | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Genesis

+ +

The Pactus blockchain starts from scratch, with no pre-existing accounts or pre-allocated tokens. +Its starting point is known as the genesis block, which is created by the bootstrap validators.

+ +

Bootstrapping

+ +

The Pactus blockchain starts with four bootstrap validators. +These bootstrap validators do not have any stake, however their voting power is set to one within the consensus algorithm. +Their primary role is to initiate the blockchain during a brief period known as the bootstrapping phase. +As the bootstrapping phase progresses, these validators are able to earn rewards, +which they can later use to invite other validators to join the network.

+ +

Once the network reaches 21 validators, the bootstrap validators will retire, and +the blockchain will be secured by other validators.

+ +

Genesis Block

+ +

The genesis block is the first block in the Pactus blockchain, and it is created by the bootstrap validators. +This block marks the beginning of the blockchain and serves as the foundation for subsequent blocks.

+ +

The previous block hash in the genesis block sets to 0, +indicating that it has no predecessor. +Additionally, the genesis block does not have a previous certificate.

+ +

Genesis Information

+ +

In Pactus, the Genesis Information is pre-defined and indicates the initial state of the network. +These parameters are hardcoded into the project and include:

+ +
    +
  • Genesis Time This is the time when the genesis block should be created. +The bootstrap validators must be operational before this time.
  • +
  • Consensus Parameters: The initial consensus parameters +are defined at genesis time and ensure that the entire network operates within the same configuration. +These consensus parameters are discussed in detail in the consensus section of the documentation.
  • +
  • Treasury Account: The treasury account +is defined at the genesis time and holds the total supply of the Pactus blockchain, +21 million coins. Each coin is divided into 1 billion units.
  • +
  • Bootstrap Validators The bootstrap validators are defined by their public keys.
  • +
+ +

FAQ

+ +

Where can I see the Genesis Information?

+ +

You can find the pre-defined Genesis Information for the Testnet of the Pactus blockchain in the genesis.json file, +which is located in the project repository, here.

+ +
+
+
+ + + + + diff --git a/zh/learn/blockchain/incentive/index.html b/zh/learn/blockchain/incentive/index.html new file mode 100644 index 000000000..765b5ed18 --- /dev/null +++ b/zh/learn/blockchain/incentive/index.html @@ -0,0 +1,654 @@ + + + + + + + + + + + + + Incentive | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Incentive

+ +
+

The incentive may help encourage nodes to stay honest.

+ +

Satoshi Nakamoto

+
+ +

In Pactus, rewards are given to validators for proposing and validating new blocks on the blockchain. +These rewards serve as an incentive for validators to participate in the consensus process and +maintain the security and integrity of the network.

+ +

Flat Reward

+ +

To better understand the incentive model in Pactus, let’s compare it with the Bitcoin reward model. +This comparison will help to understand how the incentive model works in Pactus.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PactusBitcoin
Consensus engine is Proof of StakeConsensus engine is Proof of Work
Exactly every 10 seconds one block is mintedAround every 10 minutes one block is mined
Total supply is 21,000,000 coinTotal supply is 21,000,000 coin
Always one coin per blockInitial block reward is 50 coin
No halvingHalving happens every 4 years
+ +

The halving mechanism in Bitcoin rewards early contributors more significantly. +However, in a Proof-of-Stake blockchain, this mechanism can lead to wealth centralization, +as early validators gain too much power based on their staked coins.

+ +

To promote fairer block rewards, Pactus has introduced a simple and straightforward incentive model called the “Flat Reward.” +In this model, the block reward remains constant at one coin per block and does not change over time.

+ +

Rewards in Bitcoin

+ +

Rewards in Pactus

+ +

Coin Distribution

+ +

In Pactus, the coin distribution is linear. This linear distribution is a direct result of the Flat Reward system. +Unlike other blockchains that have a curved distribution, Pactus maintains a consistent coin distribution.

+ +

Coin distribution in Bitcoin

+ +

Coin distribution in Pactus

+ +
+
+
+ + + + + diff --git a/zh/learn/blockchain/serialization/index.html b/zh/learn/blockchain/serialization/index.html new file mode 100644 index 000000000..1e3893b47 --- /dev/null +++ b/zh/learn/blockchain/serialization/index.html @@ -0,0 +1,739 @@ + + + + + + + + + + + + + Data Serialization | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Data Serialization

+ +

Data serialization is the process of converting data into a format that can be easily stored or transmitted over a network. +It typically involves encoding data into a sequence of bytes, which can later be decoded to +reconstruct the original data structure. +Pactus has two methods for data serialization: Deterministic serialization and CBOR serialization:

+ +

Deterministic Serialization

+ +

Pactus uses a deterministic serialization for the deterministic data like blocks and transactions. +The serialization format for different types of data is listed in the table below:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Data TypeSize (bytes)Description
uint81An 8 bits unsigned integer
int81An 8 bits signed integer
uint162A 16 bits unsigned integer
int162A 16 bits signed integer
uint324A 32 bits unsigned integer
int324A 32 bits signed signed integer
uint648A 64 bits unsigned integer
int648A 64 bits signed signed integer
VarIntVariableA compact representation of an unsigned integer.
VarByteVariableA variable length bytes
VarStringVariableA variable length string
Address2121 bytes of address data
Hash323232 bytes of hash data
+ +

VarInt

+ +

Variable length integer (VarInt) is encoded by 7-bit chunks. The MSB indicates whether there are +more octets (1) or it is the last one (0). It means 0x00 to 0x7f encoded in 1 byte, 0x80 to +0x3fff encoded in 2 bytes, …

+ +

Example:

+ +
0x0f -> 0f
+0x1000 -> 8020
+0xffff -> ffff03
+0xffffff -> ffffff07
+
+ +

VarByte

+ +

Variable length byte (VarByte) is encoded as a variable length integer (VarInt) containing the +length of the array followed by the bytes themselves: VarInt(len(bytes)) || bytes

+ +

VarString

+ +

Variable length string (VarString) is encoded as a variable length integer (VarInt) containing the +length of the string followed by the bytes that represent the string +itself:VarInt(len(str)) || str

+ +

Byte Order

+ +

All the internal number representation are in little-endian byte order.

+ +

Example

+ +

Here is an example of a block header data that encoded using deterministic serialization:

+ +
+ + +

CBOR Serialization

+ +

For non-deterministic data, such as networking messages, Pactus uses +“Concise Binary Object Representation” or CBOR. +CBOR is a binary data serialization format that is widely used in various application, +including IoT, web services, security, and automotive, due to its compact representation and efficient parsing.

+ +

CBOR Me!

+ +

cbor.me +is an online tool for encoding and decoding CBOR data, offering developers an easy way to test and +validate their CBOR data without having to set up a local environment.

+ +

Example

+ +

Here is an example of a vote message that encoded using CBOR.

+ +
+ + + +
+
+
+ + + + + diff --git a/zh/learn/blockchain/state-hash/index.html b/zh/learn/blockchain/state-hash/index.html new file mode 100644 index 000000000..b60745f34 --- /dev/null +++ b/zh/learn/blockchain/state-hash/index.html @@ -0,0 +1,646 @@ + + + + + + + + + + + + + State Hash | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

State Hash

+ +

The State Hash is used to ensure the integrity of the data in the Pactus blockchain. +It serves as a unique identifier or fingerprint of the current state of the blockchain, +allowing all nodes to verify that their data matches that of the other nodes. +This helps to prevent any tampering or inconsistencies in the data, ensuring the accuracy and consistency of the blockchain.

+ +

Merkle Tree

+ +
+

In cryptography and computer science, a hash tree or Merkle tree is a tree in which every leaf node +is labelled with the cryptographic hash of a data block, and every non-leaf node is labelled with +the cryptographic hash of the labels of its child nodes. Hash trees allow efficient and secure +verification of the contents of large data structures.

+ +

From Wikipedia

+
+ +

A Hash tree or Merkle tree is a data structure that used by many blockchains to solve this problem: +“How can data be securely stored and verified in a decentralized network?”

+ +

By using a Merkle tree, nodes can easily verify that they store the same data +without having to share the entire dataset. Additionally, this helps to prevent any tampering with the data, +as any changes made to the data would cause inconsistencies in the Merkle tree and +can be easily detected by the network.

+ +

State Merkle Trees

+ +

In Pactus, the Merkle tree is used to verify the state of the blockchain in each block. +The state hash in each block is calculated by taking the hash of two Merkle trees: +the accounts Merkle tree and the validators Merkle tree. +Each leaf in these trees contains the hash of the associated account or validator. +By using the state hash, all nodes in the network can ensure they have the same data stored.

+ +

State hash

+ +

Scalability of Merkle Tree

+ +

Using a Merkle tree to calculate the state of the blockchain can be challenging +because when the number of accounts is large, calculating the root hash can be difficult. +In other words, a simple Merkle tree may not be scalable because calculating all the leaf +and node hashes requires a significant amount of computation.

+ +

In Pactus, all accounts and validators have unique and sequential numbers. +This means that each account and validator has a dedicated account number that helps us to +calculate the hash of leaf nodes in the Merkle tree. +By using these account numbers, we can ensure that the position of the leaf nodes in +the Merkle tree is always the same. +This approach allows us to avoid rebuilding the Merkle tree whenever an account or validator’s state changes. +Instead, we can save the previous Merkle tree and recalculate the parent hashes by +fetching neighbor hashes as needed. +This helps to ensure scalability and reduces the computational resources required for recalculating the Merkle tree.

+ +

Account tree

+ +

In this example, only account 6 has been updated. +By locating the corresponding leaf node in the existing Merkle tree and +traversing the tree towards the root node, we can calculate new root hash. +This approach has a complexity of \(O(log n)\), making it efficient for large numbers of accounts.

+ +
+
+
+ + + + + diff --git a/zh/learn/blockchain/validator/index.html b/zh/learn/blockchain/validator/index.html new file mode 100644 index 000000000..ca66b0742 --- /dev/null +++ b/zh/learn/blockchain/validator/index.html @@ -0,0 +1,642 @@ + + + + + + + + + + + + + Validator | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Validator

+ +

A Validator is an entity that participates in the consensus process by sharing its votes. +Validators get rewarded for creating new blocks, and to become a Validator, +they must “bond” or lock up a certain amount of coins as stake. +The amount of stake held by validators determines their power in the consensus.

+ +

Validator Structure

+ +

The Validator structure is 120 bytes long and consists the following fields:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SizeField
96 bytesPublic Key
4 bytesNumber
8 bytesStake
4 bytesLast Bonding Height
4 bytesUnbonding Height
4 bytesLast Joined Height
+ +
    +
  • Public Key is the Validator’s public key.
  • +
  • Number is a sequential and unique number assigned to each validator when it is created for the first time. +The validator number is used to calculate the state hash of the blockchain.
  • +
  • Stake holds the Validator’s stake or the amount of Pactus coins locked or “staked” by the Validator.
  • +
  • Bonding Height is the last block height that the validator has bonded their stake.
  • +
  • Unbonding Height is the block height that the validator’s stake is unbonded.
  • +
  • Last Joined Height is the block height that the validator joined the committee.
  • +
+ +
+
+
+ + + + + diff --git a/zh/learn/consensus/committee/index.html b/zh/learn/consensus/committee/index.html new file mode 100644 index 000000000..f325d27c4 --- /dev/null +++ b/zh/learn/consensus/committee/index.html @@ -0,0 +1,730 @@ + + + + + + + + + + + + + Committee | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Committee

+ +

The committee is a group of 21 validators responsible for generating new blocks. +Validators in the committee participate in the consensus algorithm by casting votes, +with their voting power determined by their stake. +While in the committee, validators cannot send Bond or Unbond transactions, +meaning their voting power remains the same. +The members of the committee changes randomly over time through Sortition transactions. +Each block can contain zero or more Sortition transactions.

+ +

These rules are applied when committing sortition transactions:

+ +
    +
  1. A minimum of ⅔ of the total stake must be maintained in the committee.
  2. +
  3. If a validator is already in the committee, they will remain in the committee.
  4. +
  5. If a validator is not in the committee, the oldest validator will exit the committee.
  6. +
  7. Each validator should stay in committee at least for 21 blocks.
  8. +
+ +

Proposer Selection

+ +

Proposer selection within the committee operates on a deterministic, clockwise rotation system. +If a validator is unable to propose, for any reason, it stays within the committee, but +the proposer’s role shifts to the next validator in the committee.

+ +

Proposer selection

+ +

Adding Validators to the Committee

+ +

When a new validator joins the committee, they take a position before the current proposer. +After the addition of a new validator, the committee adjusts to maintain the total number of validators at 21. +This is achieved by removing the oldest validator from the committee, +i.e., the one that has been in the committee for the longest time.

+ +

Adding Validators to the Committee

+ +

Security of the Committee

+ +

For an adversary to take control of the committee, they would need to control more than ⅔ of the stake within the committee. +To assess the security of the committee, let’s assume all validators in the committee have the same voting power. +In this case, an adversary would need to control more than ⅔ of the validators in the committee.

+ +

Now, let’s imagine an adversary holds 10% of the total stake. +As a result, one of their validators can enter the committee every 10 blocks. +In the first 10 blocks, one of the adversary’s validators enters the committee. +In the next 10 blocks, another validator enters the committee, giving the adversary two validators within the committee. +In the subsequent 10 blocks, another validator enters, but at the same time, the first validator leaves the committee. +Therefore, an adversary with 10 10% of the total stake can have, on average, two validators in a committee of 21 validators.

+ +

Using the Poisson distribution, +we can estimate the probability of an adversary controlling ⅔ of the committee:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Adversarial StakeCommittee size⅔+ of committeeAdversarial committee membersProbability of controlling ⅔+
15%21153\(5.46 \times 10^{-07}\)
15%55357\(3.34 \times 10^{-14}\)
15%996714\(1.41 \times 10^{-24}\)
10%21152\(3.39 \times 10^{-09}\)
10%55355\(1.90 \times 10^{-18}\)
10%99679\(2.91 \times 10^{-35}\)
5%21151\(2.81 \times 10^{-13}\)
5%55352\(4.50 \times 10^{-31}\)
5%99674\(1.09 \times 10^{-56}\)
+ +

FAQ

+ +

How can one know when a validator has joined the committee?

+ +

The height at which the validator joined the committee is recorded as the “Last Joined Height” field in +the validator structure. +Once a validator enters the committee, this field is set to the current height it +evaluated the sortition proof.

+ +

Can a validator within the committee run the sortition algorithm?

+ +

A validator within the committee can run the sortition algorithm. +If they generate a valid sortition transaction, the height of their entry into the committee is set +to the current block height, allowing them to stay in the committee for a longer period.

+ +
+
+
+ + + + + diff --git a/zh/learn/consensus/parameters/index.html b/zh/learn/consensus/parameters/index.html new file mode 100644 index 000000000..d5f6a8fb4 --- /dev/null +++ b/zh/learn/consensus/parameters/index.html @@ -0,0 +1,628 @@ + + + + + + + + + + + + + Consensus Parameters | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Consensus Parameters

+ +

Consensus parameters are a set of configurable settings that determine how the Pactus blockchain operates. +These parameters are agreed upon by all validators in the network, +ensuring that validators behave in the same way and that the network operates consistently.

+ +

Here is the list of the consensus parameters:

+ +
    +
  • Block Version: The version number of the blockchain protocol. +This is set to 1.
  • +
  • Block Time: The time interval in seconds between the creation of two consecutive blocks. +This is set to 10 seconds, which means that a new block is created every 10 seconds.
  • +
  • Committee Size The number of validators in the committee. +This is set to 21 validators.
  • +
  • Block Reward The fixed reward amount given to the validator who successfully creates and proposes a new block. +This is set to 1,000,000,000, which is equivalent to one coin.
  • +
  • Time-to-Live Interval: The number of blocks that a transaction can remain unprocessed before +it is removed from the transaction pool. +This is set to 8640 blocks, which is almost one day.
  • +
  • Bond Interval: The minimum number of blocks that must elapse after a validator has submitted a bond transaction +before they can participate in the consensus process and join the validator committee. +This is set to 360 blocks, which is almost one hour.
  • +
  • Unbond Interval: The minimum number of blocks that must elapse after a validator has submitted +an unbond transaction before +they can withdraw their staked coins. +This is set to 181440 blocks, which is almost 21 days.
  • +
  • Sortition Interval: The maximum number of blocks that a sortition transaction can remain valid and be included +in a block. +This is set to 7 blocks.
  • +
  • Fee Fraction: The fraction of transaction value that must be paid in order for a transaction to be included in a block. +This is set to 0.0001 PAC, meaning that 0.01% of transaction value are awarded to the block proposer.
  • +
  • Minimum Fee: The minimum transaction fee that must be paid. +This is set to 1,000 (satoshi), which is equivalent to 0.000001 PAC coin.
  • +
  • Maximum Fee: The maximum transaction fee that must be paid. +This is set to 1,000,000 (satoshi), which is equivalent to 0.001 PAC coin.
  • +
  • Maximum Stake: The maximum amount of coins that can be staked by a validator. +This is set to 1,000,000,000,000 (satoshi), which is 1000 PAC coins.
  • +
  • Minimum Stake: The minimum amount of coins that can be staked by a validator. +This is set to 1,000,000,000 (satoshi), which is 1 PAC coins.
  • +
+ +
+
+
+ + + + + diff --git a/zh/learn/consensus/proof-of-stake/index.html b/zh/learn/consensus/proof-of-stake/index.html new file mode 100644 index 000000000..790508bcc --- /dev/null +++ b/zh/learn/consensus/proof-of-stake/index.html @@ -0,0 +1,649 @@ + + + + + + + + + + + + + Solid State Proof of Stake | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Proof of Stake

+ +

Proof of Stake is a way to secure a blockchain through requesting users to stake some amount of their coins. +These stakeholders, called validators, are responsible to collect, validate and add transactions to the blockchain. +The validators will be rewarded with native coins.

+ +

Unlike Proof of Work, which is based on competition, Proof of Stake is based on collaboration. +Validators work together to manage the expansion of the blockchain. +A Proof of Stake blockchain becomes more decentralized and secure as more validators participate in it.

+ +

An example

+ +

To understand how Proof of Stake works, imagine a community bank without any centralized authority. +In this bank, users decide to run it together. +Some of these users volunteer to collect, validate, and record transactions, +ensuring that everything runs smoothly.

+ +

These volunteers, known as validators, must temporarily lock or freeze some of their money as a stake. +This stake can’t be transferred or used. +The more money a validator stakes, the more influence they have in the system.

+ +

From time to time, one of the validators is chosen by the others to collect all the recent transactions, +bundle them together, and send a copy to the other validators. +If a supermajority of the validators agree with the proposed bundle by signing it, +the bundle will be committed to the bank’s ledger.

+ +

In this system, validators have no incentive to behave maliciously or dishonestly. +If they do, they risk harming the bank’s reputation and the value of their own stakes as well.

+ +

Delegated Proof of Stake

+ +

In Proof of Stake, if the number of validators increases, +the voting time will also increase, and this can lead to an inefficient consensus mechanism. +In our community bank example, running the bank becomes more difficult as the number of validators increases.

+ +

To solve this problem, some blockchains use the concept of “delegators”. +In Delegated Proof of Stake, users entrust their stakes to a small group of “delegates”. +These delegates are responsible for validating transactions and creating blocks. +The number of delegates is limited to ensure accountability and efficiency in the validation process.

+ +

Delegated Proof of Stake

+ +

The delegation model puts a lot of trust in the hands of a small number of delegates, +which goes against the principle of “don’t trust, verify”.

+ +

Consensus without delegation or Solid State Proof of Stake (SSPoS)

+ +

Pactus introduced a mechanism that doesn’t rely on delegation, we call it Solid State Proof of Stake. +It utilizes a dynamic committee of validators +that are responsible for creating new blocks. +The size of the committee is fixed, but the members of the committee are randomly changed. +On the other hand, the number of validators outside the committee is unlimited, allowing anyone to +become a validator by staking coins.

+ +

At each block, validators participate in a sortition algorithm +by generating a random number between zero and the total staked coins. +If the number is less than the validator’s stake, they can enter the committee and replaces the oldest committee member.

+ +

Pactus Solid State Proof of Stake

+ +

The chance of entering the committee depends on the validator’s stake and luck. +But on average, one validator should enter the committee in each block.

+ +
+
+
+ + + + + diff --git a/zh/learn/consensus/protocol/index.html b/zh/learn/consensus/protocol/index.html new file mode 100644 index 000000000..38c531475 --- /dev/null +++ b/zh/learn/consensus/protocol/index.html @@ -0,0 +1,850 @@ + + + + + + + + + + + + + Consensus protocol | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+ This post is obsolete. check here for more information. +
+ +

Consensus Protocol

+ +

Pactus consensus algorithm is a state machine +replication with Byzantine fault tolerance. +The Pactus consensus algorithm starts with the block creation phase. +In this phase one validator acts as the proposer. The proposer collects all the transactions, +creates a block, and proposes it to other validators.

+ +

When a proposed block is seen by other validators, they validate the block and +cast their vote for the proposed block, moving to the “prepare” state.

+ +

If more than two-thirds (⅔) of the total stakes cast their votes, the proposed block becomes prepared, +and validators move to the “precommit” state.

+ +

If, once again, more than two-thirds (⅔) of the total stakes cast their vote for the prepared block, +the block is committed, and the next proposer is ready to propose a new block. This cycle repeats every 10 seconds.

+ +

If a proposer fails to propose in any round, other validators start the “change proposer” phase to +decide to change the proposer for this round.

+ +

Pactus consensus states

+ +

The Algorithm

+ +

There are \(R = 3f+1\) validators. where \(f\) is the maximum +number of validators that may be faulty or byzantine. For example, if there is one faulty validator, +the resiliency of the algorithm is optimal if we have at least \(3\) non-faulty +validators. So the minimum number of validators should be \(3+1=4\).

+ +

We denote a message as \(\langle m \rangle\) tuple and a signed message by node \(i\) as +\(\langle m \rangle_{\sigma_i}\).

+ +

Pactus consensus algorithms has two phases: Block creation phase and change proposer phase.

+ +

Block Creation

+ +

The block creation phase in Pactus consensus algorithm includes these three steps1: +Propose, Prepare and Precommit. +The protocol proceeds in rounds \(r = 0, 1, 2, \ldots\).

+ +

Propose Step

+ +

In each round \(r\), one validator is the proposer and the others act as validators. +The proposer \(p\) collects transactions and creates a proposal block \(B\). It signs and +broadcasts a proposal message with the proposed block piggybacked to all the validators. +Propose message has this form:

+ +\[\langle \langle \text{PROPOSE},h,r \rangle_{\sigma_p}, B \rangle\] + +

where:

+ +
    +
  • \(B\) is the proposed block
  • +
  • \(h\) indicates the block height
  • +
  • \(r\) is an assigned round number, which is zero for the first round
  • +
+ +

Prepare Step

+ +

If validator \(i\) accepts the proposal, it enters prepare step and signs and +broadcasts prepare message to all other validators. Otherwise, it does nothing. +The prepare message has this form:

+ +\[\langle \text{PREPARE},h,r,d \rangle_{\sigma_i}\] + +

where:

+ +
    +
  • \(d\) is digest or hash of proposed block \(B\)
  • +
+ +

If validator \(i\) received \(2f+1\) prepare messages from other +validators (including its own), it becomes prepared and enters to precommit step.

+ +

Precommit Step

+ +

In precommit step, validator \(i\) signs and broadcasts precommit message to +the other validators. +The precommit message has this form:

+ +\[\langle \text{PRECOMMIT},h,r,d \rangle_{\sigma_i}\] + +

Each validator executes and commits block \(b\) after receiving +\(2f+1\) precommit messages (including its own) and becomes committed.

+ +

Block Announcement

+ +

Each validator that receives a valid proposal and with \(2f+1\) precommit messages from other +validators (including its own), can create a block-announce messages and broadcasts it to the network. +The block-announce message has this form:

+ +\[\langle \text{BLOCK-ANNOUNCE} ,h ,r ,B, C \rangle\] + +

where:

+ +
    +
  • \(C\) is the quorum certificate for the precommit step.
  • +
+ +

Validators can move to the next height and clear the message logs after receiving valid +block-announce message, even if their timer has expired.

+ +

The picture below shows the operation of the algorithm in the normal case. validator 1 is the +proposer and validator 4 is faulty.

+ +

Normal execution

+ +

Change Proposer

+ +

The change-proposer provides liveness by allowing the system to make progress when the proposer fails. +The change-proposer phase is triggered by timeouts that +prevent validators from waiting indefinitely for the proposal to execute.

+ +

If the timer of a validator expires in round \(r\), the validator starts a change-proposer phase. +The change-proposer phase is an Asynchronous Byzantine Binary Agreement (ABBA) 2 that is biased toward zero (No). +It means that during this phase, even if they don’t have the proposal, honest validators may decide to vote zero +if they obtain a valid quorum Certificate for the prepare step.

+ +

If a supermajority of the validators decide to change the proposer, they move to round r+1r+1. However, +if they decide not to change the proposer, they will return to the prepare state and, +since a supermajority of the validators attested to a valid proposal, they can commit the proposed block.

+ +

The change proposer phase in Pactus consensus algorithm includes these three steps: +Pre-vote, Main-vote and Decide +The protocol proceeds in rounds \(r_{cp} = 0, 1, 2, \ldots\).

+ +

Pre-vote Step

+ +

In Pre-vote step each validator casts a pre-vote for a value \(b \in \{0, 1\}\) +and broadcasts pre-vote message to the network. +The pre-vote message has this form:

+ +\[\langle\langle \text{CP:PRE-VOTE},h,r,r_{cp},b \rangle_{\sigma_i}, justification\rangle\] + +

The first round is a special round and each validator starts with an initial value. +If the validator’s timer has expired in the prepare step, its initial value is zero, +and if the validator’s timer has expired in the precommit step, its initial value is one.

+ +\[b = \begin{cases} +1 & \text{if timer expired in prepare step,} \\ +0 & \text{if timer expired in precommit step.} +\end{cases}\] + +

In the next rounds, each validator select \(2f+1\) properly justified main-votes from round \(r − 1\) and

+ +\[b = \begin{cases} +0 & \text{if there is a main-vote for 0,} \\ +1 & \text{if there is a main-vote for 1,} \\ +0 (biased) & \text{if all main-votes are abstain.} +\end{cases}\] + +

These pre-votes must be justified with a appropriate justification. +For the first round, if the validator’s timer has expired in the prepare step, the justification is \(nil\) , +and if the validator’s timer expired in the precommit step, +the justification is the proper quorum certificate for the prepare step at round \(r\).

+ +

In the next rounds, a pre-vote for \(b\) may be justified in two ways:

+ +
    +
  • Hard: that is the quorum certificate for \(\langle \text{CP:PRE-VOTE},h,r,r_{cp}-1,b \rangle\)
  • +
  • Soft: that is the quorum certificate for \(\langle \text{CP:MAIN-VOTE},h,r,r_{cp}-1,abstain \rangle\)
  • +
+ +

Main-vote Step

+ +

After collecting \(2f+1\) valid and justified pre-votes, each validator casts a main-vote \(v \in \{0, 1, abstain\}\) +and broadcasts main-vote message to the network. +The main-vote message has this form:

+ +\[\langle\langle \text{CP:MAIN-VOTE},h,r,r_{cp},v \rangle_{\sigma_i}, justification\rangle\] + +

The main-vote value \(v\) determine as below:

+ +\[v = \begin{cases} +0 & \text{if there are 2f+1 pre-vote for 0,} \\ +1 & \text{if there are 2f+1 pre-vote for 1,} \\ +abstain & \text{if there are pre-votes for 0 and 1.} +\end{cases}\] + +

These main-votes must be justified with a appropriate justification. +A main-vote for \(v\) may be justified in two ways:

+ +
    +
  • Non-conflicting: that is the quorum certificate for \(\langle \text{CP:PRE-VOTE},h,r,r_{cp},b \rangle\)
  • +
  • Conflicting: that consists of the justifications for the two conflicting pre-votes.
  • +
+ +

Decide Step

+ +

After collecting \(2f+1\) valid and justified main-votes, each validator examines these votes. If all +votes are for a value \(b \in \{0, 1\}\), then the validator decides \(b\), but continues to +participate in the protocol for one more round. Otherwise, the validator proceeds to the next round \(r_{cp}+1\).

+ +

Comparison

+ +

Pactus consensus protocl doesn’t have any lcoking mechanism or +checkpointing and there will at most one valid proposla per round. +This ensures that each round can begin with a new proposal.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ProtocolNormal caseFaulty case
StepsComplexityLockingCheckpointing
PBFT3$$O(n^2)$$NoYes
Tendermint3$$O(n^2)$$YesNo
HotStuff4$$O(n)$$YesNo
Pactus3$$O(n^2)$$NoNo
+ +
+ +

References:

+ + + +
+
+
+ + + + + diff --git a/zh/learn/consensus/sortition/index.html b/zh/learn/consensus/sortition/index.html new file mode 100644 index 000000000..580b5f415 --- /dev/null +++ b/zh/learn/consensus/sortition/index.html @@ -0,0 +1,746 @@ + + + + + + + + + + + + + Sortition Algorithm | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Sortition Algorithm

+ +

The sortition algorithm is an important part of the Pactus blockchain, responsible for the fair, transparent +and random selection of validators to join the committee. +It utilizes a Verifiable Random Function, or VRF for short, to generate a verifiable random number.

+ +

The generated random number should be in the range of 0 to the total staked coins. +If validators can prove that their generated number is less than their stake, +they can send the sortition transaction. +Once a sortition transaction is included in a block, the validator will join the committee, +and the oldest validator in the committee will leave it.

+ +

Verifiable Random Function

+ +

Verifiable Random Function is a pseudo-random function that the owner of key \(s\) can evaluate \(v = f_s(x)\) and also provides +\(proof_{x}\) efficiently proving that \(v\) is correct. We call such a mathematical +object a verifiable pseudo-random function, VRF for brevity 1.

+ +

Pactus uses the BLS signature scheme as the source of VRF. +Since BLS signatures are unique, +the hash of a BLS signature can be used to produce a secure and verifiable random number.

+ +

The VRF takes three parameters:

+ +
    +
  1. The secret key of the validator
  2. +
  3. The sortition seed
  4. +
  5. The total stake of the blockchain.
  6. +
+ +

Once the VRF is executed, it produces an index with a proof. +The index is a number between zero and the total staked coins, and the proof allows other validators to verify the correctness +of the generated index.

+ +

The pseudocode below demonstrates the evaluation of the VRF for the sortition algorithm:

+ +\[\begin{align*} +& \textbf{function} \ VRF(sk, seed, total\_stake) \\ +& \qquad pk \gets P_{BLS}(sk) \\ +& \qquad proof \gets S_{BLS}(sk, seed \| pk) \\ +& \qquad rnd \gets H(proof) \\ +& \qquad index \gets \frac{(rnd \times total\_stake)}{2^{256}} \\ +& \qquad \\ +& \qquad \textbf{return} \ index, proof \\ +& \textbf{end function} +\end{align*}\] + +

where:

+ +
    +
  • \(sk\) is the secret key of the validator
  • +
  • \(seed\) is the sortition seed
  • +
  • \(total\_stake\) is the total stake of the blockchain
  • +
  • \(P_{BLS}\) is a cryptographic function that derives the public key from the secret key for the BLS signature
  • +
  • \(S_{BLS}\) is a cryptographic function that signs a message with the secret key for the BLS signature.
  • +
  • \(H\) is a cryptographic hash function that generates a number between \(0\)to \(2 ^{256}\)
  • +
  • \(\|\) denotes the concatenation of two values
  • +
+ +

To verify a sortition proof, both the validator’s public key and stake are required:

+ +\[\begin{align*} +& \textbf{function} \ verifyVRF(pk, seed, proof, stake, total\_stake) \\ +& \qquad \textbf{if} \ V_{BLS}(pk, seed \| pk, proof) = True \ \textbf{then} \\ +& \qquad \qquad rnd \gets H(proof) \\ +& \qquad \qquad index \gets \frac{(rnd \times total\_stake)}{2^{256}} \\ +& \qquad \\ +& \qquad \qquad \textbf{return} \ index \leqslant stake \\ +& \qquad \textbf{else} \\ +& \qquad \qquad \textbf{return} \ False \\ +& \qquad \textbf{end if} \\ +& \textbf{end function} +\end{align*}\] + +

where:

+ +
    +
  • \(V_{BLS}\) is a cryptographic function used to verify a signed message using the BLS signature scheme
  • +
+ +

There is no need to send \(index\) alongside \(proof\) because the +result should be less than the validator’s stake, and the validator’s stake is known at each block.

+ +

Sortition Seed

+ +

The sortition algorithm relies on a random and publicly verifiable seed that cannot be manipulated by adversaries. +Otherwise, adversaries may select a seed that favors the selection of corrupt users.

+ +

To prevent this, the BLS signature scheme is used to generate the sortition seed. +Since BLS signatures are unique and deterministic, adversaries cannot generate more than one valid signature per block. +In each block, the block proposer generates a new sortition seed based on the previous seed using the following function:

+ +\[\begin{align*} +& \textbf{function} \ generateSeed(sk, prev\_seed) \\ +& \qquad \textbf{return} \ S_{BLS}(sk, H(prev\_seed)) \\ +& \textbf{end function} +\end{align*}\] + +

Since the proposer’s public key is known, the seed for the next block can be easily verified. +If the seed is invalid, the proposed block will be rejected. +The verification function is as follows:

+ +\[\begin{align*} +& \textbf{function} \ verifySeed(pk, prev\_seed, seed) \\ +& \qquad \textbf{return} \ V_{BLS}(pk, H(prev\_seed), seed) \\ +& \textbf{end function} +\end{align*}\] + +

The sortition seed for the genesis block set to 0.

+ +

Sortition Probability

+ +

The Sortition probability refers to the expected number of validators that may join the committee in each block, +assuming all validators are actively online and executing the sortition algorithm.

+ +

The probability of a validator \(i\) being selected depends on their stake relative to the total stake in the system:

+ +\[p_i=\frac{S_i}{S_t}\] + +

where:

+ +
    +
  • \(p_i\) is the probability of validator \(i\) being selected
  • +
  • \(S_i\)​ is the stake of validator \(i\)
  • +
  • \(S_t\)​ is the total stake of all validators.
  • +
+ +

Therefore, the expected number of validators joining the committee at each block can be represented as:

+ +\[P=\sum_{i=1}^{n}{p_i}=\sum_{i=1}^{n}{\frac{S_i}{S_t}}=\frac{S_1+S_2+\ldots+S_n}{S_t}\] + +

where \(n\) is the total number of validators. We know that \(S_t={S_1+S_2+\ldots+S_n}\). Therefore we will have:

+ +\[P=\frac{S_t}{S_t}=1\] + +

Thus, on average, we expect one validator to join the committee at each block. +In practice, the actual number of validators joining the committee in each block +may differ due to the randomness in the sortition algorithm, or the possibility of some validators being offline.

+ +

FAQ

+ +

How is the total staked coin calculated?

+ +

The total staked coin in each block is calculated by summing the staked coins of all active validators. +An active validator is a validator that has not yet unbonded.

+ +

How is the oldest validator determined?

+ +

The height at which the validator joined the committee is recorded as the “Last Joined Height” field in +the validator structure. +The validator with the lowest “Last Joined Height” is considered the oldest.

+ + + +
+
+
+ + + + + diff --git a/zh/learn/consensus/specification/index.html b/zh/learn/consensus/specification/index.html new file mode 100644 index 000000000..42d931770 --- /dev/null +++ b/zh/learn/consensus/specification/index.html @@ -0,0 +1,626 @@ + + + + + + + + + + + + + Consensus specification | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Consensus Specification

+ +

Developing distributed and concurrent systems is a complex task that requires careful attention to the details. +Testing such systems is challenging because it’s difficult to simulate all possible states, +including those that can happen due to system failures, network latency, and other factors. +This makes it hard to ensure that the system behaves correctly in all circumstances.

+ +

Therefore it’s essential to have a proactive approach that involves modeling the system’s behavior in a formal way. +Such an approach can help identify potential issues before they occur, saving time and preventing costly flaws.

+ +

TLA+

+ +

TLA+ is a formal specification language developed by +Leslie Lamport based on the idea of +specifying systems using simple mathematics. +It is used for designing, modelling, documentation, and verification of programs, especially concurrent and +distributed systems. +TLA+ and its tools are useful for eliminating fundamental design errors, which are hard to find and +expensive to correct in code.

+ +

To know more about TLA+, check The TLA+ Home Page.

+ +

Pactus Consensus Spec

+ +

Pactus consensus specification +has written in TLA+ format. It includes all invariants that can be held +in every state of every execution that the protocol allows. The TLA+ specification is compiled into +PDF file.

+ +

Safety Proof

+ +

By defining some invariants we can ensure the safety of the consensus +protocol in any possible and +distinct state, and therefore we have the informal safety proof of the Pactus consensus protocol using TLA+.

+ +

Liveness Proof

+ +

Checking the liveness is not easy, but with defining some constraints, we have the informal proof of +liveness of Pactus consensus protocol using TLA+.

+ +
+
+
+ + + + + diff --git a/zh/learn/index.html b/zh/learn/index.html new file mode 100644 index 000000000..7e2d3a162 --- /dev/null +++ b/zh/learn/index.html @@ -0,0 +1,467 @@ + + + + + + + + + + + + + 学习 | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+

学习

+ +

在这里,您可以找到帕克图斯项目的技术文档。

+ +

Table Of Content

+ + + +
+
+
+
+ + + + + diff --git a/zh/learn/smart-contract/storage/index.html b/zh/learn/smart-contract/storage/index.html new file mode 100644 index 000000000..d26376469 --- /dev/null +++ b/zh/learn/smart-contract/storage/index.html @@ -0,0 +1,703 @@ + + + + + + + + + + + + + Storage as file | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Storage as file

+ +

Motivation

+ +

Ethereum friendly blockchains keep storage in a separate key/value database per request. This has +some drawbacks:

+ +
    +
  • Since there is a global database that stores all storages, the storage key is a combination of +\(Key_{contract} + Key_{item}\) that is a bit messy.
  • +
  • Storage data can’t have any meta data, because they are scattered in different places in the +key/value database.
  • +
  • Storages per smart contract can’t be Merklized. Ethereum came with another solution to calculate +the hash of the whole storage. They defined a hexary Patricia tree that is quite +suboptimal.
  • +
+ +

Here we discuss how we can address the above issues by dedicating a separate file as Storage +File per smart contract. In this scenario, users should purchase the storage file with required +capacity before deploying the smart contract. Once the purchase is done, a separate empty file will +be created and dedicated for the user. The size of the file is the same as the purchase size. For +example users can purchase 10 MB or 120 MB of storage files depending on their need and renew them +yearly.

+ +

Structure

+ +

Each storage file has three parts: Header, ByteCodes and contract storage.

+ +

Storage file structure

+ +

The Header of the storage file keeps some meta data like storage file index, last payment time, +total storage size, etc. In the ByteCodes section the byte codes of the smart contract will be saved +and in the storage section, the actual storage of the smart contract will be stored.

+ +

Storage APIs

+ +

Smart contracts can only change data in storage sections. To achieve that the smart contract +executer (virtual machine) should introduce these APIs:

+ +
/// This API requests the host to read the slice of `data` from the storage file
+/// at the given `offset`.
+fn read(&self, offset: u32, data: &mut [u8]) -> Result<(), HostError>;
+
+/// This API requests the host to write the slice of `data` into the storage file
+/// at the given `offset`
+fn write(&self, offset: u32, data: &[u8]) -> Result<(), HostError>;
+
+
+ +

These APIs are similar to SLoad and SStore opcodes in Ethereum Virtual Machine (EVM). But +instead of key and value, they accept offset and data parameters.

+ +

Storage Allocation

+ +

In order to allocate storage space safely and efficiently user can use these predefined methods:

+ +
/// Allocates storage space with the specific `length` and returns the
+/// offset of allocated space in the storage file.
+pub fn allocate(&self, length: u32) -> Result<Offset, Error>;
+
+/// Deallocates the storage space at the specific `offset` and `length`
+pub fn deallocate(&self, offset: Offset, length: u32) -> Result<(), Error>;
+
+ +

Storage Stack

+ +

There is a fixed stack with 32 elements at the beginning of the storage . The first item in this +stack is reserved and used for managing deallocated storage spaces. Users can use other stack items +to keep the offset of the allocated spaces for the smart contract variables.

+ +

Storage stack

+ +

Data Collections

+ +

Usually in smart contracts developers are interested in data collections like Search Trees or Hash +Tables to look up values by the associated keys. Most programming languages come up with some +builtin collections, however we can’t use them in smart contracts because they use RAM that is +inconsistent. However we can have storage equivalent of these data collections that instead of +dealing with memory they are dealing with the storage file. You can naively consider storage as +dedicated consistent memory for the smart contract.

+ +

Right now these data collection is available to use inside the smart contract: StorageVector, +StorageString, StorageLinkedList, StorageBST and StorageHasTable.

+ + + +

Merklizing Storage

+ +

To make sure all the nodes have the same state we need to calculate the hash of all storage files. +Merkle tree can help us to easily calculate the root hash very fast. We need two Merkle trees, one +for calculating the root hash of each storage file and the second for calculating the root hash of +all storage files.

+ +

Single storage file Merkle tree

+ +

We can divide each file into small chunks of data and calculate the hash of each chunk once. Since +we know exactly which chunk has changed after executing the smart, contract we can easily +reconstruct the tree and calculate the merkle root again.

+ +

Whole storage Merkle tree

+ +

Each file has a unique index. With using that index we can make sure that the position of the leaf +nodes in the Merkle tree is always the same. The same technique we used for calculating the +state hash.

+ +

Storage Merkle tree

+ +

Example

+ +

As an example we have implemented the ERC20 smart contract based on this idea. The implementation +can be found here

+ +

Testing

+ +

One of the consequences of Storage as File is that testing smart contracts becomes easier. What we +need is only to mock the storage file.

+ +
+
+
+ + + + + diff --git a/zh/learn/transaction/bond/index.html b/zh/learn/transaction/bond/index.html new file mode 100644 index 000000000..5b2141d8d --- /dev/null +++ b/zh/learn/transaction/bond/index.html @@ -0,0 +1,634 @@ + + + + + + + + + + + + + Bond Transaction | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Bond Transaction

+ +

Bond transaction is used to bond stake to a validator. +If the validator does not exist, it will be created. +Once a bond transaction committed, the validator cannot participate in the +sortition algorithm for 1 hour. +This is called the “bond interval” and is defined in the +consensus parameter.

+ +

Payload Structure

+ +

The bond transaction has a payload consists the following fields:

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
SizeField
21 bytesSender address
21 bytesReceiver address
96 bytes (optional)Public key
8 bytesAmount
+ +
    +
  • Sender address is the address of the sender account.
  • +
  • Receiver address is the address of the receiver validator.
  • +
  • Public key is the validator’s public key. If the validator does not exist yet, +the public key should be set, otherwise it should left empty.
  • +
  • Amount is the amount of coins that should be staked or bonded.
  • +
+ +
+
+
+ + + + + diff --git a/zh/learn/transaction/fee/index.html b/zh/learn/transaction/fee/index.html new file mode 100644 index 000000000..23eabf6bb --- /dev/null +++ b/zh/learn/transaction/fee/index.html @@ -0,0 +1,636 @@ + + + + + + + + + + + + + Transaction Fee | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Transaction Fee

+ +

Transaction fees in the Pactus blockchain are calculated using a percentage-based fee model. +The fee is a percentage of the transferred amount, within a minimum and maximum range. +The percentage, minimum fee, and maximum fee parameters are part of the blockchain +consensus parameters.

+ +

The formula to calculate the transaction fee is as follows:

+ + + +\[\begin{align*} +fee = amount \times percentage \\ +\\ +fee = +\begin{cases} + & fee_{min} & \textbf{ if } \ fee < fee_{min} \\ + & \\ + & fee_{max} & \textbf{ if } \ fee > fee_{max} \\ + & \\ + & fee & \textbf{otherwise} + \end{cases} +\end{align*}\] + +

Examples

+ +

Currently, the fee fraction or percentage is set to 0.01%, the minimum fee is set to 0.000,001 coin, +and the maximum fee is set to 0.001 coin.

+ +
    +
  • If Alice wants to transfer 2 coins to Bob, she needs to pay 0.000,2 coins as transaction fee.
  • +
  • If Alice wants to transfer 0.000,2 coins to Bob, she needs to pay 0.000,001 coins as transaction fee.
  • +
  • If Alice wants to transfer 20 coins to Bob, she needs to pay 0.001 coins as transaction fee.
  • +
+ +
+
+
+ + + + + diff --git a/zh/learn/transaction/format/index.html b/zh/learn/transaction/format/index.html new file mode 100644 index 000000000..c37e5a4fd --- /dev/null +++ b/zh/learn/transaction/format/index.html @@ -0,0 +1,673 @@ + + + + + + + + + + + + + Transaction Format | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Transaction Format

+ +

Transactions in Pactus consists the following fields:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SizeField
1 byteVersion
4 bytesLock Time
8 bytesFee
VariantMemo
1 bytePayload Type
VariantPayload Data
48 bytesSignature
96 bytesPublic Key
+ +
    +
  • Version is the version of the transaction format. Different versions may have different fields or +a different layout, and the current transaction version is set to 1.
  • +
  • Lock Time specifies the block number at which the transaction can be unlocked.
  • +
  • Fee contains the fee paid by the sender to the network for processing the transaction. +The fee is calculated based on the percentage fee model.
  • +
  • Memo is an optional message that can be included in the transaction. +The message can be used to provide additional information about the transaction or to communicate with the recipient. +The maximum size of the memo is 64 characters that is defined in the +consensus parameters
  • +
  • Payload Type specifies the type of the transaction payload. +Depending on the payload type, the payload data field is decoded differently.
  • +
  • Payload Data contains the actual data payload of the transaction. +The payload data varies depending on the payload type.
  • +
  • Signature contains a cryptographic signature created by the sender using their private key. +The signature is used to ensure that the transaction has not been tampered with and that it was indeed created by the sender.
  • +
  • Public Key contains the public key of the sender. +The public key is used to verify that the sender has the authority to create the transaction. +The sender’s address should be derived from this public key.
  • +
+ +

Payload Type

+ +

The payload type field determines the format of the payload data field in the transaction. +Different payload types have different formats for the payload data. +The following are the supported transactions in Pactus blockchain:

+ +
    +
  1. Transfer transaction
  2. +
  3. Bond transaction
  4. +
  5. Sortition transaction
  6. +
  7. Unbond transaction
  8. +
  9. Withdraw transaction
  10. +
+ +

Transaction ID

+ +

The Transaction ID is a unique identifier for a transaction on the blockchain. +It is generated by taking the hash of the transaction data without including the public key and signature fields.

+ +
+
+
+ + + + + diff --git a/zh/learn/transaction/sortition/index.html b/zh/learn/transaction/sortition/index.html new file mode 100644 index 000000000..06b192f85 --- /dev/null +++ b/zh/learn/transaction/sortition/index.html @@ -0,0 +1,624 @@ + + + + + + + + + + + + + Sortition Transaction | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Sortition Transaction

+ +

Sortition transaction is used to enter a validator +in the committee. +By committing a sortition transaction, the validator will enter the committee. +Sortition transactions are valid for 7 blocks, which is defined as “sortition interval” in the +consensus parameters.

+ +

Payload Structure

+ +

The sortition transaction has a payload consists the following fields:

+ + + + + + + + + + + + + + + + + + +
SizeField
21 bytesAddress
48 bytesSortition Proof
+ +
    +
  • Address is the address of the validator that evaluated the sortition
  • +
  • Sortition Proof is the proof of evaluating the sortition
  • +
+ +

Validators do not need to pay a fee for sortition transactions, and the fee should be set to zero.

+ +
+
+
+ + + + + diff --git a/zh/learn/transaction/transfer/index.html b/zh/learn/transaction/transfer/index.html new file mode 100644 index 000000000..5f6b61914 --- /dev/null +++ b/zh/learn/transaction/transfer/index.html @@ -0,0 +1,638 @@ + + + + + + + + + + + + + Transfer Transaction | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Transfer Transaction

+ +

Transfer transaction is used to transfer coins between the accounts. +If the receiver account does not exist, it will be created.

+ +

Payload Structure

+ +

The transfer transaction has a payload consists the following fields:

+ + + + + + + + + + + + + + + + + + + + + + +
SizeField
21 bytesSender address
21 bytesReceiver address
8 bytesAmount
+ +
    +
  • Sender address is the account address that transfers the amount
  • +
  • Receiver address is the account address that receives the amount
  • +
  • Amount is the amount of coins that should be transferred
  • +
+ +

Reward Transaction

+ +

The reward transaction is the first transaction in each block. There is only one reward transaction +per block, and it has the same format as a transfer transaction, but with zero fees and no signature.

+ +

The sender address is the Treasury address, +and the receiver address is defined by the block proposer. +The amount of the reward transaction should be equal to the +block reward plus transaction fees. +This amount will go to the proposer account as a block reward. +Therefore, in each block, one coin from the +Treasury account transfers to +the proposer account as a block reward.

+ +
+
+
+ + + + + diff --git a/zh/learn/transaction/unbond/index.html b/zh/learn/transaction/unbond/index.html new file mode 100644 index 000000000..6c7fd9339 --- /dev/null +++ b/zh/learn/transaction/unbond/index.html @@ -0,0 +1,615 @@ + + + + + + + + + + + + + Unbond Transaction | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Unond Transaction

+ +

Unbond transaction is used to unbond a validator. +An unbonded validator cannot participate in the sortition algorithm anymore, and after 21 days, the stake can be withdrawn. +This is called the “unbond interval” and is defined in the consensus parameter.

+ +

Payload Structure

+ +

The unbond transaction has a payload consists the following field:

+ + + + + + + + + + + + + + +
SizeField
21 bytesValidator address
+ +
    +
  • Validator address is the address of validator that is unbonded.
  • +
+ +
+
+
+ + + + + diff --git a/zh/learn/transaction/withdraw/index.html b/zh/learn/transaction/withdraw/index.html new file mode 100644 index 000000000..89ff08288 --- /dev/null +++ b/zh/learn/transaction/withdraw/index.html @@ -0,0 +1,624 @@ + + + + + + + + + + + + + Withdraw Transaction | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Withdraw Transaction

+ +

Withdraw transaction is used to withdraw the staked coins from an unbonded +validator

+ +

Payload Structure

+ +

The withdraw transaction has a payload consists the following fields:

+ + + + + + + + + + + + + + + + + + + + + + +
SizeField
21 bytesSender address
21 bytesReceiver address
8 bytesAmount
+ +
    +
  • Sender address is the address of the sender validator.
  • +
  • Receiver address is the address of the receiver account.
  • +
  • Amount is the amount of coins that should be withdrawn
  • +
+ +
+
+
+ + + + + diff --git a/zh/mstile-150x150.png b/zh/mstile-150x150.png new file mode 100644 index 000000000..187b08cc8 Binary files /dev/null and b/zh/mstile-150x150.png differ diff --git a/zh/robots.txt b/zh/robots.txt new file mode 100644 index 000000000..0097513b3 --- /dev/null +++ b/zh/robots.txt @@ -0,0 +1 @@ +Sitemap: https://pactus.org/sitemap.xml diff --git a/zh/safari-pinned-tab.svg b/zh/safari-pinned-tab.svg new file mode 100644 index 000000000..43c436d31 --- /dev/null +++ b/zh/safari-pinned-tab.svg @@ -0,0 +1,27 @@ + + + + +Created by potrace 1.14, written by Peter Selinger 2001-2017 + + + + + diff --git a/zh/site.webmanifest b/zh/site.webmanifest new file mode 100644 index 000000000..c00b17332 --- /dev/null +++ b/zh/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-256x256.png", + "sizes": "256x256", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/zh/sitemap.xml b/zh/sitemap.xml new file mode 100644 index 000000000..c8089a7bd --- /dev/null +++ b/zh/sitemap.xml @@ -0,0 +1,217 @@ + + + +https://pactus.org/2022/08/29/dev-meeting.html +2022-08-29T00:00:00+00:00 + + +https://pactus.org/2022/09/04/dev-meeting.html +2022-09-04T00:00:00+00:00 + + +https://pactus.org/2022/09/18/dev-meeting.html +2022-09-18T00:00:00+00:00 + + +https://pactus.org/2022/09/20/release-0-9-0.html +2022-09-20T00:00:00+00:00 + + +https://pactus.org/2022/09/24/testnet-0-launched.html +2022-09-24T00:00:00+00:00 + + +https://pactus.org/2022/10/30/dev-meeting.html +2022-10-30T00:00:00+00:00 + + +https://pactus.org/2022/11/24/release-0-9-1.html +2022-11-24T00:00:00+00:00 + + +https://pactus.org/2023/03/01/what-is-testnet.html +2023-03-01T00:00:00+00:00 + + +https://pactus.org/2023/04/21/testnet-0-concluded.html +2023-04-21T00:00:00+00:00 + + +https://pactus.org/2023/05/08/release-0-10-0.html +2023-05-08T00:00:00+00:00 + + +https://pactus.org/2023/05/09/testnet-1-launched.html +2023-05-09T00:00:00+00:00 + + +https://pactus.org/2023/05/29/release-0-11-0.html +2023-05-29T00:00:00+00:00 + + +https://pactus.org/2023/06/19/release-0-12-0.html +2023-06-19T00:00:00+00:00 + + +https://pactus.org/2023/07/01/release-0-13-0.html +2023-07-01T00:00:00+00:00 + + +https://pactus.org/2023/07/05/testnet-500-validators.html +2023-07-05T00:00:00+00:00 + + +https://pactus.org/2023/07/09/dev-meeting.html +2023-07-09T00:00:00+00:00 + + +https://pactus.org/2023/08/01/testnet-1-concluded.html +2023-08-01T00:00:00+00:00 + + +https://pactus.org/2023/08/22/dev-report.html +2023-08-22T00:00:00+00:00 + + +https://pactus.org/2023/09/04/introduction-to-pips.html +2023-09-04T00:00:00+00:00 + + +https://pactus.org/2023/09/24/dev-report-pre-testnet-2.html +2023-09-24T00:00:00+00:00 + + +https://pactus.org/2023/09/28/how-sspos-works-in-simple-word.html +2023-09-28T00:00:00+00:00 + + +https://pactus.org/2023/10/15/release-0-15-0.html +2023-10-15T00:00:00+00:00 + + +https://pactus.org/2023/10/15/testnet-2-launched.html +2023-10-15T00:00:00+00:00 + + +https://pactus.org/2023/10/21/release-0-15-1.html +2023-10-21T00:00:00+00:00 + + +https://pactus.org/2023/10/21/release-0-15-2.html +2023-10-21T00:00:00+00:00 + + +https://pactus.org/blog/ + + +https://pactus.org/ + + +https://pactus.org/contributing/ + + +https://pactus.org/community/ + + +https://pactus.org/download/ + + +https://pactus.org/learn/blockchain/cryptography/ + + +https://pactus.org/learn/blockchain/state-hash/ + + +https://pactus.org/learn/blockchain/incentive/ + + +https://pactus.org/learn/blockchain/serialization/ + + +https://pactus.org/learn/blockchain/account/ + + +https://pactus.org/learn/blockchain/block/ + + +https://pactus.org/learn/blockchain/address/ + + +https://pactus.org/learn/blockchain/genesis/ + + +https://pactus.org/learn/blockchain/validator/ + + +https://pactus.org/learn/consensus/protocol/ + + +https://pactus.org/learn/consensus/parameters/ + + +https://pactus.org/learn/consensus/committee/ + + +https://pactus.org/learn/consensus/sortition/ + + +https://pactus.org/learn/consensus/specification/ + + +https://pactus.org/learn/consensus/proof-of-stake/ + + +https://pactus.org/learn/transaction/withdraw/ + + +https://pactus.org/learn/transaction/fee/ + + +https://pactus.org/learn/transaction/transfer/ + + +https://pactus.org/learn/transaction/format/ + + +https://pactus.org/learn/transaction/sortition/ + + +https://pactus.org/learn/transaction/bond/ + + +https://pactus.org/learn/transaction/unbond/ + + +https://pactus.org/learn/smart-contract/storage/ + + +https://pactus.org/learn/ + + +https://pactus.org/user-guides/use-wallet-cli/ + + +https://pactus.org/user-guides/run-pactus-cli/ + + +https://pactus.org/user-guides/run-pactus-docker/ + + +https://pactus.org/user-guides/run-pactus-gui/ + + +https://pactus.org/user-guides/send-transactions-gui/ + + +https://pactus.org/user-guides/ + + +https://pactus.org/about/roadmap/ + + +https://pactus.org/about/faq/ + + +https://pactus.org/about/what-is-pactus/ + + diff --git a/zh/user-guides/index.html b/zh/user-guides/index.html new file mode 100644 index 000000000..cc7744657 --- /dev/null +++ b/zh/user-guides/index.html @@ -0,0 +1,356 @@ + + + + + + + + + + + + + 用户指南 | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+

用户指南

+ +

在这里,您可以找到一些指南,帮助您使用和与帕克图斯区块链进行交互。

+ +

初学者

+ + + +

高级

+ + + +
+
+
+
+ + + + + diff --git a/zh/user-guides/run-pactus-cli/index.html b/zh/user-guides/run-pactus-cli/index.html new file mode 100644 index 000000000..86d706798 --- /dev/null +++ b/zh/user-guides/run-pactus-cli/index.html @@ -0,0 +1,509 @@ + + + + + + + + + + + + + 如何以命令行模式运行帕克图斯? | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

如何以命令行模式运行帕克图斯?

+ +

Preface

+ +

Pactus can be run in different modes, including the command-line interface (CLI) and the graphical user interface (GUI). +This tutorial will guide you through the steps to run Pactus in CLI mode, suitable for advanced users.

+ +

Prerequisites

+ +

Before proceeding with the steps below, ensure that you have the following:

+ +
    +
  • A computer running Windows, macOS, or Linux
  • +
  • Suitable internet connection
  • +
+ +

Download

+ +

To get started, download and extract the Pactus CLI file from +here.

+ +

Initializing the node

+ +

Now you need to create a wallet and setup a working directory for your node. +A working directory is a place where you save blockchain data and wallets. +Open the Terminal and run the following command:

+ + +
+ +
+ +
./pactus-daemon init -w ~/pactus --testnet
+
+ +

This command creates your wallet and setup the working working directory at ~/pactus.

+ + +
+ +
+ +
./pactus-daemon init -w ~/pactus --testnet
+
+ +

This command creates your wallet and setup the working working directory at ~/pactus.

+ + +
+ +
+ +
pactus-daemon.exe init -w c:\pactus --testnet
+
+ +

This command creates your wallet and setup the working working directory at c:\pactus.

+ + +
+ +
+ +

Make sure you write down your 12-word mnemonic on a piece of paper to recover your wallet in the future +in case your computer is lost, damaged, or stolen.

+ +

The working directory contains:

+ +
    +
  • Default wallet
  • +
  • Genesis file
  • +
  • Config file
  • +
+ +

Feel free to take a look at these files.

+ +

Running the node

+ +

Now you can start the node and sync with the network. Run the following command in the Terminal:

+ + +
+ +
+ +
./pactus-daemon start -w ~/pactus
+
+ + +
+ +
+ +
./pactus-daemon start -w ~/pactus
+
+ + +
+ +
+ +
pactus-daemon.exe start -w c:\pactus
+
+ + +
+ +
+ +

When the Pactus node starts running, it begins syncing with the network. +This process may take some time, as your node needs to download and verify the entire blockchain history. +Please be patient while your node syncs.

+ +

To become a validator and participate in the +consensus algorithm to earn rewards, you first need to +stake some coins. In the next +tutorial, +we will explain how to send a Bond transaction to become a validator.

+ +
+ +

By running a Pactus node, you contribute to the decentralization and security of the Pactus blockchain network. +Thank you for your participation!

+ + + + + +
+
+
+
+ + + + + diff --git a/zh/user-guides/run-pactus-docker/index.html b/zh/user-guides/run-pactus-docker/index.html new file mode 100644 index 000000000..abdd03fd3 --- /dev/null +++ b/zh/user-guides/run-pactus-docker/index.html @@ -0,0 +1,524 @@ + + + + + + + + + + + + + 如何使用Docker运行帕克图斯? | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

如何使用Docker运行帕克图斯?

+ + +

Preface

+ +

Docker is a tool that simplifies the process of creating, deploying, and running applications using containers. +With containers, developers can bundle all the necessary parts of an application, including libraries and dependencies, +and deploy them as a single package.

+ +

In this document, we will guide you on how to run Pactus using Docker, step by step.

+ +

Prerequisites

+ +

The only thing you need is installing docker in your machine. +If you are using Windows please make sure you have installed WSL.

+ +

Docker Images

+ +

The Pactus docker images are available at Docker Hub. +You can pull the latest image with this command:

+ +
docker pull pactus/pactus
+
+ +

Initializing the node

+ +

Now you need to create a wallet and setup a working directory for your node. +A working directory is a place where you save blockchain data and wallets. +Open the Terminal and run the following command:

+ + +
+ +
+ +
docker run -it --rm -v ~/pactus/testnet:/pactus pactus/pactus init -w /pactus --testnet
+
+ +

This command creates your wallet and setup the working working directory at ~/pactus/testnet.

+ + +
+ +
+ +
docker run -it --rm -v ~/pactus/testnet:/pactus pactus/pactus init -w /pactus --testnet
+
+ +

This command creates your wallet and setup the working working directory at ~/pactus/testnet.

+ + +
+ +
+ +
docker run -it --rm -v c:\pactus\testnet:/pactus pactus/pactus init -w /pactus --testnet
+
+ +

This command creates your wallet and setup the working working directory at c:\pactus\testnet.

+ + +
+ +
+ +

Make sure you write down your 12-word mnemonic on a piece of paper to recover your wallet in the future +in case your computer is lost, damaged, or stolen.

+ +

The working directory contains:

+ +
    +
  • Default wallet
  • +
  • Genesis file
  • +
  • Config file
  • +
+ +

Feel free to take a look at these files.

+ +

Running the node

+ +

Now you can start the node and sync with the network. Run the following command in the Terminal:

+ + +
+ +
+ +
docker run -it -v ~/pactus/testnet:/pactus -p 8080:8080 -p 21777:21777 --name pactus-testnet pactus/pactus start -w /pactus
+
+ + +
+ +
+ +
docker run -it -v ~/pactus/testnet:/pactus -p 8080:8080 -p 21777:21777 --name pactus-testnet pactus/pactus start -w /pactus
+
+ + +
+ +
+ +
docker run -it -v c:\pactus\testnet:/pactus -p 8080:8080 -p 21777:21777 --name pactus-testnet pactus/pactus start -w /pactus
+
+ + +
+ +
+ +

To run pactus-testnet in background just add a -d flag in the command.

+ +

Hint: Remember to pass in your wallet passphrase as well with -p flag after /pactus.

+ +
docker run -it -v ~/pactus/testnet:/pactus -p 8080:8080 -p 21777:21777 -d --name pactus-testnet pactus/pactus start -w /pactus -p {YOUR_PASSPHRASE}
+
+ +
docker run -it -v c:\pactus\testnet:/pactus -p 8080:8080 -p 21777:21777 -d --name pactus-testnet pactus/pactus start -w /pactus -p {YOUR_PASSPHRASE}
+
+ +

You can stop/start docker:

+ +
docker stop pactus-testnet
+docker start pactus-testnet
+
+ +

Or check the logs:

+ +
docker logs pactus-testnet --tail 1000 -f
+
+ +
+ +

By running a Pactus node, you contribute to the decentralization and security of the Pactus blockchain network. +Thank you for your participation!

+ + + + + +
+
+
+
+ + + + + diff --git a/zh/user-guides/run-pactus-gui/code_certificate_warning.png b/zh/user-guides/run-pactus-gui/code_certificate_warning.png new file mode 100644 index 000000000..029a877ff Binary files /dev/null and b/zh/user-guides/run-pactus-gui/code_certificate_warning.png differ diff --git a/zh/user-guides/run-pactus-gui/default_wallet.png b/zh/user-guides/run-pactus-gui/default_wallet.png new file mode 100644 index 000000000..c2209565b Binary files /dev/null and b/zh/user-guides/run-pactus-gui/default_wallet.png differ diff --git a/zh/user-guides/run-pactus-gui/index.html b/zh/user-guides/run-pactus-gui/index.html new file mode 100644 index 000000000..4c58f5192 --- /dev/null +++ b/zh/user-guides/run-pactus-gui/index.html @@ -0,0 +1,489 @@ + + + + + + + + + + + + + 如何以图形模式运行帕克图斯? | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

如何以图形模式运行帕克图斯?

+ +

Preface

+ +

Pactus can be run in different modes, including the command-line interface (CLI) and the graphical user interface (GUI). +This tutorial will guide you through the steps to run Pactus in GUI mode, suitable for beginner to advanced users.

+ +

Prerequisites

+ +

Before proceeding with the steps below, ensure that you have the following:

+ +
    +
  • A computer running Windows, macOS, or Linux
  • +
  • Suitable internet connection
  • +
+ +

Download

+ +

Download the Pactus GUI installer or archived file from +here.

+ +

Code certificate issue

+ +

Windows and macOS users may encounter a warning message stating that Pactus is an untrusted application. +This is because Pactus does not have a +code signing certificate.

+ +

Code certificate issue

+ +

A code certificate is a digital signature that verifies the identity and authenticity of the software publisher. +However, obtaining a code certificate is complex and expensive process, and requires registering a company and +passing Know Your Customer (KYC) checks.

+ +

As Pactus is an open-source and community-based application, we don’t have a code certificate yet. +Therefore, you can safely ignore the warning message and proceed with installing Pactus.

+ +

Installing

+ +

To install Pactus GUI, simply follow the on-screen instructions provided by the installer. +The process is straightforward and similar to installing any other application on your computer.

+ +

Installing Pactus

+ +

Initializing

+ +

When you run Pactus for the first time, a wizard dialog will appear to guide you through the wallet creation and +initialization process. This process consists of several steps:

+ +

Initialize mode

+ +

On the first page, you will ask you how you want to create your wallet. +Select the option to “Create a new wallet from scratch” and proceed to the next page.

+ +

Initialize mode

+ +

Wallet seed

+ +

The next page will display your wallet seed phrase, which consists of 12 words. +It is essential to securely back up this seed phrase, as it is required for wallet recovery +in case your computer is lost, damaged, or stolen.

+ +

Wallet seed

+ +

Warning: Keep your wallet seed phrase private and secure. +If someone else gains access to your seed phrase, they can control your wallet and funds.

+ +

Seed confirmation

+ +

In this step, you will be asked to confirm your seed phrase. +Input the 12 words you received in the previous step into the dialog. +If the seed phrase is entered correctly, you will be able to proceed to the next page.

+ +

Seed confirmation

+ +

Wallet password

+ +

On this page, you will be asked to set a password for your wallet. +Enter a strong password in the first dialog box and confirm it in the second one. +This password will be used to encrypt your wallet and protect it from unauthorized access.

+ +

Set wallet password

+ +

Note: Choose a strong password and keep it safe. +If you forget or lose your password, you will need your seed phrase to regain access to your wallet.

+ +

Number of validators

+ +

Each node in the Pactus blockchain can run up to 32 validators, and each validator can stake up to +1000 coins. Here, you can define how many validators you want to create for your node. +Select the number of validators based on the amount of coins you want to stake.

+ +

Number of validators

+ +

If you want to stake more than 32,000 coins, you need to set up a new node.

+ +

Node information

+ +

The last page of the initialization process shows the node information, such as the working directory, validator address, +and reward address. Review this information and click “Close” to complete the initialization process.

+ +

Node information

+ +

Upon closing the wizard dialog, your Pactus node will start running. You are now ready to use Pactus in GUI mode.

+ +

Running the Pactus Node

+ +

After completing the initialization process, you are ready to run the Pactus node. +Running a Pactus node allows you to synchronize with the network, enabling you to view and manage your wallet and +sending transactions.

+ +

Syncing with the Network

+ +

When the Pactus node starts running, it begins syncing with the network. This process may take some time, +as your node needs to download and verify the entire blockchain history. +Please be patient while your node syncs.

+ +

Syncing progress

+ +

Default Wallet

+ +

You can check the “Default Wallet” tab to access your wallet information. Please note that the displayed +information may not be accurate until the syncing process is complete.

+ +

Default Wallet tab

+ +

In the “Default Wallet” tab, you can view your account details, including your balance and +address information such as the validator and reward addresses. +Your computer acts as a node and is recognized by the validator address in the Pactus network. +The reward address is the account address where you collect the +rewards earned by participating in +the consensus algorithm and proposing new blocks.

+ +

To become a validator and participate in the +consensus algorithm to earn rewards, you first need to +stake some coins. In the next +tutorial, +we will explain how to send a Bond transaction to become a validator.

+ +
+ +

By running a Pactus node, you contribute to the decentralization and security of the Pactus blockchain network. +Thank you for your participation!

+ + + + + +
+
+
+
+ + + + + diff --git a/zh/user-guides/run-pactus-gui/initialize_mode.png b/zh/user-guides/run-pactus-gui/initialize_mode.png new file mode 100644 index 000000000..757a9518c Binary files /dev/null and b/zh/user-guides/run-pactus-gui/initialize_mode.png differ diff --git a/zh/user-guides/run-pactus-gui/installing.png b/zh/user-guides/run-pactus-gui/installing.png new file mode 100644 index 000000000..9025ff728 Binary files /dev/null and b/zh/user-guides/run-pactus-gui/installing.png differ diff --git a/zh/user-guides/run-pactus-gui/node_information.png b/zh/user-guides/run-pactus-gui/node_information.png new file mode 100644 index 000000000..6c9ed7e28 Binary files /dev/null and b/zh/user-guides/run-pactus-gui/node_information.png differ diff --git a/zh/user-guides/run-pactus-gui/number_of_validators.png b/zh/user-guides/run-pactus-gui/number_of_validators.png new file mode 100644 index 000000000..4b97ca1b4 Binary files /dev/null and b/zh/user-guides/run-pactus-gui/number_of_validators.png differ diff --git a/zh/user-guides/run-pactus-gui/seed_confirmation.png b/zh/user-guides/run-pactus-gui/seed_confirmation.png new file mode 100644 index 000000000..f6a644547 Binary files /dev/null and b/zh/user-guides/run-pactus-gui/seed_confirmation.png differ diff --git a/zh/user-guides/run-pactus-gui/syncing_progress.png b/zh/user-guides/run-pactus-gui/syncing_progress.png new file mode 100644 index 000000000..1ec329253 Binary files /dev/null and b/zh/user-guides/run-pactus-gui/syncing_progress.png differ diff --git a/zh/user-guides/run-pactus-gui/wallet_password.png b/zh/user-guides/run-pactus-gui/wallet_password.png new file mode 100644 index 000000000..c17c3b30c Binary files /dev/null and b/zh/user-guides/run-pactus-gui/wallet_password.png differ diff --git a/zh/user-guides/run-pactus-gui/wallet_seed.png b/zh/user-guides/run-pactus-gui/wallet_seed.png new file mode 100644 index 000000000..9f000acd8 Binary files /dev/null and b/zh/user-guides/run-pactus-gui/wallet_seed.png differ diff --git a/zh/user-guides/send-transactions-gui/bond-transaction-dialog.png b/zh/user-guides/send-transactions-gui/bond-transaction-dialog.png new file mode 100644 index 000000000..4c06bcea4 Binary files /dev/null and b/zh/user-guides/send-transactions-gui/bond-transaction-dialog.png differ diff --git a/zh/user-guides/send-transactions-gui/index.html b/zh/user-guides/send-transactions-gui/index.html new file mode 100644 index 000000000..7ff84f28a --- /dev/null +++ b/zh/user-guides/send-transactions-gui/index.html @@ -0,0 +1,394 @@ + + + + + + + + + + + + + 如何在图形模式下发送交易? | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

如何在图形模式下发送交易?

+ +

Preface

+ +

The Pactus Blockchain offers a Graphical User Interface (GUI) that comes with a built-in wallet to create, +sign and broadcast transactions. +This tutorial aims to guide you step-by-step on how to use the GUI application to send transactions to the Pactus blockchain. +Whether you are a beginner or an advanced user, this tutorial is suitable for you.

+ +

Prerequisites

+ +

Before we begin, you’ll need to run the Pactus GUI application and ensure that it is synced with the network. +You can find detailed instructions on how to do this in the following tutorial.

+ +

Sending a Transfer Transaction

+ +

To send a transfer transaction, click on the “Transaction” menu and +select “Transfer.” +This will bring up a new window where you can select the +account address from which you wish to send the transfer, +as well as the recipient’s account address and the amount you wish to send.

+ +

After reviewing the transaction details and ensuring that they are correct, +click on the “Send” button to sign and broadcast the transaction to the Pactus blockchain.

+ +

Transfer Transaction Dialog

+ +

It’s important to note that the transaction fee +will be calculated based on the amount you’re sending.

+ +

Sending a Bond Transaction

+ +

To send a bond transaction, navigate to the “Transaction” menu +and select “Bond.” +A new window will appear where you can select the account address from which you wish to send the bond transaction, +as well as the validator address of the recipient and +the amount you wish to stake.

+ +

If the validator address is not already registered on the Pactus blockchain, you will need to provide the +validator’s public key as the first staking transaction will create the validator on the Pactus blockchain. +To obtain the public key, you can right-click on the validator’s address in your wallet +and select “Details.”

+ +

Bond Transaction Dialog

+ +

It’s important to note that the transaction fee +will be calculated based on the amount you’re sending.

+ + + + + +
+
+
+
+ + + + + diff --git a/zh/user-guides/send-transactions-gui/transfer-transaction-dialog.png b/zh/user-guides/send-transactions-gui/transfer-transaction-dialog.png new file mode 100644 index 000000000..3dddf68a3 Binary files /dev/null and b/zh/user-guides/send-transactions-gui/transfer-transaction-dialog.png differ diff --git a/zh/user-guides/use-wallet-cli/index.html b/zh/user-guides/use-wallet-cli/index.html new file mode 100644 index 000000000..177f12d34 --- /dev/null +++ b/zh/user-guides/use-wallet-cli/index.html @@ -0,0 +1,1109 @@ + + + + + + + + + + + + + 如何在命令行模式下使用钱包? | 帕克图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

如何在命令行模式下使用钱包?

+ +

Preface

+ +

The Pactus Blockchain provides a wallet application that allows users to interact with the Pactus blockchain +without the need to run a node. +This is ideal for users who do not wish to operate a node but still want to create a personal wallet to manage their funds. +This tutorial will guide you step-by-step on how to use the wallet application.

+ +

Download

+ +

To get started, download and extract the Pactus CLI file from +here.

+ +
+ +

Wallet commands

+ +

In this section, we will explore various wallet commands that help you create, manage, +and recover your Pactus wallet.

+ +

Create a wallet

+ +

First, you need to create a wallet. To create a new wallet, run the following command:

+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 create
+
+ +

This command creates a new wallet and store it in the ~/pactus/wallets/wallet_1.

+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 create
+
+ +

This command creates a new wallet and store it in the ~/pactus/wallets/wallet_1.

+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\wallet_1 create --testnet
+
+ +

This command creates a new wallet and save it in the c:\pactus\wallets\wallet_1 directory. +This command creates a new wallet and store it in the c:\pactus\wallets\wallet_1.

+ + +
+ +
+ +

Don’t forget to back up your wallet seed, as it allows you to recover your wallet if you lose it.

+ +

Wallet password

+ +

You can change the wallet password by tunning this command:

+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 password
+
+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 password
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\wallet_1 password
+
+ + +
+ +
+ +

If you forget your password, you can still recover your wallet using the wallet seed.

+ +

Wallet seed

+ +

You can obtain the wallet seed by running this command:

+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 seed
+
+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 seed
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\wallet_1 seed
+
+ + +
+ +
+ +

The wallet seed is encrypted within your wallet, and +you’ll need to enter the wallet password to access it.

+ +

Recovering Wallet

+ +

If you lose your wallet, you can recover it by running this command:

+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/recovered_wallet recover
+
+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/recovered_wallet recover
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\recovered_wallet recover
+
+ + +
+ +
+ +

Please note that if you lose your seed, there is no way to recover your wallet.

+ +
+ +

Address commands

+ +

In this section, we’ll cover address commands that help you manage your wallet addresses.

+ +

Creating new address

+ +

You can create a new address by running this command:

+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 address new
+
+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 address new
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\wallet_1 address new
+
+ + +
+ +
+ +

You can also assign a label to your address to better organize your address book.

+ +

List of addresses

+ +

To view the list of wallet addresses, use this command:

+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 address all
+
+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 address all
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\wallet_1 address all
+
+ + +
+ +
+ +

Get Public key

+ +

To obtain the public key for a specific address, run this command:

+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 address pub <ADDRESS>
+
+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 address pub <ADDRESS>
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\wallet_1 address pub <ADDRESS>
+
+ + +
+ +
+ +

Replace <ADDRESS> with the address for which you want to retrieve its public key.

+ +

Get Private key

+ +

You can get the public key of your address by this command:

+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 address pub <ADDRESS>
+
+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 address pub <ADDRESS>
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\wallet_1 address pub <ADDRESS>
+
+ + +
+ +
+ +

Replace <ADDRESS> with the address for which you want to retrieve its private key. +Keep your private key secure. If someone gains access to your private key, +they will have full control over that address.

+ +
+ +

Transaction commands

+ +

In this section, we’ll cover transaction commands that help you create, sign, and +broadcast transactions on the Pactus Blockchain. +You’ll need to provide the password to sign the transaction. +Please note that once a transaction is broadcasted, it cannot be reversed.

+ +

Sending Transfer transaction

+ +

To create, sign, and broadcast a +Transfer transaction, use the following command:

+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 tx transfer <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 tx transfer <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\wallet_1 tx transfer <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +

In this command, <FROM> should be one of the addresses in your wallet as the sender address, +and <TO> is the receiver address.

+ +

Sending Bond transaction

+ +

To create, sign, and broadcast a +Bond transaction, use the following command:

+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 tx bond <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 tx bond <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\wallet_1 tx bond <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +

In this command, <FROM> should be one of the addresses in your wallet as the sender address, +and <TO> is the receiver validator address.

+ +

If the validator associated with this address does not exist yet, +you need to provide the public key to create it:

+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 tx bond --pub <PUBLIC_KEY> <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 --pub <PUBLIC_KEY> <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\wallet_1 --pub <PUBLIC_KEY> <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +

Replace <PUBLIC_KEY> with the validator’s public key, +which is the public key of the <TO> address.

+ +

Sending Unbond transaction

+ +

To create, sign, and broadcast a +Unbond transaction, use the following command:

+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 tx unbond <ADDRESS>
+
+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 tx unbond <ADDRESS>
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\wallet_1 tx unbond <ADDRESS>
+
+ + +
+ +
+ +

In this command, <ADDRESS> is the address of the validator that you want to unbond.

+ +

Sending Withdraw transaction

+ +

To create, sign, and broadcast a +Withdraw transaction, use the following command:

+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 tx unbond <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 tx unbond <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\wallet_1 tx withdraw <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ + + + + +
+
+
+
+ + + + +