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..f2ec8591b --- /dev/null +++ b/2022/08/29/dev-meeting.html @@ -0,0 +1,402 @@ + + + + + + + + + + + + + Dev meeting | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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..031db87f7 --- /dev/null +++ b/2022/09/04/dev-meeting.html @@ -0,0 +1,511 @@ + + + + + + + + + + + + + Dev meeting | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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..180a834a4 --- /dev/null +++ b/2022/09/18/dev-meeting.html @@ -0,0 +1,421 @@ + + + + + + + + + + + + + Dev meeting | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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..9e86c7f65 --- /dev/null +++ b/2022/09/20/release-0-9-0.html @@ -0,0 +1,391 @@ + + + + + + + + + + + + + Pactus 0.9.0 released | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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..990d1108a --- /dev/null +++ b/2022/09/24/testnet-0-launched.html @@ -0,0 +1,387 @@ + + + + + + + + + + + + + Testnet-0 launch announcement | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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..8e45e2b9a --- /dev/null +++ b/2022/10/30/dev-meeting.html @@ -0,0 +1,414 @@ + + + + + + + + + + + + + Dev meeting | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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..81b4893f8 --- /dev/null +++ b/2022/11/24/release-0-9-1.html @@ -0,0 +1,406 @@ + + + + + + + + + + + + + Pactus 0.9.1 released | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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..76449ae89 --- /dev/null +++ b/2023/03/01/what-is-testnet.html @@ -0,0 +1,458 @@ + + + + + + + + + + + + + What is a Testnet? | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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 coins 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 coins 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..eb80333ce --- /dev/null +++ b/2023/04/21/testnet-0-concluded.html @@ -0,0 +1,420 @@ + + + + + + + + + + + + + Story of Testnet-0 | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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 Testnet-0. +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.

+ +

Special 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 PAC coins to set up their validators.

+ +

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..fbf3ecfd7 --- /dev/null +++ b/2023/05/08/release-0-10-0.html @@ -0,0 +1,434 @@ + + + + + + + + + + + + + Pactus 0.10.0 released | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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..152526b65 --- /dev/null +++ b/2023/05/09/testnet-1-launched.html @@ -0,0 +1,417 @@ + + + + + + + + + + + + + Testnet-1 launch announcement | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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..dbc2e9e7c --- /dev/null +++ b/2023/05/29/release-0-11-0.html @@ -0,0 +1,446 @@ + + + + + + + + + + + + + Pactus 0.11.0 released | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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..cebd6fb54 --- /dev/null +++ b/2023/06/19/release-0-12-0.html @@ -0,0 +1,444 @@ + + + + + + + + + + + + + Pactus 0.12.0 released | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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..4acebba97 --- /dev/null +++ b/2023/07/01/release-0-13-0.html @@ -0,0 +1,435 @@ + + + + + + + + + + + + + Pactus 0.13.0 released | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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..8c6d1ef3a --- /dev/null +++ b/2023/07/05/testnet-500-validators.html @@ -0,0 +1,409 @@ + + + + + + + + + + + + + 500 validators joined Testnet | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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..cde67997b --- /dev/null +++ b/2023/07/09/dev-meeting.html @@ -0,0 +1,415 @@ + + + + + + + + + + + + + Dev meeting | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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..3eab07c46 --- /dev/null +++ b/2023/08/01/testnet-1-concluded.html @@ -0,0 +1,444 @@ + + + + + + + + + + + + + Story of Testnet-1 | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Story of Testnet-1

+ +

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

+ +

In May 2023, we launched Testnet-1. +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

+ +

Major updates

+ +

During Testnet-1, we released three versions(Version +0.11.0, +0.12.0, +0.13.0), and the upgrade process was smooth. +Unfortunately, during Testnet-1, we encountered a consensus failure that may occur at any time in the future. +The consensus failure was resolved by requiring some validators to re-sync their nodes. +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.

+ +

Special 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 PAC coins to set up their validators.

+ +

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..515aea65d --- /dev/null +++ b/2023/08/22/dev-report.html @@ -0,0 +1,409 @@ + + + + + + + + + + + + + Dev report | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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..1ba175ddc --- /dev/null +++ b/2023/09/04/introduction-to-pips.html @@ -0,0 +1,417 @@ + + + + + + + + + + + + + Introduction to PIPs | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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..9220021ce --- /dev/null +++ b/2023/09/24/dev-report-pre-testnet-2.html @@ -0,0 +1,427 @@ + + + + + + + + + + + + + Dev Report pre-testnet2 | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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..a931f9297 --- /dev/null +++ b/2023/09/28/how-sspos-works-in-simple-word.html @@ -0,0 +1,461 @@ + + + + + + + + + + + + + How SSPoS (Solid State Proof of Stake) works in simple word | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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 51, +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..cb14aab71 --- /dev/null +++ b/2023/10/15/release-0-15-0.html @@ -0,0 +1,501 @@ + + + + + + + + + + + + + Pactus 0.15.0 released | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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..a0d50792b --- /dev/null +++ b/2023/10/15/testnet-2-launched.html @@ -0,0 +1,425 @@ + + + + + + + + + + + + + Testnet-2 launch announcement | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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/29/release-0-16-0.html b/2023/10/29/release-0-16-0.html new file mode 100644 index 000000000..56bf307c0 --- /dev/null +++ b/2023/10/29/release-0-16-0.html @@ -0,0 +1,448 @@ + + + + + + + + + + + + + Pactus 0.16.0 Released | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Pactus 0.16.0 Released

+ +

Overview

+ +

Pactus Blockchain Version 0.16.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 allows users to create new addresses for both validators and accounts. +The networking module has been improved, and users can now set limits on the number of connections. +A random crash on the agreement protocol has been fixed in this version.

+ +

New address dialog

+ +

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

+ +
    +
  • gui: display network ID (#780)
  • +
  • create new validator address (CLI and GUI) (#757)
  • +
  • add community bootstrap nodes to testnet config (#764)
  • +
  • network: implementing connection manager (#773)
  • +
  • network: adding bootstrapper mode to the network config (#760)
  • +
+ +

Fix

+ +
    +
  • network: redefine the network limits (#788)
  • +
  • consensus: not increase the vote-box power on duplicated votes (#785)
  • +
  • network: close connection when unable 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)
  • +
  • consensus: strong termination for the binary agreement (#765)
  • +
  • consensus: not increase the voting power on duplicated binary votes (#762)
  • +
+ +

Refactor

+ +
    +
  • network: refactoring peer manager (#787)
  • +
+ +

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

+ + + + +
+
+
+
+ + + + diff --git a/2023/11/12/release-0-17-0.html b/2023/11/12/release-0-17-0.html new file mode 100644 index 000000000..1b9b3509f --- /dev/null +++ b/2023/11/12/release-0-17-0.html @@ -0,0 +1,457 @@ + + + + + + + + + + + + + Pactus 0.17.0 Released | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Pactus 0.17.0 Released

+ +

Overview

+ +

Pactus Blockchain Version 0.17.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 Testnet has been upgraded and all validators must update their nodes.

+ +

This version will address major networking issues, reduce network usage, and improve overall performance.

+ +

A new node type, “Node Gossips”, has been introduced to help broadcast and spread messages across the network. +Node Gossips support the network by delivering messages to non-gossiping nodes. +This gossip option is disabled by default but can be enabled in the configuration file. +If you are running Pactus on a stable and reliable server, we recommend enabling this option for your node. +Please note that this option is still experimental and subject to potential changes in future releases.

+ +

Node gossip in config 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.

+ +

+After updating the node, the configuration file will be overwritten with a new version. +You need to make modifications to the config file if you had customized it prior to the update. +

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • network: default configs for bootstrap and relay peers (#812)
  • +
  • introducing node gossip type (#811)
  • +
  • sync: adding remote address to the peer info (#804)
  • +
  • network: adding public address to factory (#795)
  • +
  • network: filter private ips (#793)
  • +
+ +

Fix

+ +
    +
  • upgrading Testnet (#814)
  • +
  • sync: prevent opening sessions indefinitely (#813)
  • +
  • execution: fixing mistake on calculating unbonded power (#806)
  • +
  • network: check connection threshold on gater (#803)
  • +
  • network: no transient connection (#799)
  • +
  • not close connection for bootstrap nodes (#792)
  • +
+ +

Refactor

+ +
    +
  • sync: refactoring sync process (#807)
  • +
+ +

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

+ + + + +
+
+
+
+ + + + diff --git a/2023/12/12/release-0-18-0.html b/2023/12/12/release-0-18-0.html new file mode 100644 index 000000000..a78b04954 --- /dev/null +++ b/2023/12/12/release-0-18-0.html @@ -0,0 +1,458 @@ + + + + + + + + + + + + + Pactus 0.18.0 Released | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Pactus 0.18.0 Released

+ +

Overview

+ +

Pactus Blockchain Version 0.18.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 has significantly improved the syncing progress. +The syncing process concurrently requests blocks from 8 different peers and +actively connects to the most optimal peers for downloading the blockchain.

+ +

Additionally, users can now import private keys into their wallet and securely encrypt them using their wallet password.

+ +

Breaking change

+ +

For Unix-based systems, please note that the working directory for root users has changed from /pactus to /root/pactus.

+ +

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.

+ +

+After you update the node, the configuration file will automatically get updated, keeping the old settings. +If you want to return the configuration file to its default settings, +just delete the current config file and restart the node. +

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • implement pip-14 (#841)
  • +
  • sort wallet addresses (#836)
  • +
  • grpc: endpoints for creating raw transaction (#838)
  • +
  • network reachability API (#834)
  • +
  • implement pip-13 (#835)
  • +
  • subscribing to libp2p eventbus (#831)
  • +
  • implement helper methods for wallet address path (#830)
  • +
  • logger: adding rotate log file after days, compress and maxgae for logger config (#822)
  • +
  • enable bandwidth router metric (#819)
  • +
+ +

Fix

+ +
    +
  • network: refining the connection limit (#849)
  • +
  • corrected mistake when retrieving the reward address (#848)
  • +
  • config: restore default config when it is deleted (#847)
  • +
  • cmd: changing home directory for root users (#846)
  • +
  • removing BasicCheck for hash (#845)
  • +
  • disabling libp2p ping protocol (#844)
  • +
  • build docker file (#839)
  • +
  • sync: ignore publishing a block if it is received before (#829)
  • +
  • network: subscribing to the Libp2p event bus (#828)
  • +
  • sync: ignore block request if blocks are already inside the cache (#817)
  • +
+ +

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

+ + + + +
+
+
+
+ + + + diff --git a/2024/01/04/release-0-19-0.html b/2024/01/04/release-0-19-0.html new file mode 100644 index 000000000..40ad3cef6 --- /dev/null +++ b/2024/01/04/release-0-19-0.html @@ -0,0 +1,462 @@ + + + + + + + + + + + + + Pactus 0.19.0 Released | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Pactus 0.19.0 Released

+ +

Overview

+ +

Pactus Blockchain Version 0.19.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 has improved the overall performance of the blockchain by implementing +PIP-15. +PIP-15 suggests to add caching algorithms to the database for the most frequently used items.

+ +

Additionally, this version has enhanced the connectivity of the nodes in the P2P network.

+ +

Availability Score

+ +

This version comes with the implementation of PIP-19. +PIP-19 suggests assigning the “Availability Score” to each validator based on their activities in the +committee. +Validators with a score less than 0.8 won’t receive the block reward, +as their proposals will be rejected by other validators. +The main reason behind this PIP is to prevent users from downgrading +their node specifications and running Pactus on machines with low resources.

+ +

Breaking change

+ +

The Docker container now contains both daemon and wallet binary files. +Users who use Docker to run Pacts now need to add the entry point to run Pactus.

+ +

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

+ +
    +
  • gRPC: defining network and peers info response’s properly (#898)
  • +
  • implementing pip-19 (#899)
  • +
  • network: disabling GosipSub, only FloodSub (#895)
  • +
  • www: adding change proposer round and value to consensus info votes (#892)
  • +
  • network: adding relay service to dial relay nodes (#887)
  • +
  • implementing pip-15 (#843)
  • +
  • check already running by lock file (#871)
  • +
+ +

Fix

+ +
    +
  • store: use cache to check if public key exists (#902)
  • +
  • executor: not rejecting bond transaction for bootstrap validator (#901)
  • +
  • GUI: removing unnecessary tags in transaction confirm dialog (#893)
  • +
  • network: close relay connection for public node (#891)
  • +
  • network: refining GossipSubParams for Gossiper node (#882)
  • +
  • sync: adding sequence number to the bundle (#881)
  • +
  • network: turn off mesh for gossiper node (#880)
  • +
  • consensus: check voteset for CP strong termination (#879)
  • +
  • adding querier to query messages (#878)
  • +
  • execution: fixing issue #869 (#870)
  • +
  • fixing logger issue on rotating log file (#859)
  • +
+ +

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

+ + + + +
+
+
+
+ + + + diff --git a/2024/01/08/mainnet-announcement.html b/2024/01/08/mainnet-announcement.html new file mode 100644 index 000000000..090f0dd8f --- /dev/null +++ b/2024/01/08/mainnet-announcement.html @@ -0,0 +1,394 @@ + + + + + + + + + + + + + Mainnet announcement | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Mainnet announcement

+ +

The much-awaited Mainnet Launch of The Pactus Blockchain is finally here! +On January 24, 2024, at 20:24:00 UTC, the first block, known as the Genesis block, +will be minted by four Bootstrap validators. +After that, every 10 seconds, a new block will be added to the blockchain. +Each block contains the committed transactions in the network. +The block finality in the Pactus blockchain is immediate. +It means that there is no need to wait for block confirmation to ensure a transaction is committed.

+ +

Later, more than 2000 community validators will secure the blockchain and make it decentralized. +These validators are Testnet participants who helped test Pactus during our testing period. +The community validators will receive the initial staking coins from a Discord Bot named RoboPac.

+ +

To ensure everything works smoothly on the Mainnet, three different Testnets ( +Testnet0, +Testnet1, and +Testnet2) have been run.

+ +

The Mainnet will never be stopped or interrupted by the core developers of Pactus, +and validators should primarily participate in and maintain the security of the blockchain.

+ + + + +
+
+
+
+ + + + diff --git a/2024/01/10/pactus-records-its-ips-in-ipminter.html b/2024/01/10/pactus-records-its-ips-in-ipminter.html new file mode 100644 index 000000000..b2095e6f4 --- /dev/null +++ b/2024/01/10/pactus-records-its-ips-in-ipminter.html @@ -0,0 +1,399 @@ + + + + + + + + + + + + + Pactus records its IPs in IPMINTER | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Pactus records its IPs in IPMINTER

+ +

IPMINTER

+ +

In our continuous pursuit of innovation, the recording of our intellectual property is the +cornerstone philosophy of Pactus. Yet, we found traditional patenting methods to be a +slow and expensive hurdle. That is… until we discovered IPMINTER!

+ +

Pactus profile in IPMINTER

+ +

We are ecstatic to announce that the blockchain-based platform by IPMINTER has +revolutionized the way we secure our creations.

+ +

Gone are the days of lengthy processes and hefty fees. With IPMINTER, registering our +intellectual property on the blockchain was a cakewalk – accomplished in a mere 10 minutes! +Plus, the moment we received our exquisite certificate, complete with a QR code directly linking +to our secure blockchain entry, our confidence in this platform soared.

+ +

Our journey with IPMINTER didn’t end there, it became our trusted ally in the ongoing mission +to protect our inventive proposals. The assurance we’ve experienced using their platform has +been unparalleled.

+ +

We’re proud to share our story and to recommend IPMINTER to those on a quest for a straightforward, +economical, and robust IP recording solution. They have our heartfelt endorsement!

+ +

Join us in embracing the future of IP management with IPMINTER. Record what’s yours, the smart way!

+ + + + +
+
+
+
+ + + + diff --git a/2024/01/11/release-0-20-0.html b/2024/01/11/release-0-20-0.html new file mode 100644 index 000000000..cacd82b3f --- /dev/null +++ b/2024/01/11/release-0-20-0.html @@ -0,0 +1,459 @@ + + + + + + + + + + + + + Pactus 0.20.0 Released | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Pactus 0.20.0 Released

+ +

Overview

+ +

Pactus Blockchain Version 0.20.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

+ +

Validator Stake Management

+ +

The new GUI application enables users to easily Unbond and Withdraw their validator’s stake.

+ +

Withdraw dialog

+ +

Improving Network Connectivity

+ +

Some users have reported that UDP packets are being dropped by their Internet Service Providers. +Therefore, the UDP protocol is disabled by default. +Users can still activate the UDP protocol by configuring the settings in the file if necessary.

+ +

Also, the experimental Node Gossip feature has been removed in this version. +Node gossip could cause some validators to become isolated from the rest of the network.

+ +

Relay service

+ +

This version enables users to turn their node into a relay service. +A relay service node can help users behind NAT to communicate with each other. +It is disabled by default and can be enabled inside the config file. +Please note that it is still in an experimental state.

+ +

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

+ +
    +
  • implement relay service (#931)
  • +
  • HTTP: Integrate AddRowDouble and update tests (#926)
  • +
  • network: making listen address private in config (#921)
  • +
  • http: adding AvailabilityScore to http module (#917)
  • +
  • network: adding ‘enable_udp’ config (#918)
  • +
  • network: removing gossip node service (#916)
  • +
  • gRPC: adding AvailabilityScore to gRPC (#910)
  • +
  • GUI: unbond and withdraw transaction dialogs (#908)
  • +
+ +

Fix

+ +
    +
  • gRPC: adding missing get raw transaction APIs to gRPC gateway (#925)
  • +
  • network: preventing self dial (#924)
  • +
  • fixing time lag on starting node (#923)
  • +
  • network: fixing network deadlock on linux arm64 (#922)
  • +
  • GUI: updating unbond and withdraw dialogs (#911)
  • +
  • fixing gRPC node info issue (#906)
  • +
+ +

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

+ + + + +
+
+
+
+ + + + diff --git a/2024/01/22/testnet-2-concluded.html b/2024/01/22/testnet-2-concluded.html new file mode 100644 index 000000000..89505c523 --- /dev/null +++ b/2024/01/22/testnet-2-concluded.html @@ -0,0 +1,442 @@ + + + + + + + + + + + + + Story of Testnet-2 | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Story of Testnet-2

+ +

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

+ +

In October 2023, we launched Testnet-2. +The main purpose of this Testnet was to closely monitor the new consensus mechanism and the stability of the P2P network.

+ +

The committee for Testnet-2 was set to 51 validators, +and 2084 validators joined during the Testnet period. +More than 1500 computers and servers joined the network, and we experienced a high volume of data transmission in the network. +More than 800,000 blocks were created, and about 2 million transactions were processed during this time. +The size of the blockchain is about 450 megabytes.

+ +

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

+ +

Stability of Consensus

+ +

In Testnet-1, we had one consensus failure that caused us to +conclude the Testnet-1. +During Testnet-2, there were no issues with the consensus mechanism, and +we had no case of failure during the testing period, +although the number of validators and nodes significantly increased on Testnet-2 compared to its predecessor. +It proved that the consensus mechanism is in a stable situation.

+ +

Networking issues

+ +

In Testnet-2, the blockchain stopped twice, and each time it took more than 24 hours to fix the problem. +In the second blockage, we had no choice but to ask active validators inside the committee to +update their nodes to overcome the networking issue. +The development team faced a difficult situation and had to make the proper decision to fix the networking issues. +On one hand, the networking traffic increased significantly, and on the other hand, we had to +make sure normal users with limited internet bandwidth could still participate in the consensus mechanism without any problems. +After examining different scenarios, the networking issues were resolved, and +no major problems were reported till the end of Testnet.

+ +

Major updates

+ +

During Testnet-2, we introduced several updates, including versions +0.15.0, +0.16.0, +0.17.0, +0.18.0, +0.19.0, and +0.20.0. +The update process went smoothly, and with the stability of Version 0.20.0 confirmed, +the development team shifted its focus to the Mainnet launch.

+ +

Special 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 PAC coins to set up their validators.

+ +

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

+ + + + +
+
+
+
+ + + + diff --git a/2024/01/24/mainnet-launched.html b/2024/01/24/mainnet-launched.html new file mode 100644 index 000000000..f4f9c9498 --- /dev/null +++ b/2024/01/24/mainnet-launched.html @@ -0,0 +1,432 @@ + + + + + + + + + + + + + Mainnet launched 🚀 | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Mainnet launched 🚀

+ +

Years to Launch

+ +

Pactus Mainnet started creating the first block on 24 January 2024 at 20:24:10 UTC time. +Pactus Mainnet is the result of years of hard work, research, and innovation. +It started from one idea:

+ +

A low-cost, truly decentralized blockchain, built by the people for the people, +where anyone could run and be their own validator.

+ +

We faced many challenges and obstacles along the way, but we never gave up.
+We overcame them with our determination and perseverance.
+We learned from our mistakes and improved our solutions.
+We grew from a small team to a large community.
+We achieved many milestones and breakthroughs. And we did it.
+We created Pactus, the platform that empowers you.

+ +

Thanks to Community

+ +

We want to thank Pactus community for helping us on the Testnet.

+ +

You have been instrumental in testing and improving the Testnet.
+You have given us your honest feedback and constructive suggestions.
+You have reported and help fixed bugs and errors.
+You have challenged and pushed us to do better.
+You have been our partners and friends in this journey.

+ +

On the Road

+ +

The true journey has just started.
+The Mainnet is not the end, but the beginning.
+The beginning of a new era of blockchain innovation.
+The beginning of a new challenge and opportunity.
+The beginning of a new revolution and evolution!

+ +

We welcome you more than ever.
+We need you to join us in this exciting adventure.
+We need you to support us in this ambitious endeavor.
+We need you to be part of Pactus, the platform that empowers you!

+ +

We Have a Dream

+ +

We have a dream.
+A dream of a world where blockchain technology is not a privilege, but a right for everyone.
+A dream of a world where smart contracts and decentralized applications are fast, secure, and scalable.
+A dream of a world where Pactus is the platform that empowers you.

+ +

This dream is not just ours. It is yours too.
+You share our vision and passion for blockchain innovation.
+You believe in our potential and impact.
+You support our goals and values.
+You are part of our dream.

+ +

And this dream is not just a fantasy. It is a reality.
+A reality that we have created together.
+A reality that we have launched today. A reality that we can explore and enjoy together.
+A reality that we can shape and improve together.
+A reality that we can make better and brighter together!

+ + + + +
+
+
+
+ + + + diff --git a/2024/01/31/release-1-0-0.html b/2024/01/31/release-1-0-0.html new file mode 100644 index 000000000..446ef6de0 --- /dev/null +++ b/2024/01/31/release-1-0-0.html @@ -0,0 +1,447 @@ + + + + + + + + + + + + + Pactus 1.0.0 (Beijing) Released | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Pactus 1.0.0 (Beijing) Released

+ +

Overview

+ +

Pactus Blockchain Version 1.0.0 (Beijing) +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.

+ +

Pactus Version 1.0.0 (Beijing)

+ +

Highlights

+ +

Mainnet Official Release v1.0.0 (Beijing)

+ +

The much-anticipated official software release of Pactus v1.0.0 (Beijing) marks a significant milestone +for our community. +This impressive mainnet release represents the culmination of extensive development efforts. +Pactus v1.0.0 (Beijing) offers a pioneering solution for streamlining the validation of Pactus blockchain, +enhancing security, and providing a user-friendly experience. We’re excited to unveil the official software +and welcome users to experience the power of Pactus in revolutionizing the future of blockchain. Join us on +this exciting journey.

+ +

Onboarding validators

+ +

On February 1st, a total of 53,494 PAC coins will be distributed among 1,311 validators who participated in +Testnet-0, +Testnet-1, and +Testnet-2. +This marks the beginning of a new chapter in the decentralized world.

+ +

Download

+ +

This version has been implemented for Mainnet +To start using Pactus Mainnet, download the latest version from the download +page and join the Mainnet.

+ +

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

+ + + +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • implement get validator address for grpc (#975)
  • +
  • add bootstrap.json and load in config on build (#964)
  • +
  • add mainnet config and genesis files (#951)
  • +
  • add Consensus-address to network info (#952)
  • +
  • grpc: sign transaction using wallet client (#945)
  • +
  • pactus gui lock support (#947)
  • +
  • consensus: turning consensus to a zero-config module (#942)
  • +
+ +

Fix

+ +
    +
  • localnet wallet issue (#970)
  • +
  • sync: remove ReachabilityStatus from agent info (#956)
  • +
  • daemon: keeping previous behavior for password flag, linting CLI messages (#950)
  • +
  • consensus: detect if the system time is behind the network (#939)
  • +
+ +

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

+ + + + +
+
+
+
+ + + + diff --git a/2024/02/10/release-1-0-1.html b/2024/02/10/release-1-0-1.html new file mode 100644 index 000000000..ccb1ee04b --- /dev/null +++ b/2024/02/10/release-1-0-1.html @@ -0,0 +1,427 @@ + + + + + + + + + + + + + Pactus 1.0.1 (Beijing) Released | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Pactus 1.0.1 (Beijing) Released

+ +

Overview

+ +

Pactus Blockchain Version 1.0.1 (Beijing) +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.

+ +

This release is named after the city of Beijing and it +was unanimously selected by Pactus community.

+ +

Pactus Version 1.0.1 (Beijing)

+ +

Highlights

+ +

This update fixes several issues identified after the release of +1.0.0 (Beijing). +Specifically, it fixes the missed log file on the Windows GUI application and improves the node connectivity.

+ +

Download

+ +

To start using Pactus blockchain, download the latest version from the download +page and join the Mainnet.

+ +

How to Upgrade

+ +

If you are running an older version, close it first. +Then uninstall the previous version and install the newer version. +If you are using the archived version, simply replace it with the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • gui: add connections and moniker fields to main windows (#1090)
  • +
+ +

Fix

+ +
    +
  • network: set dial and accept limit in connection gater (#1089)
  • +
  • gui stderr logger in windows os (#1081)
  • +
  • sync: improve syncing process (#1087)
  • +
  • network: redefine resource limits (#1086)
  • +
+ +

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

+ + + + +
+
+
+
+ + + + diff --git a/2024/02/18/release-1-0-2.html b/2024/02/18/release-1-0-2.html new file mode 100644 index 000000000..16d072f56 --- /dev/null +++ b/2024/02/18/release-1-0-2.html @@ -0,0 +1,418 @@ + + + + + + + + + + + + + Pactus 1.0.2 (Istanbul) Released | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Pactus 1.0.2 (Istanbul) Released

+ +

Overview

+ +

Pactus Blockchain Version 1.0.2 (Istanbul) +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.

+ +

This release is named after the city of Istanbul and it +was unanimously selected by Pactus community.

+ +

Pactus Version 1.0.2 (Istanbul)

+ +

Highlights

+ +

This update fixes a major issue that decreases the number of inbound connections of the nodes over time. +We highly recommend all users to upgrade to the new version for better connectivity.

+ +

Download

+ +

To start using Pactus blockchain, download the latest version from the download +page and join the Mainnet.

+ +

How to Upgrade

+ +

If you are running an older version, close it first. +Then uninstall the previous version and install the newer version. +If you are using the archived version, simply replace it with the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Fix

+ +
    +
  • sync: fix concurrent map read-write crash (#1112)
  • +
  • network: remove disconnected peers from peerMgr (#1110)
  • +
+ +

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..da96a1985 --- /dev/null +++ b/404.html @@ -0,0 +1,220 @@ + + + + + + + + + + + + + Error 404, Page Not Found | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+

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..153932cc7 --- /dev/null +++ b/about/faq/index.html @@ -0,0 +1,1486 @@ + + + + + + + + + + + + + FAQ | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+
+

FAQ

+

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

+
+ +
+ + + + + + + + + + + + + +
+
***
+ +
+ +
+
+
+ + 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. + + + +
+ + +

+ Did Pactus have an ICO? +

+
+ + + + + + + No, Pactus didn't have any ICO or 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. + + + +
+ + +

+ 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. + + + +
+ + +

+ 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.

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 Pactus, there is no fixed amount for staking. Pactus is specifically designed to be more accessible to normal users, and you can run the Pactus blockchain on your personal computer with basic hardware. + + + +
+ +
+ +
+
+
+ + 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. + + + + + +
+ + +

+ How many validators does Pactus have? +

+
+ + + + + + + Pactus is a real Proof of Stake blockchain, which means there is no limit on the number of validators in the network. However, a committee of 51 validators is responsible for creating blocks. It's important to note that the committee members are not fixed and they change over time. + + + + + +
+ + +

+ 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. + + + +
+ + +

+ What are the minimum hardware requirements? +

+
+ + + + + + + After thorough testing on multiple machines, we can conclude that the recommended minimum hardware requirements are as follows:

VPS:
* CPU's: 1/2 physical core / 1vCPU
* RAM: 1 GB Ram
* Storage (SSD): 20 GB NVMe Drive
* Network: stable internet connection with 1 TBps speed

PC:
* CPU's: 2 physical cores / 4vCPU
* RAM: 4 GB Ram
* Storage (SSD): 64 GB SSD Drive
* Network: stable internet connection with over 15 MBps speed

**Note** These specifications have been tested and provide an availability score of over 0.9. + + + + + +
+ + +

+ 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? + + + + +
+ + +

+ How many PAC coins are generated per day? +

+
+ + + + + + + Daily, a total amount of 8640 PAC is generated. This figure translates to 241,000 every 28 days and 3,153,600 per year. + + + +
+ +
+ +
+
+
+ + Consensus +
+
+ + +

+ How does Pactus blockchain work? +

+
+ + + + + + + Pactus operates with a committee of validators who are responsible for creating new blocks. The committee consists of 51 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. + + + + + +
+ + +

+ How much is the block confirmation in the Pactus Blockchain? +

+
+ + + + + + + Block confirmation refers to the number of blocks that need to be created before a transaction is considered final and irreversible. In Pactus, block confirmation is immediate, meaning that once a transaction is added to a block, it is considered confirmed and cannot be reversed. + + + + + +
+ +
+ +
+
+
+ + Economy +
+
+ + +

+ What is the total supply of Pactus coins? +

+
+ + + + + + + Pactus has a total supply of 42 million coins, and each coin is divided into 1 billion units. $$ 1 \ PAC = 10^9 \ SatoshiPAC $$ + + + +
+ + +

+ How are Genesis Coins allocated in Pactus? +

+
+ + + + + + + The initial allocation of Genesis Coins in the Pactus blockchain is distributed as follows:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Genesis Coin Allocation for Pactus
CategoryCoin AllocationPercentage
Treasury21 Million coins50%
Foundation8.4 Million coins20%
VC Allocation6.3 Million coins15%
Team and Operations4.2 Million coins10%
Community2.1 Million coins5%
+ + + How are Genesis Coins allocated in Pactus? + + +
+ + +

+ What is the Treasury account? +

+
+ + + + + + + The Treasury account is a special account in Pactus blockchain that holds 21 million coins at the genesis time. It 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. + + + + + +
+ + +

+ How will the Treasury coins be distributed? +

+
+ + + + + + + Treasury coins are distributed as block rewards to the block proposers. Every 10 seconds, one coin from the Treasury account transfers to the block proposer account. This process is called "coin minting". As a result, the total number of Pactus coins in circulation gradually increases over time as new blocks are added to the blockchain. Every day, 8,640 coins are minted, resulting in approximately 3 million coins being minted annually by the Treasury account. + + + How will the Treasury coins be distributed? + + + + +
+ + +

+ How will the Support coins be spent? +

+
+ + + + + + + The support accounts are designed to provide financial backing for the project. Initially, Pactus Genesis contained only the Treasury accounts without any Backup or Support accounts. The introduction of support coins was a strategic response to the absence of investors, despite the significant progress of the project.

These coins are allocated in several ways:
    +
  • Community: + This portion will mainly support the community. + As part of this, the participants on Testnets receive initial staking coins to + setup their validator and secure the Mainnet. +
  • +
  • Team and Operations: + Another portion supports the project team. + Team members receive a monthly distribution of these coins, which is estimated to sustain the team for over six years. +
  • +
  • Venture Capital (VC) Allocation: + Another portion is set aside for any potential venture capitalists who + might show interest in investing in the project in the future. +
  • +
  • Foundation: + The foundation coins are reserved for future use, potentially in supporting strong projects that align with Pactus's objectives. +
  • +
+Transparency is a key aspect of this allocation, as all movements of these coins are trackable due to the fully transparent nature of the blockchain. + + + +
+ +
+ +
+
+
+ + 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..cc0cbeb51 --- /dev/null +++ b/about/roadmap/index.html @@ -0,0 +1,716 @@ + + + + + + + + + + + + + Roadmap | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+

Roadmap

+ +
+
✅ Completed Task
+
🚧 Ongoing Task
+
⏳ Upcoming Task
+
+ +
+
+
+ + +
+
+
+
+ + Decentralized Storage Platform + +
+
Q1 2025
+
+
+
+ +
+
+
+
+ + Browser Extension Wallet + +
+
Q4 2024
+
+
+
+ +
+
+
+
+ + Desktop and Mobile Friendly GUI + +
+
July 2024
+
+
+
+ +
+
+
+
+ + CLI tools for controlling Pactus node + +
+
Jun 2024
+
+
+
+ +
+
+
+
+ + First Interactive Block Explorer + +
+
March 2024
+
+
+
+ +
+
+
+
+ + Permanent testnet launch + +
+
February 2024
+
+
+
+ +
+
+
+ +
January 2024
+
+
+
+ +
+
+
+ +
24 January 2024
+
+
+
+ +
+
+
+ +
January 2024
+
+
+
+ +
+
+
+ +
January 2024
+
+
+
+ +
+
+
+ +
January 2024
+
+
+
+ +
+
+
+ +
December 2023
+
+
+
+ +
+
+
+ +
November 2023
+
+
+
+ +
+
+
+ +
October 2023
+
+
+
+ +
+
+
+ +
October 2023
+
+
+
+ +
+
+
+ +
October 2023
+
+
+
+ +
+
+
+ +
August 2023
+
+
+
+ +
+
+
+ +
July 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..94309943f --- /dev/null +++ b/about/what-is-pactus/index.html @@ -0,0 +1,412 @@ + + + + + + + + + + + + + What is Pactus? | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+

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..b0cd0975b --- /dev/null +++ b/ar/2022/08/29/dev-meeting.html @@ -0,0 +1,400 @@ + + + + + + + + + + + + + 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..e72b93425 --- /dev/null +++ b/ar/2022/09/04/dev-meeting.html @@ -0,0 +1,509 @@ + + + + + + + + + + + + + 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..fe35d4f84 --- /dev/null +++ b/ar/2022/09/18/dev-meeting.html @@ -0,0 +1,419 @@ + + + + + + + + + + + + + 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..b62ddfe14 --- /dev/null +++ b/ar/2022/09/20/release-0-9-0.html @@ -0,0 +1,389 @@ + + + + + + + + + + + + + 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..e8c07ebb4 --- /dev/null +++ b/ar/2022/09/24/testnet-0-launched.html @@ -0,0 +1,385 @@ + + + + + + + + + + + + + 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..e55a6e2fc --- /dev/null +++ b/ar/2022/10/30/dev-meeting.html @@ -0,0 +1,412 @@ + + + + + + + + + + + + + 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..32b751774 --- /dev/null +++ b/ar/2022/11/24/release-0-9-1.html @@ -0,0 +1,404 @@ + + + + + + + + + + + + + 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..7dd1e6182 --- /dev/null +++ b/ar/2023/03/01/what-is-testnet.html @@ -0,0 +1,456 @@ + + + + + + + + + + + + + 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 coins 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 coins 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..f141c25f2 --- /dev/null +++ b/ar/2023/04/21/testnet-0-concluded.html @@ -0,0 +1,418 @@ + + + + + + + + + + + + + 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 Testnet-0. +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.

+ +

Special 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 PAC coins to set up their validators.

+ +

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..1359f6fa6 --- /dev/null +++ b/ar/2023/05/08/release-0-10-0.html @@ -0,0 +1,432 @@ + + + + + + + + + + + + + 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..618e58088 --- /dev/null +++ b/ar/2023/05/09/testnet-1-launched.html @@ -0,0 +1,415 @@ + + + + + + + + + + + + + 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..02f53bbc6 --- /dev/null +++ b/ar/2023/05/29/release-0-11-0.html @@ -0,0 +1,444 @@ + + + + + + + + + + + + + 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..0f4cd5e46 --- /dev/null +++ b/ar/2023/06/19/release-0-12-0.html @@ -0,0 +1,442 @@ + + + + + + + + + + + + + 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..aa4037ede --- /dev/null +++ b/ar/2023/07/01/release-0-13-0.html @@ -0,0 +1,433 @@ + + + + + + + + + + + + + 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..bfcc39db6 --- /dev/null +++ b/ar/2023/07/05/testnet-500-validators.html @@ -0,0 +1,407 @@ + + + + + + + + + + + + + 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..3f4e2228b --- /dev/null +++ b/ar/2023/07/09/dev-meeting.html @@ -0,0 +1,413 @@ + + + + + + + + + + + + + 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..50c17ffae --- /dev/null +++ b/ar/2023/08/01/testnet-1-concluded.html @@ -0,0 +1,442 @@ + + + + + + + + + + + + + Story of Testnet-1 | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Story of Testnet-1

+ +

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

+ +

In May 2023, we launched Testnet-1. +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

+ +

Major updates

+ +

During Testnet-1, we released three versions(Version +0.11.0, +0.12.0, +0.13.0), and the upgrade process was smooth. +Unfortunately, during Testnet-1, we encountered a consensus failure that may occur at any time in the future. +The consensus failure was resolved by requiring some validators to re-sync their nodes. +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.

+ +

Special 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 PAC coins to set up their validators.

+ +

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..f5ca5c5cf --- /dev/null +++ b/ar/2023/08/22/dev-report.html @@ -0,0 +1,407 @@ + + + + + + + + + + + + + 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..0a6150c13 --- /dev/null +++ b/ar/2023/09/04/introduction-to-pips.html @@ -0,0 +1,415 @@ + + + + + + + + + + + + + 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..e4a76762e --- /dev/null +++ b/ar/2023/09/24/dev-report-pre-testnet-2.html @@ -0,0 +1,425 @@ + + + + + + + + + + + + + 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..f87f271cd --- /dev/null +++ b/ar/2023/09/28/how-sspos-works-in-simple-word.html @@ -0,0 +1,459 @@ + + + + + + + + + + + + + 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 51, +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..a76d94b9b --- /dev/null +++ b/ar/2023/10/15/release-0-15-0.html @@ -0,0 +1,499 @@ + + + + + + + + + + + + + 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..65cd89ca9 --- /dev/null +++ b/ar/2023/10/15/testnet-2-launched.html @@ -0,0 +1,423 @@ + + + + + + + + + + + + + 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/29/release-0-16-0.html b/ar/2023/10/29/release-0-16-0.html new file mode 100644 index 000000000..e33c5de47 --- /dev/null +++ b/ar/2023/10/29/release-0-16-0.html @@ -0,0 +1,446 @@ + + + + + + + + + + + + + Pactus 0.16.0 Released | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Pactus 0.16.0 Released

+ +

Overview

+ +

Pactus Blockchain Version 0.16.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 allows users to create new addresses for both validators and accounts. +The networking module has been improved, and users can now set limits on the number of connections. +A random crash on the agreement protocol has been fixed in this version.

+ +

New address dialog

+ +

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

+ +
    +
  • gui: display network ID (#780)
  • +
  • create new validator address (CLI and GUI) (#757)
  • +
  • add community bootstrap nodes to testnet config (#764)
  • +
  • network: implementing connection manager (#773)
  • +
  • network: adding bootstrapper mode to the network config (#760)
  • +
+ +

Fix

+ +
    +
  • network: redefine the network limits (#788)
  • +
  • consensus: not increase the vote-box power on duplicated votes (#785)
  • +
  • network: close connection when unable 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)
  • +
  • consensus: strong termination for the binary agreement (#765)
  • +
  • consensus: not increase the voting power on duplicated binary votes (#762)
  • +
+ +

Refactor

+ +
    +
  • network: refactoring peer manager (#787)
  • +
+ +

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

+ + + + +
+
+
+
+ + + + diff --git a/ar/2023/11/12/release-0-17-0.html b/ar/2023/11/12/release-0-17-0.html new file mode 100644 index 000000000..092bd3faa --- /dev/null +++ b/ar/2023/11/12/release-0-17-0.html @@ -0,0 +1,455 @@ + + + + + + + + + + + + + Pactus 0.17.0 Released | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Pactus 0.17.0 Released

+ +

Overview

+ +

Pactus Blockchain Version 0.17.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 Testnet has been upgraded and all validators must update their nodes.

+ +

This version will address major networking issues, reduce network usage, and improve overall performance.

+ +

A new node type, “Node Gossips”, has been introduced to help broadcast and spread messages across the network. +Node Gossips support the network by delivering messages to non-gossiping nodes. +This gossip option is disabled by default but can be enabled in the configuration file. +If you are running Pactus on a stable and reliable server, we recommend enabling this option for your node. +Please note that this option is still experimental and subject to potential changes in future releases.

+ +

Node gossip in config 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.

+ +

+After updating the node, the configuration file will be overwritten with a new version. +You need to make modifications to the config file if you had customized it prior to the update. +

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • network: default configs for bootstrap and relay peers (#812)
  • +
  • introducing node gossip type (#811)
  • +
  • sync: adding remote address to the peer info (#804)
  • +
  • network: adding public address to factory (#795)
  • +
  • network: filter private ips (#793)
  • +
+ +

Fix

+ +
    +
  • upgrading Testnet (#814)
  • +
  • sync: prevent opening sessions indefinitely (#813)
  • +
  • execution: fixing mistake on calculating unbonded power (#806)
  • +
  • network: check connection threshold on gater (#803)
  • +
  • network: no transient connection (#799)
  • +
  • not close connection for bootstrap nodes (#792)
  • +
+ +

Refactor

+ +
    +
  • sync: refactoring sync process (#807)
  • +
+ +

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

+ + + + +
+
+
+
+ + + + diff --git a/ar/2023/12/12/release-0-18-0.html b/ar/2023/12/12/release-0-18-0.html new file mode 100644 index 000000000..86999a687 --- /dev/null +++ b/ar/2023/12/12/release-0-18-0.html @@ -0,0 +1,456 @@ + + + + + + + + + + + + + Pactus 0.18.0 Released | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Pactus 0.18.0 Released

+ +

Overview

+ +

Pactus Blockchain Version 0.18.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 has significantly improved the syncing progress. +The syncing process concurrently requests blocks from 8 different peers and +actively connects to the most optimal peers for downloading the blockchain.

+ +

Additionally, users can now import private keys into their wallet and securely encrypt them using their wallet password.

+ +

Breaking change

+ +

For Unix-based systems, please note that the working directory for root users has changed from /pactus to /root/pactus.

+ +

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.

+ +

+After you update the node, the configuration file will automatically get updated, keeping the old settings. +If you want to return the configuration file to its default settings, +just delete the current config file and restart the node. +

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • implement pip-14 (#841)
  • +
  • sort wallet addresses (#836)
  • +
  • grpc: endpoints for creating raw transaction (#838)
  • +
  • network reachability API (#834)
  • +
  • implement pip-13 (#835)
  • +
  • subscribing to libp2p eventbus (#831)
  • +
  • implement helper methods for wallet address path (#830)
  • +
  • logger: adding rotate log file after days, compress and maxgae for logger config (#822)
  • +
  • enable bandwidth router metric (#819)
  • +
+ +

Fix

+ +
    +
  • network: refining the connection limit (#849)
  • +
  • corrected mistake when retrieving the reward address (#848)
  • +
  • config: restore default config when it is deleted (#847)
  • +
  • cmd: changing home directory for root users (#846)
  • +
  • removing BasicCheck for hash (#845)
  • +
  • disabling libp2p ping protocol (#844)
  • +
  • build docker file (#839)
  • +
  • sync: ignore publishing a block if it is received before (#829)
  • +
  • network: subscribing to the Libp2p event bus (#828)
  • +
  • sync: ignore block request if blocks are already inside the cache (#817)
  • +
+ +

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

+ + + + +
+
+
+
+ + + + diff --git a/ar/2024/01/04/release-0-19-0.html b/ar/2024/01/04/release-0-19-0.html new file mode 100644 index 000000000..5ca07aa30 --- /dev/null +++ b/ar/2024/01/04/release-0-19-0.html @@ -0,0 +1,460 @@ + + + + + + + + + + + + + Pactus 0.19.0 Released | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Pactus 0.19.0 Released

+ +

Overview

+ +

Pactus Blockchain Version 0.19.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 has improved the overall performance of the blockchain by implementing +PIP-15. +PIP-15 suggests to add caching algorithms to the database for the most frequently used items.

+ +

Additionally, this version has enhanced the connectivity of the nodes in the P2P network.

+ +

Availability Score

+ +

This version comes with the implementation of PIP-19. +PIP-19 suggests assigning the “Availability Score” to each validator based on their activities in the +committee. +Validators with a score less than 0.8 won’t receive the block reward, +as their proposals will be rejected by other validators. +The main reason behind this PIP is to prevent users from downgrading +their node specifications and running Pactus on machines with low resources.

+ +

Breaking change

+ +

The Docker container now contains both daemon and wallet binary files. +Users who use Docker to run Pacts now need to add the entry point to run Pactus.

+ +

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

+ +
    +
  • gRPC: defining network and peers info response’s properly (#898)
  • +
  • implementing pip-19 (#899)
  • +
  • network: disabling GosipSub, only FloodSub (#895)
  • +
  • www: adding change proposer round and value to consensus info votes (#892)
  • +
  • network: adding relay service to dial relay nodes (#887)
  • +
  • implementing pip-15 (#843)
  • +
  • check already running by lock file (#871)
  • +
+ +

Fix

+ +
    +
  • store: use cache to check if public key exists (#902)
  • +
  • executor: not rejecting bond transaction for bootstrap validator (#901)
  • +
  • GUI: removing unnecessary tags in transaction confirm dialog (#893)
  • +
  • network: close relay connection for public node (#891)
  • +
  • network: refining GossipSubParams for Gossiper node (#882)
  • +
  • sync: adding sequence number to the bundle (#881)
  • +
  • network: turn off mesh for gossiper node (#880)
  • +
  • consensus: check voteset for CP strong termination (#879)
  • +
  • adding querier to query messages (#878)
  • +
  • execution: fixing issue #869 (#870)
  • +
  • fixing logger issue on rotating log file (#859)
  • +
+ +

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

+ + + + +
+
+
+
+ + + + diff --git a/ar/2024/01/08/mainnet-announcement.html b/ar/2024/01/08/mainnet-announcement.html new file mode 100644 index 000000000..e2769ffc3 --- /dev/null +++ b/ar/2024/01/08/mainnet-announcement.html @@ -0,0 +1,392 @@ + + + + + + + + + + + + + Mainnet announcement | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Mainnet announcement

+ +

The much-awaited Mainnet Launch of The Pactus Blockchain is finally here! +On January 24, 2024, at 20:24:00 UTC, the first block, known as the Genesis block, +will be minted by four Bootstrap validators. +After that, every 10 seconds, a new block will be added to the blockchain. +Each block contains the committed transactions in the network. +The block finality in the Pactus blockchain is immediate. +It means that there is no need to wait for block confirmation to ensure a transaction is committed.

+ +

Later, more than 2000 community validators will secure the blockchain and make it decentralized. +These validators are Testnet participants who helped test Pactus during our testing period. +The community validators will receive the initial staking coins from a Discord Bot named RoboPac.

+ +

To ensure everything works smoothly on the Mainnet, three different Testnets ( +Testnet0, +Testnet1, and +Testnet2) have been run.

+ +

The Mainnet will never be stopped or interrupted by the core developers of Pactus, +and validators should primarily participate in and maintain the security of the blockchain.

+ + + + +
+
+
+
+ + + + diff --git a/ar/2024/01/10/pactus-records-its-ips-in-ipminter.html b/ar/2024/01/10/pactus-records-its-ips-in-ipminter.html new file mode 100644 index 000000000..e12928128 --- /dev/null +++ b/ar/2024/01/10/pactus-records-its-ips-in-ipminter.html @@ -0,0 +1,397 @@ + + + + + + + + + + + + + Pactus records its IPs in IPMINTER | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Pactus records its IPs in IPMINTER

+ +

IPMINTER

+ +

In our continuous pursuit of innovation, the recording of our intellectual property is the +cornerstone philosophy of Pactus. Yet, we found traditional patenting methods to be a +slow and expensive hurdle. That is… until we discovered IPMINTER!

+ +

Pactus profile in IPMINTER

+ +

We are ecstatic to announce that the blockchain-based platform by IPMINTER has +revolutionized the way we secure our creations.

+ +

Gone are the days of lengthy processes and hefty fees. With IPMINTER, registering our +intellectual property on the blockchain was a cakewalk – accomplished in a mere 10 minutes! +Plus, the moment we received our exquisite certificate, complete with a QR code directly linking +to our secure blockchain entry, our confidence in this platform soared.

+ +

Our journey with IPMINTER didn’t end there, it became our trusted ally in the ongoing mission +to protect our inventive proposals. The assurance we’ve experienced using their platform has +been unparalleled.

+ +

We’re proud to share our story and to recommend IPMINTER to those on a quest for a straightforward, +economical, and robust IP recording solution. They have our heartfelt endorsement!

+ +

Join us in embracing the future of IP management with IPMINTER. Record what’s yours, the smart way!

+ + + + +
+
+
+
+ + + + diff --git a/ar/2024/01/11/release-0-20-0.html b/ar/2024/01/11/release-0-20-0.html new file mode 100644 index 000000000..7925c2b3e --- /dev/null +++ b/ar/2024/01/11/release-0-20-0.html @@ -0,0 +1,457 @@ + + + + + + + + + + + + + Pactus 0.20.0 Released | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Pactus 0.20.0 Released

+ +

Overview

+ +

Pactus Blockchain Version 0.20.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

+ +

Validator Stake Management

+ +

The new GUI application enables users to easily Unbond and Withdraw their validator’s stake.

+ +

Withdraw dialog

+ +

Improving Network Connectivity

+ +

Some users have reported that UDP packets are being dropped by their Internet Service Providers. +Therefore, the UDP protocol is disabled by default. +Users can still activate the UDP protocol by configuring the settings in the file if necessary.

+ +

Also, the experimental Node Gossip feature has been removed in this version. +Node gossip could cause some validators to become isolated from the rest of the network.

+ +

Relay service

+ +

This version enables users to turn their node into a relay service. +A relay service node can help users behind NAT to communicate with each other. +It is disabled by default and can be enabled inside the config file. +Please note that it is still in an experimental state.

+ +

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

+ +
    +
  • implement relay service (#931)
  • +
  • HTTP: Integrate AddRowDouble and update tests (#926)
  • +
  • network: making listen address private in config (#921)
  • +
  • http: adding AvailabilityScore to http module (#917)
  • +
  • network: adding ‘enable_udp’ config (#918)
  • +
  • network: removing gossip node service (#916)
  • +
  • gRPC: adding AvailabilityScore to gRPC (#910)
  • +
  • GUI: unbond and withdraw transaction dialogs (#908)
  • +
+ +

Fix

+ +
    +
  • gRPC: adding missing get raw transaction APIs to gRPC gateway (#925)
  • +
  • network: preventing self dial (#924)
  • +
  • fixing time lag on starting node (#923)
  • +
  • network: fixing network deadlock on linux arm64 (#922)
  • +
  • GUI: updating unbond and withdraw dialogs (#911)
  • +
  • fixing gRPC node info issue (#906)
  • +
+ +

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

+ + + + +
+
+
+
+ + + + diff --git a/ar/2024/01/22/testnet-2-concluded.html b/ar/2024/01/22/testnet-2-concluded.html new file mode 100644 index 000000000..f774d0248 --- /dev/null +++ b/ar/2024/01/22/testnet-2-concluded.html @@ -0,0 +1,440 @@ + + + + + + + + + + + + + Story of Testnet-2 | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Story of Testnet-2

+ +

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

+ +

In October 2023, we launched Testnet-2. +The main purpose of this Testnet was to closely monitor the new consensus mechanism and the stability of the P2P network.

+ +

The committee for Testnet-2 was set to 51 validators, +and 2084 validators joined during the Testnet period. +More than 1500 computers and servers joined the network, and we experienced a high volume of data transmission in the network. +More than 800,000 blocks were created, and about 2 million transactions were processed during this time. +The size of the blockchain is about 450 megabytes.

+ +

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

+ +

Stability of Consensus

+ +

In Testnet-1, we had one consensus failure that caused us to +conclude the Testnet-1. +During Testnet-2, there were no issues with the consensus mechanism, and +we had no case of failure during the testing period, +although the number of validators and nodes significantly increased on Testnet-2 compared to its predecessor. +It proved that the consensus mechanism is in a stable situation.

+ +

Networking issues

+ +

In Testnet-2, the blockchain stopped twice, and each time it took more than 24 hours to fix the problem. +In the second blockage, we had no choice but to ask active validators inside the committee to +update their nodes to overcome the networking issue. +The development team faced a difficult situation and had to make the proper decision to fix the networking issues. +On one hand, the networking traffic increased significantly, and on the other hand, we had to +make sure normal users with limited internet bandwidth could still participate in the consensus mechanism without any problems. +After examining different scenarios, the networking issues were resolved, and +no major problems were reported till the end of Testnet.

+ +

Major updates

+ +

During Testnet-2, we introduced several updates, including versions +0.15.0, +0.16.0, +0.17.0, +0.18.0, +0.19.0, and +0.20.0. +The update process went smoothly, and with the stability of Version 0.20.0 confirmed, +the development team shifted its focus to the Mainnet launch.

+ +

Special 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 PAC coins to set up their validators.

+ +

We are grateful to all those who participated in Testnets, and we encourage them to join the Mainnet. +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/2024/01/24/mainnet-launched.html b/ar/2024/01/24/mainnet-launched.html new file mode 100644 index 000000000..0bc2d5b45 --- /dev/null +++ b/ar/2024/01/24/mainnet-launched.html @@ -0,0 +1,430 @@ + + + + + + + + + + + + + Mainnet launched 🚀 | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Mainnet launched 🚀

+ +

Years to Launch

+ +

Pactus Mainnet started creating the first block on 24 January 2024 at 20:24:10 UTC time. +Pactus Mainnet is the result of years of hard work, research, and innovation. +It started from one idea:

+ +

A low-cost, truly decentralized blockchain, built by the people for the people, +where anyone could run and be their own validator.

+ +

We faced many challenges and obstacles along the way, but we never gave up.
+We overcame them with our determination and perseverance.
+We learned from our mistakes and improved our solutions.
+We grew from a small team to a large community.
+We achieved many milestones and breakthroughs. And we did it.
+We created Pactus, the platform that empowers you.

+ +

Thanks to Community

+ +

We want to thank Pactus community for helping us on the Testnet.

+ +

You have been instrumental in testing and improving the Testnet.
+You have given us your honest feedback and constructive suggestions.
+You have reported and help fixed bugs and errors.
+You have challenged and pushed us to do better.
+You have been our partners and friends in this journey.

+ +

On the Road

+ +

The true journey has just started.
+The Mainnet is not the end, but the beginning.
+The beginning of a new era of blockchain innovation.
+The beginning of a new challenge and opportunity.
+The beginning of a new revolution and evolution!

+ +

We welcome you more than ever.
+We need you to join us in this exciting adventure.
+We need you to support us in this ambitious endeavor.
+We need you to be part of Pactus, the platform that empowers you!

+ +

We Have a Dream

+ +

We have a dream.
+A dream of a world where blockchain technology is not a privilege, but a right for everyone.
+A dream of a world where smart contracts and decentralized applications are fast, secure, and scalable.
+A dream of a world where Pactus is the platform that empowers you.

+ +

This dream is not just ours. It is yours too.
+You share our vision and passion for blockchain innovation.
+You believe in our potential and impact.
+You support our goals and values.
+You are part of our dream.

+ +

And this dream is not just a fantasy. It is a reality.
+A reality that we have created together.
+A reality that we have launched today. A reality that we can explore and enjoy together.
+A reality that we can shape and improve together.
+A reality that we can make better and brighter together!

+ + + + +
+
+
+
+ + + + diff --git a/ar/2024/01/31/release-1-0-0.html b/ar/2024/01/31/release-1-0-0.html new file mode 100644 index 000000000..a589fdb58 --- /dev/null +++ b/ar/2024/01/31/release-1-0-0.html @@ -0,0 +1,445 @@ + + + + + + + + + + + + + Pactus 1.0.0 (Beijing) Released | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Pactus 1.0.0 (Beijing) Released

+ +

Overview

+ +

Pactus Blockchain Version 1.0.0 (Beijing) +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.

+ +

Pactus Version 1.0.0 (Beijing)

+ +

Highlights

+ +

Mainnet Official Release v1.0.0 (Beijing)

+ +

The much-anticipated official software release of Pactus v1.0.0 (Beijing) marks a significant milestone +for our community. +This impressive mainnet release represents the culmination of extensive development efforts. +Pactus v1.0.0 (Beijing) offers a pioneering solution for streamlining the validation of Pactus blockchain, +enhancing security, and providing a user-friendly experience. We’re excited to unveil the official software +and welcome users to experience the power of Pactus in revolutionizing the future of blockchain. Join us on +this exciting journey.

+ +

Onboarding validators

+ +

On February 1st, a total of 53,494 PAC coins will be distributed among 1,311 validators who participated in +Testnet-0, +Testnet-1, and +Testnet-2. +This marks the beginning of a new chapter in the decentralized world.

+ +

Download

+ +

This version has been implemented for Mainnet +To start using Pactus Mainnet, download the latest version from the download +page and join the Mainnet.

+ +

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

+ + + +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • implement get validator address for grpc (#975)
  • +
  • add bootstrap.json and load in config on build (#964)
  • +
  • add mainnet config and genesis files (#951)
  • +
  • add Consensus-address to network info (#952)
  • +
  • grpc: sign transaction using wallet client (#945)
  • +
  • pactus gui lock support (#947)
  • +
  • consensus: turning consensus to a zero-config module (#942)
  • +
+ +

Fix

+ +
    +
  • localnet wallet issue (#970)
  • +
  • sync: remove ReachabilityStatus from agent info (#956)
  • +
  • daemon: keeping previous behavior for password flag, linting CLI messages (#950)
  • +
  • consensus: detect if the system time is behind the network (#939)
  • +
+ +

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

+ + + + +
+
+
+
+ + + + diff --git a/ar/2024/02/10/release-1-0-1.html b/ar/2024/02/10/release-1-0-1.html new file mode 100644 index 000000000..f39089293 --- /dev/null +++ b/ar/2024/02/10/release-1-0-1.html @@ -0,0 +1,425 @@ + + + + + + + + + + + + + Pactus 1.0.1 (Beijing) Released | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Pactus 1.0.1 (Beijing) Released

+ +

Overview

+ +

Pactus Blockchain Version 1.0.1 (Beijing) +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.

+ +

This release is named after the city of Beijing and it +was unanimously selected by Pactus community.

+ +

Pactus Version 1.0.1 (Beijing)

+ +

Highlights

+ +

This update fixes several issues identified after the release of +1.0.0 (Beijing). +Specifically, it fixes the missed log file on the Windows GUI application and improves the node connectivity.

+ +

Download

+ +

To start using Pactus blockchain, download the latest version from the download +page and join the Mainnet.

+ +

How to Upgrade

+ +

If you are running an older version, close it first. +Then uninstall the previous version and install the newer version. +If you are using the archived version, simply replace it with the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • gui: add connections and moniker fields to main windows (#1090)
  • +
+ +

Fix

+ +
    +
  • network: set dial and accept limit in connection gater (#1089)
  • +
  • gui stderr logger in windows os (#1081)
  • +
  • sync: improve syncing process (#1087)
  • +
  • network: redefine resource limits (#1086)
  • +
+ +

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

+ + + + +
+
+
+
+ + + + diff --git a/ar/2024/02/18/release-1-0-2.html b/ar/2024/02/18/release-1-0-2.html new file mode 100644 index 000000000..8e47bfcf7 --- /dev/null +++ b/ar/2024/02/18/release-1-0-2.html @@ -0,0 +1,416 @@ + + + + + + + + + + + + + Pactus 1.0.2 (Istanbul) Released | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Pactus 1.0.2 (Istanbul) Released

+ +

Overview

+ +

Pactus Blockchain Version 1.0.2 (Istanbul) +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.

+ +

This release is named after the city of Istanbul and it +was unanimously selected by Pactus community.

+ +

Pactus Version 1.0.2 (Istanbul)

+ +

Highlights

+ +

This update fixes a major issue that decreases the number of inbound connections of the nodes over time. +We highly recommend all users to upgrade to the new version for better connectivity.

+ +

Download

+ +

To start using Pactus blockchain, download the latest version from the download +page and join the Mainnet.

+ +

How to Upgrade

+ +

If you are running an older version, close it first. +Then uninstall the previous version and install the newer version. +If you are using the archived version, simply replace it with the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Fix

+ +
    +
  • sync: fix concurrent map read-write crash (#1112)
  • +
  • network: remove disconnected peers from peerMgr (#1110)
  • +
+ +

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..966c81ead --- /dev/null +++ b/ar/404.html @@ -0,0 +1,218 @@ + + + + + + + + + + + + + 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..e3029d29c --- /dev/null +++ b/ar/about/faq/index.html @@ -0,0 +1,1527 @@ + + + + + + + + + + + + + الأسئلة المتكررة | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+
+

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

+

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

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

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

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

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

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

+ Did Pactus have an 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 أو حسابات محظوظة. + + + +
+ + +

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

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

مشكلات القابلية للتوسع: تتميز بكتوس بآلية اتفاق فريدة من نوعها تم تصميمها خصيصًا للتعامل مع مشكلة القابلية للتوسع، دون التضحية بالأمان واللامركزية.

الوصول: تم تصميم تشغيل المعالج على بكتوس بحيث يكون أكثر وصولًا للمستخدمين العاديين مقارنة بالبلوكتشينات الأخرى.

العدالة في التوزيع: تمتلك بكتوس نموذجًا عادلاً وشفافًا لتوزيع العملات، بهدف منع تراكم الثروة.

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

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

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

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

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

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

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

+ ما هو عدد المعالجين الذي يدعمه بكتوس؟ +

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

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

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

+ What are the minimum hardware requirements? +

+
+ + + + + + + After thorough testing on multiple machines, we can conclude that the reccomended minimum hardware
requirements are as follows:

VPS:
* CPU's: 1/2 physical core / 1vCPU
* RAM: 1 GB Ram
* Storage (SSD): 20 GB NVMe Drive
* Network: stable internet connection with 1 TBps speed

PC:
* CPU's: 2 physical cores / 4vCPU
* RAM: 4 GB Ram
* Storage (SSD): 64 GB SSD Drive
* Network: stable internet connection with over 15 MBps speed

**Note** These specifications have been tested and provide an availabilty score of over 0.9. + + + + + +
+ + +

+ 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 many PAC coins are generated per day? +

+
+ + + + + + + Daily, a total amount of 8640 PAC is generated. This figure translates to 241,000 every 28 days and 3,153,600 per year. + + + +
+ +
+ +
+
+
+ + إجماع +
+
+ + +

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

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

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

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

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

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

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

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

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

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

+ How much is the block confirmation in the Pactus Blockchain? +

+
+ + + + + + + Block confirmation refers to the number of blocks that need to be created before a transaction is considered final and irreversible. In Pactus, block confirmation is immediate, meaning that once a transaction is added to a block, it is considered confirmed and cannot be reversed. + + + + + +
+ +
+ +
+
+
+ + Economy +
+
+ + +

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

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

+ How are Genesis Coins allocated in Pactus? +

+
+ + + + + + + The initial allocation of Genesis Coins in the Pactus blockchain is distributed as follows:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Genesis Coin Allocation for Pactus
CategoryCoin AllocationPercentage
Treasury21 Million coins50%
Foundation8.4 Million coins20%
VC Allocation6.3 Million coins15%
Team and Operations4.2 Million coins10%
Community2.1 Million coins5%
+ + + How are Genesis Coins allocated in Pactus? + + +
+ + +

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

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

+ How are Treasury coins distributed? +

+
+ + + + + + + Treasury coins are distributed as block rewards to the block proposers. Every 10 seconds, one coin from the Treasury account transfers to the block proposer account. This process is called "coin minting". As a result, the total number of Pactus coins in circulation gradually increases over time as new blocks are added to the blockchain. Every day, 8,640 coins are minted, resulting in approximately 3 million coins being minted annually by the Treasury account. + + + How are Treasury coins distributed? + + + + +
+ + +

+ How will the Support coins be spent? +

+
+ + + + + + + The support accounts are designed to provide financial backing for the project. Initially, Pactus Genesis contained only the Treasury accounts without any Backup or Support accounts. The introduction of support coins was a strategic response to the absence of investors, despite the significant progress of the project.

These coins are allocated in several ways:
    +
  • Community: + This portion will mainly support the community. + As part of this, the participants on Testnets receive initial staking coins to + setup their validator and secure the Mainnet. +
  • +
  • Team and Operations: + Another portion supports the project team. + Team members receive a monthly distribution of these coins, which is estimated to sustain the team for over six years. +
  • +
  • Venture Capital (VC) Allocation: + Another portion is set aside for any potential venture capitalists who + might show interest in investing in the project in the future. +
  • +
  • Foundation: + The foundation coins are reserved for future use, potentially in supporting strong projects that align with Pactus's objectives. +
  • +
+Transparency is a key aspect of this allocation, as all movements of these coins are trackable due to the fully transparent nature of the blockchain. + + + +
+ +
+ +
+
+
+ + معاملة +
+
+ + +

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

خارطة الطريق

+ +
+
✅ المهمة المكتملة
+
🚧 المهمة الجارية
+
⏳ المهمة القادمة
+
+ +
+
+
+ + +
+
+
+
+ + Decentralized Storage Platform + +
+
Q1 2025
+
+
+
+ +
+
+
+
+ + Browser Extension Wallet + +
+
Q4 2024
+
+
+
+ +
+
+
+
+ + Desktop and Mobile Friendly GUI + +
+
July 2024
+
+
+
+ +
+
+
+
+ + CLI tools for controlling Pactus node + +
+
Jun 2024
+
+
+
+ +
+
+
+
+ + First Interactive Block Explorer + +
+
March 2024
+
+
+
+ +
+
+
+
+ + Permanent testnet launch + +
+
February 2024
+
+
+
+ +
+
+
+ +
January 2024
+
+
+
+ +
+
+
+ +
24 January 2024
+
+
+
+ +
+
+
+ +
January 2024
+
+
+
+ +
+
+
+ +
January 2024
+
+
+
+ +
+
+
+ +
January 2024
+
+
+
+ +
+
+
+ +
December 2023
+
+
+
+ +
+
+
+ +
November 2023
+
+
+
+ +
+
+
+ +
October 2023
+
+
+
+ +
+
+
+ +
October 2023
+
+
+
+ +
+
+
+ +
October 2023
+
+
+
+ +
+
+
+ +
August 2023
+
+
+
+ +
+
+
+ +
July 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..b7b2deb95 --- /dev/null +++ b/ar/about/what-is-pactus/index.html @@ -0,0 +1,410 @@ + + + + + + + + + + + + + ما هو بكتوس؟ | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+

ما هو بكتوس؟

+ +
+ +
+
+

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

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

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

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

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

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

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

+ في بكتوس، يمكن للمستخدمين شراء ملف تخزين مخصص يمكن تجديده سنويًا، مما يؤدي إلى تخفيض التكاليف المتعلقة بالتخزين وتنفيذ العقود الذكية. يمكن أن تمهد هذه الميزة الفريدة الطريق لبروتوكولات جديدة في المنصات الموزعة. + +
+
+ +
+ +
+
+
+
+ + + + + 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..309f55ddc --- /dev/null +++ b/ar/assets/css/custom.css @@ -0,0 +1 @@ +:root{--primary-color-light: #021a34;--secondary-color-light: #075f94;--bg-color-light: #edeef0;--bg-color-reverse-light: #021a34;--bg-color-tinted-light: #b0b2b4;--text-color-light: #4c4c4c;--text-color-reverse-light: #edeef0;--text-muted-color-light: #4c4c4c;--link-color-light: #4c4c4c;--link-hover-color-light: #6c6c6c;--primary-color-dark: #edeef0;--secondary-color-dark: #075f94;--bg-color-dark: #14171c;--bg-color-reverse-dark: #edeef0;--bg-color-tinted-dark: #627191;--text-color-dark: #edeef0;--text-color-reverse-dark: #14171c;--text-muted-color-dark: #edeef0;--link-color-dark: #edeef0;--link-hover-color-dark: #ffffff}[data-bs-theme=light]{--primary-color: var(--primary-color-light);--secondary-color: var(--secondary-color-light);--bg-color-tinted: var(--bg-color-tinted-light);--bg-color: var(--bg-color-light);--bg-color-reverse: var(--bg-color-reverse-light);--text-color: var(--text-color-light);--text-color-reverse: var(--text-color-reverse-light);--text-muted-color: var(--text-muted-color-light);--link-color: var(--link-color-light);--link-hover-color: var(--link-hover-color-light)}[data-bs-theme=dark]{--primary-color: var(--primary-color-dark);--secondary-color: var(--secondary-color-dark);--bg-color: var(--bg-color-dark);--bg-color-reverse: var(--bg-color-reverse-dark);--bg-color-tinted: var(--bg-color-tinted-dark);--text-color: var(--text-color-dark);--text-color-reverse: var(--text-color-reverse-dark);--text-muted-color: var(--text-muted-color-dark);--link-color: var(--link-color-dark);--link-hover-color: var(--link-hover-color-dark)}:root,[data-bs-theme=light]{--pa-blue: #0d6efd;--pa-indigo: #6610f2;--pa-purple: #6f42c1;--pa-pink: #d63384;--pa-red: #dc3545;--pa-orange: #fd7e14;--pa-yellow: #ffc107;--pa-green: #198754;--pa-teal: #20c997;--pa-cyan: #0dcaf0;--pa-black: #000;--pa-white: #fff;--pa-gray: #6c757d;--pa-gray-dark: #343a40;--pa-gray-100: #f8f9fa;--pa-gray-200: #e9ecef;--pa-gray-300: #dee2e6;--pa-gray-400: #ced4da;--pa-gray-500: #adb5bd;--pa-gray-600: #6c757d;--pa-gray-700: #495057;--pa-gray-800: #343a40;--pa-gray-900: #212529;--pa-primary: #021a34;--pa-secondary: #075f94;--pa-success: #198754;--pa-info: #0dcaf0;--pa-warning: #ffc107;--pa-danger: #dc3545;--pa-light: #f8f9fa;--pa-dark: #212529;--pa-primary-rgb: 2, 26, 52;--pa-secondary-rgb: 7, 95, 148;--pa-success-rgb: 25, 135, 84;--pa-info-rgb: 13, 202, 240;--pa-warning-rgb: 255, 193, 7;--pa-danger-rgb: 220, 53, 69;--pa-light-rgb: 248, 249, 250;--pa-dark-rgb: 33, 37, 41;--pa-primary-text-emphasis: #010a15;--pa-secondary-text-emphasis: #03263b;--pa-success-text-emphasis: #0a3622;--pa-info-text-emphasis: #055160;--pa-warning-text-emphasis: #664d03;--pa-danger-text-emphasis: #58151c;--pa-light-text-emphasis: #495057;--pa-dark-text-emphasis: #495057;--pa-primary-bg-subtle: #ccd1d6;--pa-secondary-bg-subtle: #cddfea;--pa-success-bg-subtle: #d1e7dd;--pa-info-bg-subtle: #cff4fc;--pa-warning-bg-subtle: #fff3cd;--pa-danger-bg-subtle: #f8d7da;--pa-light-bg-subtle: #fcfcfd;--pa-dark-bg-subtle: #ced4da;--pa-primary-border-subtle: #9aa3ae;--pa-secondary-border-subtle: #9cbfd4;--pa-success-border-subtle: #a3cfbb;--pa-info-border-subtle: #9eeaf9;--pa-warning-border-subtle: #ffe69c;--pa-danger-border-subtle: #f1aeb5;--pa-light-border-subtle: #e9ecef;--pa-dark-border-subtle: #adb5bd;--pa-white-rgb: 255, 255, 255;--pa-black-rgb: 0, 0, 0;--pa-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";--pa-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--pa-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--pa-body-font-family: var(--pa-font-sans-serif);--pa-body-font-size:1rem;--pa-body-font-weight: 400;--pa-body-line-height: 1.5;--pa-body-color: #212529;--pa-body-color-rgb: 33, 37, 41;--pa-body-bg: #fff;--pa-body-bg-rgb: 255, 255, 255;--pa-emphasis-color: #000;--pa-emphasis-color-rgb: 0, 0, 0;--pa-secondary-color: rgba(33, 37, 41, 0.75);--pa-secondary-color-rgb: 33, 37, 41;--pa-secondary-bg: #e9ecef;--pa-secondary-bg-rgb: 233, 236, 239;--pa-tertiary-color: rgba(33, 37, 41, 0.5);--pa-tertiary-color-rgb: 33, 37, 41;--pa-tertiary-bg: #f8f9fa;--pa-tertiary-bg-rgb: 248, 249, 250;--pa-heading-color: inherit;--pa-link-color: #021a34;--pa-link-color-rgb: 2, 26, 52;--pa-link-decoration: underline;--pa-link-hover-color: #02152a;--pa-link-hover-color-rgb: 2, 21, 42;--pa-code-color: #d63384;--pa-highlight-color: #212529;--pa-highlight-bg: #fff3cd;--pa-border-width: 1px;--pa-border-style: solid;--pa-border-color: #dee2e6;--pa-border-color-translucent: rgba(0, 0, 0, 0.175);--pa-border-radius: 0.375rem;--pa-border-radius-sm: 0.25rem;--pa-border-radius-lg: 0.5rem;--pa-border-radius-xl: 1rem;--pa-border-radius-xxl: 2rem;--pa-border-radius-2xl: var(--pa-border-radius-xxl);--pa-border-radius-pill: 50rem;--pa-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--pa-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--pa-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);--pa-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);--pa-focus-ring-width: 0.25rem;--pa-focus-ring-opacity: 0.25;--pa-focus-ring-color: rgba(2, 26, 52, 0.25);--pa-form-valid-color: #198754;--pa-form-valid-border-color: #198754;--pa-form-invalid-color: #dc3545;--pa-form-invalid-border-color: #dc3545}[data-bs-theme=dark]{color-scheme:dark;--pa-body-color: #dee2e6;--pa-body-color-rgb: 222, 226, 230;--pa-body-bg: #212529;--pa-body-bg-rgb: 33, 37, 41;--pa-emphasis-color: #fff;--pa-emphasis-color-rgb: 255, 255, 255;--pa-secondary-color: rgba(222, 226, 230, 0.75);--pa-secondary-color-rgb: 222, 226, 230;--pa-secondary-bg: #343a40;--pa-secondary-bg-rgb: 52, 58, 64;--pa-tertiary-color: rgba(222, 226, 230, 0.5);--pa-tertiary-color-rgb: 222, 226, 230;--pa-tertiary-bg: #2b3035;--pa-tertiary-bg-rgb: 43, 48, 53;--pa-primary-text-emphasis: #677685;--pa-secondary-text-emphasis: #6a9fbf;--pa-success-text-emphasis: #75b798;--pa-info-text-emphasis: #6edff6;--pa-warning-text-emphasis: #ffda6a;--pa-danger-text-emphasis: #ea868f;--pa-light-text-emphasis: #f8f9fa;--pa-dark-text-emphasis: #dee2e6;--pa-primary-bg-subtle: #00050a;--pa-secondary-bg-subtle: #01131e;--pa-success-bg-subtle: #051b11;--pa-info-bg-subtle: #032830;--pa-warning-bg-subtle: #332701;--pa-danger-bg-subtle: #2c0b0e;--pa-light-bg-subtle: #343a40;--pa-dark-bg-subtle: #1a1d20;--pa-primary-border-subtle: #01101f;--pa-secondary-border-subtle: #043959;--pa-success-border-subtle: #0f5132;--pa-info-border-subtle: #087990;--pa-warning-border-subtle: #997404;--pa-danger-border-subtle: #842029;--pa-light-border-subtle: #495057;--pa-dark-border-subtle: #343a40;--pa-heading-color: inherit;--pa-link-color: #677685;--pa-link-hover-color: #85919d;--pa-link-color-rgb: 103, 118, 133;--pa-link-hover-color-rgb: 133, 145, 157;--pa-code-color: #e685b5;--pa-highlight-color: #dee2e6;--pa-highlight-bg: #664d03;--pa-border-color: #495057;--pa-border-color-translucent: rgba(255, 255, 255, 0.15);--pa-form-valid-color: #75b798;--pa-form-valid-border-color: #75b798;--pa-form-invalid-color: #ea868f;--pa-form-invalid-border-color: #ea868f}*,*::before,*::after{box-sizing:border-box}@media(prefers-reduced-motion: no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--pa-body-font-family);font-size:var(--pa-body-font-size);font-weight:var(--pa-body-font-weight);line-height:var(--pa-body-line-height);color:var(--pa-body-color);text-align:var(--pa-body-text-align);background-color:var(--pa-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;border:0;border-top:var(--pa-border-width) solid;opacity:.25}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--pa-heading-color)}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 + 0.9vw)}@media(min-width: 1200px){h2,.h2{font-size:2rem}}h3,.h3{font-size:calc(1.3rem + 0.6vw)}@media(min-width: 1200px){h3,.h3{font-size:1.75rem}}h4,.h4{font-size:calc(1.275rem + 0.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]{text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{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:0.875em}mark,.mark{padding:.1875em;color:var(--pa-highlight-color);background-color:var(--pa-highlight-bg)}sub,sup{position:relative;font-size:0.75em;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}a{color:rgba(var(--pa-link-color-rgb), var(--pa-link-opacity, 1));text-decoration:underline}a:hover{--pa-link-color-rgb: var(--pa-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:var(--pa-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:0.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:0.875em;color:var(--pa-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:0.875em;color:var(--pa-body-bg);background-color:var(--pa-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:var(--pa-secondary-color);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,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}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]: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 + 0.3vw);line-height:inherit}@media(min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::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:0.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:0.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:var(--pa-body-bg);border:var(--pa-border-width) solid var(--pa-border-color);border-radius:var(--pa-border-radius);box-shadow:var(--pa-box-shadow-sm);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:0.875em;color:var(--pa-secondary-color)}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{--pa-gutter-x: 1.5rem;--pa-gutter-y: 0;width:100%;padding-right:calc(var(--pa-gutter-x)*.5);padding-left:calc(var(--pa-gutter-x)*.5);margin-right:auto;margin-left:auto}@media(min-width: 576px){.container-sm,.container{max-width:540px}}@media(min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media(min-width: 1400px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}}:root{--pa-breakpoint-xs: 0;--pa-breakpoint-sm: 576px;--pa-breakpoint-md: 768px;--pa-breakpoint-lg: 992px;--pa-breakpoint-xl: 1200px;--pa-breakpoint-xxl: 1400px}.row{--pa-gutter-x: 1.5rem;--pa-gutter-y: 0;display:flex;flex-wrap:wrap;margin-top:calc(-1*var(--pa-gutter-y));margin-right:calc(-0.5*var(--pa-gutter-x));margin-left:calc(-0.5*var(--pa-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--pa-gutter-x)*.5);padding-left:calc(var(--pa-gutter-x)*.5);margin-top:var(--pa-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.33333333%}.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.66666667%}.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{--pa-gutter-x: 0}.g-0,.gy-0{--pa-gutter-y: 0}.g-1,.gx-1{--pa-gutter-x: 0.25rem}.g-1,.gy-1{--pa-gutter-y: 0.25rem}.g-2,.gx-2{--pa-gutter-x: 0.5rem}.g-2,.gy-2{--pa-gutter-y: 0.5rem}.g-3,.gx-3{--pa-gutter-x: 1rem}.g-3,.gy-3{--pa-gutter-y: 1rem}.g-4,.gx-4{--pa-gutter-x: 1.5rem}.g-4,.gy-4{--pa-gutter-y: 1.5rem}.g-5,.gx-5{--pa-gutter-x: 3rem}.g-5,.gy-5{--pa-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.33333333%}.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.66666667%}.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{--pa-gutter-x: 0}.g-sm-0,.gy-sm-0{--pa-gutter-y: 0}.g-sm-1,.gx-sm-1{--pa-gutter-x: 0.25rem}.g-sm-1,.gy-sm-1{--pa-gutter-y: 0.25rem}.g-sm-2,.gx-sm-2{--pa-gutter-x: 0.5rem}.g-sm-2,.gy-sm-2{--pa-gutter-y: 0.5rem}.g-sm-3,.gx-sm-3{--pa-gutter-x: 1rem}.g-sm-3,.gy-sm-3{--pa-gutter-y: 1rem}.g-sm-4,.gx-sm-4{--pa-gutter-x: 1.5rem}.g-sm-4,.gy-sm-4{--pa-gutter-y: 1.5rem}.g-sm-5,.gx-sm-5{--pa-gutter-x: 3rem}.g-sm-5,.gy-sm-5{--pa-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.33333333%}.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.66666667%}.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{--pa-gutter-x: 0}.g-md-0,.gy-md-0{--pa-gutter-y: 0}.g-md-1,.gx-md-1{--pa-gutter-x: 0.25rem}.g-md-1,.gy-md-1{--pa-gutter-y: 0.25rem}.g-md-2,.gx-md-2{--pa-gutter-x: 0.5rem}.g-md-2,.gy-md-2{--pa-gutter-y: 0.5rem}.g-md-3,.gx-md-3{--pa-gutter-x: 1rem}.g-md-3,.gy-md-3{--pa-gutter-y: 1rem}.g-md-4,.gx-md-4{--pa-gutter-x: 1.5rem}.g-md-4,.gy-md-4{--pa-gutter-y: 1.5rem}.g-md-5,.gx-md-5{--pa-gutter-x: 3rem}.g-md-5,.gy-md-5{--pa-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.33333333%}.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.66666667%}.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{--pa-gutter-x: 0}.g-lg-0,.gy-lg-0{--pa-gutter-y: 0}.g-lg-1,.gx-lg-1{--pa-gutter-x: 0.25rem}.g-lg-1,.gy-lg-1{--pa-gutter-y: 0.25rem}.g-lg-2,.gx-lg-2{--pa-gutter-x: 0.5rem}.g-lg-2,.gy-lg-2{--pa-gutter-y: 0.5rem}.g-lg-3,.gx-lg-3{--pa-gutter-x: 1rem}.g-lg-3,.gy-lg-3{--pa-gutter-y: 1rem}.g-lg-4,.gx-lg-4{--pa-gutter-x: 1.5rem}.g-lg-4,.gy-lg-4{--pa-gutter-y: 1.5rem}.g-lg-5,.gx-lg-5{--pa-gutter-x: 3rem}.g-lg-5,.gy-lg-5{--pa-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.33333333%}.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.66666667%}.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{--pa-gutter-x: 0}.g-xl-0,.gy-xl-0{--pa-gutter-y: 0}.g-xl-1,.gx-xl-1{--pa-gutter-x: 0.25rem}.g-xl-1,.gy-xl-1{--pa-gutter-y: 0.25rem}.g-xl-2,.gx-xl-2{--pa-gutter-x: 0.5rem}.g-xl-2,.gy-xl-2{--pa-gutter-y: 0.5rem}.g-xl-3,.gx-xl-3{--pa-gutter-x: 1rem}.g-xl-3,.gy-xl-3{--pa-gutter-y: 1rem}.g-xl-4,.gx-xl-4{--pa-gutter-x: 1.5rem}.g-xl-4,.gy-xl-4{--pa-gutter-y: 1.5rem}.g-xl-5,.gx-xl-5{--pa-gutter-x: 3rem}.g-xl-5,.gy-xl-5{--pa-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.33333333%}.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.66666667%}.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{--pa-gutter-x: 0}.g-xxl-0,.gy-xxl-0{--pa-gutter-y: 0}.g-xxl-1,.gx-xxl-1{--pa-gutter-x: 0.25rem}.g-xxl-1,.gy-xxl-1{--pa-gutter-y: 0.25rem}.g-xxl-2,.gx-xxl-2{--pa-gutter-x: 0.5rem}.g-xxl-2,.gy-xxl-2{--pa-gutter-y: 0.5rem}.g-xxl-3,.gx-xxl-3{--pa-gutter-x: 1rem}.g-xxl-3,.gy-xxl-3{--pa-gutter-y: 1rem}.g-xxl-4,.gx-xxl-4{--pa-gutter-x: 1.5rem}.g-xxl-4,.gy-xxl-4{--pa-gutter-y: 1.5rem}.g-xxl-5,.gx-xxl-5{--pa-gutter-x: 3rem}.g-xxl-5,.gy-xxl-5{--pa-gutter-y: 3rem}}.table{--pa-table-color-type: initial;--pa-table-bg-type: initial;--pa-table-color-state: initial;--pa-table-bg-state: initial;--pa-table-color: var(--pa-emphasis-color);--pa-table-bg: var(--pa-body-bg);--pa-table-border-color: var(--pa-border-color);--pa-table-accent-bg: transparent;--pa-table-striped-color: var(--pa-emphasis-color);--pa-table-striped-bg: rgba(var(--pa-emphasis-color-rgb), 0.05);--pa-table-active-color: var(--pa-emphasis-color);--pa-table-active-bg: rgba(var(--pa-emphasis-color-rgb), 0.1);--pa-table-hover-color: var(--pa-emphasis-color);--pa-table-hover-bg: rgba(var(--pa-emphasis-color-rgb), 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--pa-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--pa-table-color-state, var(--pa-table-color-type, var(--pa-table-color)));background-color:var(--pa-table-bg);border-bottom-width:var(--pa-border-width);box-shadow:inset 0 0 0 9999px var(--pa-table-bg-state, var(--pa-table-bg-type, var(--pa-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(var(--pa-border-width) * 2) solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:var(--pa-border-width) 0}.table-bordered>:not(caption)>*>*{border-width:0 var(--pa-border-width)}.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)>*{--pa-table-color-type: var(--pa-table-striped-color);--pa-table-bg-type: var(--pa-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(even){--pa-table-color-type: var(--pa-table-striped-color);--pa-table-bg-type: var(--pa-table-striped-bg)}.table-active{--pa-table-color-state: var(--pa-table-active-color);--pa-table-bg-state: var(--pa-table-active-bg)}.table-hover>tbody>tr:hover>*{--pa-table-color-state: var(--pa-table-hover-color);--pa-table-bg-state: var(--pa-table-hover-bg)}.table-primary{--pa-table-color: #000;--pa-table-bg: #ccd1d6;--pa-table-border-color: #a3a7ab;--pa-table-striped-bg: #c2c7cb;--pa-table-striped-color: #000;--pa-table-active-bg: #b8bcc1;--pa-table-active-color: #000;--pa-table-hover-bg: #bdc1c6;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-secondary{--pa-table-color: #000;--pa-table-bg: #cddfea;--pa-table-border-color: #a4b2bb;--pa-table-striped-bg: #c3d4de;--pa-table-striped-color: #000;--pa-table-active-bg: #b9c9d3;--pa-table-active-color: #000;--pa-table-hover-bg: #beced8;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-success{--pa-table-color: #000;--pa-table-bg: #d1e7dd;--pa-table-border-color: #a7b9b1;--pa-table-striped-bg: #c7dbd2;--pa-table-striped-color: #000;--pa-table-active-bg: #bcd0c7;--pa-table-active-color: #000;--pa-table-hover-bg: #c1d6cc;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-info{--pa-table-color: #000;--pa-table-bg: #cff4fc;--pa-table-border-color: #a6c3ca;--pa-table-striped-bg: #c5e8ef;--pa-table-striped-color: #000;--pa-table-active-bg: #badce3;--pa-table-active-color: #000;--pa-table-hover-bg: #bfe2e9;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-warning{--pa-table-color: #000;--pa-table-bg: #fff3cd;--pa-table-border-color: #ccc2a4;--pa-table-striped-bg: #f2e7c3;--pa-table-striped-color: #000;--pa-table-active-bg: #e6dbb9;--pa-table-active-color: #000;--pa-table-hover-bg: #ece1be;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-danger{--pa-table-color: #000;--pa-table-bg: #f8d7da;--pa-table-border-color: #c6acae;--pa-table-striped-bg: #eccccf;--pa-table-striped-color: #000;--pa-table-active-bg: #dfc2c4;--pa-table-active-color: #000;--pa-table-hover-bg: #e5c7ca;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-light{--pa-table-color: #000;--pa-table-bg: #f8f9fa;--pa-table-border-color: #c6c7c8;--pa-table-striped-bg: #ecedee;--pa-table-striped-color: #000;--pa-table-active-bg: #dfe0e1;--pa-table-active-color: #000;--pa-table-hover-bg: #e5e6e7;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-dark{--pa-table-color: #fff;--pa-table-bg: #212529;--pa-table-border-color: #4d5154;--pa-table-striped-bg: #2c3034;--pa-table-striped-color: #fff;--pa-table-active-bg: #373b3e;--pa-table-active-color: #fff;--pa-table-hover-bg: #323539;--pa-table-hover-color: #fff;color:var(--pa-table-color);border-color:var(--pa-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}}.btn{--pa-btn-padding-x: 0.75rem;--pa-btn-padding-y: 0.375rem;--pa-btn-font-family: ;--pa-btn-font-size:1rem;--pa-btn-font-weight: 400;--pa-btn-line-height: 1.5;--pa-btn-color: var(--pa-body-color);--pa-btn-bg: transparent;--pa-btn-border-width: var(--pa-border-width);--pa-btn-border-color: transparent;--pa-btn-border-radius: var(--pa-border-radius);--pa-btn-hover-border-color: transparent;--pa-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);--pa-btn-disabled-opacity: 0.65;--pa-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--pa-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--pa-btn-padding-y) var(--pa-btn-padding-x);font-family:var(--pa-btn-font-family);font-size:var(--pa-btn-font-size);font-weight:var(--pa-btn-font-weight);line-height:var(--pa-btn-line-height);color:var(--pa-btn-color);text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;border:var(--pa-btn-border-width) solid var(--pa-btn-border-color);border-radius:var(--pa-btn-border-radius);background-color:var(--pa-btn-bg);box-shadow:var(--pa-btn-box-shadow);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:hover{color:var(--pa-btn-hover-color);background-color:var(--pa-btn-hover-bg);border-color:var(--pa-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--pa-btn-color);background-color:var(--pa-btn-bg);border-color:var(--pa-btn-border-color)}.btn:focus-visible{color:var(--pa-btn-hover-color);background-color:var(--pa-btn-hover-bg);border-color:var(--pa-btn-hover-border-color);outline:0;box-shadow:var(--pa-btn-box-shadow),var(--pa-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--pa-btn-hover-border-color);outline:0;box-shadow:var(--pa-btn-box-shadow),var(--pa-btn-focus-box-shadow)}.btn-check:checked+.btn,:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--pa-btn-active-color);background-color:var(--pa-btn-active-bg);border-color:var(--pa-btn-active-border-color);box-shadow:var(--pa-btn-active-shadow)}.btn-check:checked+.btn:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible{box-shadow:var(--pa-btn-active-shadow),var(--pa-btn-focus-box-shadow)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{color:var(--pa-btn-disabled-color);pointer-events:none;background-color:var(--pa-btn-disabled-bg);border-color:var(--pa-btn-disabled-border-color);opacity:var(--pa-btn-disabled-opacity);box-shadow:none}.btn-primary{--pa-btn-color: #fff;--pa-btn-bg: #021a34;--pa-btn-border-color: #021a34;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #02162c;--pa-btn-hover-border-color: #02152a;--pa-btn-focus-shadow-rgb: 40, 60, 82;--pa-btn-active-color: #fff;--pa-btn-active-bg: #02152a;--pa-btn-active-border-color: #021427;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #fff;--pa-btn-disabled-bg: #021a34;--pa-btn-disabled-border-color: #021a34}.btn-secondary{--pa-btn-color: #fff;--pa-btn-bg: #075f94;--pa-btn-border-color: #075f94;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #06517e;--pa-btn-hover-border-color: #064c76;--pa-btn-focus-shadow-rgb: 44, 119, 164;--pa-btn-active-color: #fff;--pa-btn-active-bg: #064c76;--pa-btn-active-border-color: #05476f;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #fff;--pa-btn-disabled-bg: #075f94;--pa-btn-disabled-border-color: #075f94}.btn-success{--pa-btn-color: #fff;--pa-btn-bg: #198754;--pa-btn-border-color: #198754;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #157347;--pa-btn-hover-border-color: #146c43;--pa-btn-focus-shadow-rgb: 60, 153, 110;--pa-btn-active-color: #fff;--pa-btn-active-bg: #146c43;--pa-btn-active-border-color: #13653f;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #fff;--pa-btn-disabled-bg: #198754;--pa-btn-disabled-border-color: #198754}.btn-info{--pa-btn-color: #000;--pa-btn-bg: #0dcaf0;--pa-btn-border-color: #0dcaf0;--pa-btn-hover-color: #000;--pa-btn-hover-bg: #31d2f2;--pa-btn-hover-border-color: #25cff2;--pa-btn-focus-shadow-rgb: 11, 172, 204;--pa-btn-active-color: #000;--pa-btn-active-bg: #3dd5f3;--pa-btn-active-border-color: #25cff2;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #000;--pa-btn-disabled-bg: #0dcaf0;--pa-btn-disabled-border-color: #0dcaf0}.btn-warning{--pa-btn-color: #000;--pa-btn-bg: #ffc107;--pa-btn-border-color: #ffc107;--pa-btn-hover-color: #000;--pa-btn-hover-bg: #ffca2c;--pa-btn-hover-border-color: #ffc720;--pa-btn-focus-shadow-rgb: 217, 164, 6;--pa-btn-active-color: #000;--pa-btn-active-bg: #ffcd39;--pa-btn-active-border-color: #ffc720;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #000;--pa-btn-disabled-bg: #ffc107;--pa-btn-disabled-border-color: #ffc107}.btn-danger{--pa-btn-color: #fff;--pa-btn-bg: #dc3545;--pa-btn-border-color: #dc3545;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #bb2d3b;--pa-btn-hover-border-color: #b02a37;--pa-btn-focus-shadow-rgb: 225, 83, 97;--pa-btn-active-color: #fff;--pa-btn-active-bg: #b02a37;--pa-btn-active-border-color: #a52834;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #fff;--pa-btn-disabled-bg: #dc3545;--pa-btn-disabled-border-color: #dc3545}.btn-light{--pa-btn-color: #000;--pa-btn-bg: #f8f9fa;--pa-btn-border-color: #f8f9fa;--pa-btn-hover-color: #000;--pa-btn-hover-bg: #d3d4d5;--pa-btn-hover-border-color: #c6c7c8;--pa-btn-focus-shadow-rgb: 211, 212, 213;--pa-btn-active-color: #000;--pa-btn-active-bg: #c6c7c8;--pa-btn-active-border-color: #babbbc;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #000;--pa-btn-disabled-bg: #f8f9fa;--pa-btn-disabled-border-color: #f8f9fa}.btn-dark{--pa-btn-color: #fff;--pa-btn-bg: #212529;--pa-btn-border-color: #212529;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #424649;--pa-btn-hover-border-color: #373b3e;--pa-btn-focus-shadow-rgb: 66, 70, 73;--pa-btn-active-color: #fff;--pa-btn-active-bg: #4d5154;--pa-btn-active-border-color: #373b3e;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #fff;--pa-btn-disabled-bg: #212529;--pa-btn-disabled-border-color: #212529}.btn-outline-primary{--pa-btn-color: #021a34;--pa-btn-border-color: #021a34;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #021a34;--pa-btn-hover-border-color: #021a34;--pa-btn-focus-shadow-rgb: 2, 26, 52;--pa-btn-active-color: #fff;--pa-btn-active-bg: #021a34;--pa-btn-active-border-color: #021a34;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #021a34;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #021a34;--pa-gradient: none}.btn-outline-secondary{--pa-btn-color: #075f94;--pa-btn-border-color: #075f94;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #075f94;--pa-btn-hover-border-color: #075f94;--pa-btn-focus-shadow-rgb: 7, 95, 148;--pa-btn-active-color: #fff;--pa-btn-active-bg: #075f94;--pa-btn-active-border-color: #075f94;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #075f94;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #075f94;--pa-gradient: none}.btn-outline-success{--pa-btn-color: #198754;--pa-btn-border-color: #198754;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #198754;--pa-btn-hover-border-color: #198754;--pa-btn-focus-shadow-rgb: 25, 135, 84;--pa-btn-active-color: #fff;--pa-btn-active-bg: #198754;--pa-btn-active-border-color: #198754;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #198754;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #198754;--pa-gradient: none}.btn-outline-info{--pa-btn-color: #0dcaf0;--pa-btn-border-color: #0dcaf0;--pa-btn-hover-color: #000;--pa-btn-hover-bg: #0dcaf0;--pa-btn-hover-border-color: #0dcaf0;--pa-btn-focus-shadow-rgb: 13, 202, 240;--pa-btn-active-color: #000;--pa-btn-active-bg: #0dcaf0;--pa-btn-active-border-color: #0dcaf0;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #0dcaf0;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #0dcaf0;--pa-gradient: none}.btn-outline-warning{--pa-btn-color: #ffc107;--pa-btn-border-color: #ffc107;--pa-btn-hover-color: #000;--pa-btn-hover-bg: #ffc107;--pa-btn-hover-border-color: #ffc107;--pa-btn-focus-shadow-rgb: 255, 193, 7;--pa-btn-active-color: #000;--pa-btn-active-bg: #ffc107;--pa-btn-active-border-color: #ffc107;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #ffc107;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #ffc107;--pa-gradient: none}.btn-outline-danger{--pa-btn-color: #dc3545;--pa-btn-border-color: #dc3545;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #dc3545;--pa-btn-hover-border-color: #dc3545;--pa-btn-focus-shadow-rgb: 220, 53, 69;--pa-btn-active-color: #fff;--pa-btn-active-bg: #dc3545;--pa-btn-active-border-color: #dc3545;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #dc3545;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #dc3545;--pa-gradient: none}.btn-outline-light{--pa-btn-color: #f8f9fa;--pa-btn-border-color: #f8f9fa;--pa-btn-hover-color: #000;--pa-btn-hover-bg: #f8f9fa;--pa-btn-hover-border-color: #f8f9fa;--pa-btn-focus-shadow-rgb: 248, 249, 250;--pa-btn-active-color: #000;--pa-btn-active-bg: #f8f9fa;--pa-btn-active-border-color: #f8f9fa;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #f8f9fa;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #f8f9fa;--pa-gradient: none}.btn-outline-dark{--pa-btn-color: #212529;--pa-btn-border-color: #212529;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #212529;--pa-btn-hover-border-color: #212529;--pa-btn-focus-shadow-rgb: 33, 37, 41;--pa-btn-active-color: #fff;--pa-btn-active-bg: #212529;--pa-btn-active-border-color: #212529;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #212529;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #212529;--pa-gradient: none}.btn-link{--pa-btn-font-weight: 400;--pa-btn-color: var(--pa-link-color);--pa-btn-bg: transparent;--pa-btn-border-color: transparent;--pa-btn-hover-color: var(--pa-link-hover-color);--pa-btn-hover-border-color: transparent;--pa-btn-active-color: var(--pa-link-hover-color);--pa-btn-active-border-color: transparent;--pa-btn-disabled-color: #6c757d;--pa-btn-disabled-border-color: transparent;--pa-btn-box-shadow: 0 0 0 #000;--pa-btn-focus-shadow-rgb: 40, 60, 82;text-decoration:underline}.btn-link:focus-visible{color:var(--pa-btn-color)}.btn-link:hover{color:var(--pa-btn-hover-color)}.btn-lg{--pa-btn-padding-y: 0.5rem;--pa-btn-padding-x: 1rem;--pa-btn-font-size:1.25rem;--pa-btn-border-radius: var(--pa-border-radius-lg)}.btn-sm{--pa-btn-padding-y: 0.25rem;--pa-btn-padding-x: 0.5rem;--pa-btn-font-size:0.875rem;--pa-btn-border-radius: var(--pa-border-radius-sm)}.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}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-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 rgba(0,0,0,0);border-bottom:0;border-left:.3em solid rgba(0,0,0,0)}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--pa-dropdown-zindex: 1000;--pa-dropdown-min-width: 10rem;--pa-dropdown-padding-x: 0;--pa-dropdown-padding-y: 0.5rem;--pa-dropdown-spacer: 0.125rem;--pa-dropdown-font-size:1rem;--pa-dropdown-color: var(--pa-body-color);--pa-dropdown-bg: var(--pa-body-bg);--pa-dropdown-border-color: var(--pa-border-color-translucent);--pa-dropdown-border-radius: var(--pa-border-radius);--pa-dropdown-border-width: var(--pa-border-width);--pa-dropdown-inner-border-radius: calc(var(--pa-border-radius) - var(--pa-border-width));--pa-dropdown-divider-bg: var(--pa-border-color-translucent);--pa-dropdown-divider-margin-y: 0.5rem;--pa-dropdown-box-shadow: var(--pa-box-shadow);--pa-dropdown-link-color: var(--pa-body-color);--pa-dropdown-link-hover-color: var(--pa-body-color);--pa-dropdown-link-hover-bg: var(--pa-tertiary-bg);--pa-dropdown-link-active-color: #fff;--pa-dropdown-link-active-bg: #021a34;--pa-dropdown-link-disabled-color: var(--pa-tertiary-color);--pa-dropdown-item-padding-x: 1rem;--pa-dropdown-item-padding-y: 0.25rem;--pa-dropdown-header-color: #6c757d;--pa-dropdown-header-padding-x: 1rem;--pa-dropdown-header-padding-y: 0.5rem;position:absolute;z-index:var(--pa-dropdown-zindex);display:none;min-width:var(--pa-dropdown-min-width);padding:var(--pa-dropdown-padding-y) var(--pa-dropdown-padding-x);margin:0;font-size:var(--pa-dropdown-font-size);color:var(--pa-dropdown-color);text-align:left;list-style:none;background-color:var(--pa-dropdown-bg);background-clip:padding-box;border:var(--pa-dropdown-border-width) solid var(--pa-dropdown-border-color);border-radius:var(--pa-dropdown-border-radius);box-shadow:var(--pa-dropdown-box-shadow)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--pa-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(--pa-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid rgba(0,0,0,0);border-bottom:.3em solid;border-left:.3em solid rgba(0,0,0,0)}.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(--pa-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:0;border-bottom:.3em solid rgba(0,0,0,0);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(--pa-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 rgba(0,0,0,0);border-right:.3em solid;border-bottom:.3em solid rgba(0,0,0,0)}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--pa-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--pa-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--pa-dropdown-item-padding-y) var(--pa-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--pa-dropdown-link-color);text-align:inherit;text-decoration:none;white-space:nowrap;background-color:rgba(0,0,0,0);border:0;border-radius:var(--pa-dropdown-item-border-radius, 0)}.dropdown-item:hover,.dropdown-item:focus{color:var(--pa-dropdown-link-hover-color);background-color:var(--pa-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--pa-dropdown-link-active-color);text-decoration:none;background-color:var(--pa-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--pa-dropdown-link-disabled-color);pointer-events:none;background-color:rgba(0,0,0,0)}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--pa-dropdown-header-padding-y) var(--pa-dropdown-header-padding-x);margin-bottom:0;font-size:0.875rem;color:var(--pa-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--pa-dropdown-item-padding-y) var(--pa-dropdown-item-padding-x);color:var(--pa-dropdown-link-color)}.dropdown-menu-dark{--pa-dropdown-color: #dee2e6;--pa-dropdown-bg: #343a40;--pa-dropdown-border-color: var(--pa-border-color-translucent);--pa-dropdown-box-shadow: ;--pa-dropdown-link-color: #dee2e6;--pa-dropdown-link-hover-color: #fff;--pa-dropdown-divider-bg: var(--pa-border-color-translucent);--pa-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);--pa-dropdown-link-active-color: #fff;--pa-dropdown-link-active-bg: #021a34;--pa-dropdown-link-disabled-color: #adb5bd;--pa-dropdown-header-color: #adb5bd}.nav{--pa-nav-link-padding-x: 1rem;--pa-nav-link-padding-y: 0.5rem;--pa-nav-link-font-weight: ;--pa-nav-link-color: var(--pa-link-color);--pa-nav-link-hover-color: var(--pa-link-hover-color);--pa-nav-link-disabled-color: var(--pa-secondary-color);display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--pa-nav-link-padding-y) var(--pa-nav-link-padding-x);font-size:var(--pa-nav-link-font-size);font-weight:var(--pa-nav-link-font-weight);color:var(--pa-nav-link-color);text-decoration:none;background:none;border:0;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:hover,.nav-link:focus{color:var(--pa-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(2,26,52,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--pa-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--pa-nav-tabs-border-width: var(--pa-border-width);--pa-nav-tabs-border-color: var(--pa-border-color);--pa-nav-tabs-border-radius: var(--pa-border-radius);--pa-nav-tabs-link-hover-border-color: var(--pa-secondary-bg) var(--pa-secondary-bg) var(--pa-border-color);--pa-nav-tabs-link-active-color: var(--pa-emphasis-color);--pa-nav-tabs-link-active-bg: var(--pa-body-bg);--pa-nav-tabs-link-active-border-color: var(--pa-border-color) var(--pa-border-color) var(--pa-body-bg);border-bottom:var(--pa-nav-tabs-border-width) solid var(--pa-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1*var(--pa-nav-tabs-border-width));border:var(--pa-nav-tabs-border-width) solid rgba(0,0,0,0);border-top-left-radius:var(--pa-nav-tabs-border-radius);border-top-right-radius:var(--pa-nav-tabs-border-radius)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--pa-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--pa-nav-tabs-link-active-color);background-color:var(--pa-nav-tabs-link-active-bg);border-color:var(--pa-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1*var(--pa-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--pa-nav-pills-border-radius: var(--pa-border-radius);--pa-nav-pills-link-active-color: #fff;--pa-nav-pills-link-active-bg: #021a34}.nav-pills .nav-link{border-radius:var(--pa-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--pa-nav-pills-link-active-color);background-color:var(--pa-nav-pills-link-active-bg)}.nav-underline{--pa-nav-underline-gap: 1rem;--pa-nav-underline-border-width: 0.125rem;--pa-nav-underline-link-active-color: var(--pa-emphasis-color);gap:var(--pa-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--pa-nav-underline-border-width) solid rgba(0,0,0,0)}.nav-underline .nav-link:hover,.nav-underline .nav-link:focus{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--pa-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{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{--pa-navbar-padding-x: 0;--pa-navbar-padding-y: 0.5rem;--pa-navbar-color: rgba(var(--pa-emphasis-color-rgb), 0.65);--pa-navbar-hover-color: rgba(var(--pa-emphasis-color-rgb), 0.8);--pa-navbar-disabled-color: rgba(var(--pa-emphasis-color-rgb), 0.3);--pa-navbar-active-color: rgba(var(--pa-emphasis-color-rgb), 1);--pa-navbar-brand-padding-y: 0.3125rem;--pa-navbar-brand-margin-end: 1rem;--pa-navbar-brand-font-size: 1.25rem;--pa-navbar-brand-color: rgba(var(--pa-emphasis-color-rgb), 1);--pa-navbar-brand-hover-color: rgba(var(--pa-emphasis-color-rgb), 1);--pa-navbar-nav-link-padding-x: 0.5rem;--pa-navbar-toggler-padding-y: 0.25rem;--pa-navbar-toggler-padding-x: 0.75rem;--pa-navbar-toggler-font-size: 1.25rem;--pa-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%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--pa-navbar-toggler-border-color: rgba(var(--pa-emphasis-color-rgb), 0.15);--pa-navbar-toggler-border-radius: var(--pa-border-radius);--pa-navbar-toggler-focus-width: 0.25rem;--pa-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(--pa-navbar-padding-y) var(--pa-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--pa-navbar-brand-padding-y);padding-bottom:var(--pa-navbar-brand-padding-y);margin-right:var(--pa-navbar-brand-margin-end);font-size:var(--pa-navbar-brand-font-size);color:var(--pa-navbar-brand-color);text-decoration:none;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--pa-navbar-brand-hover-color)}.navbar-nav{--pa-nav-link-padding-x: 0;--pa-nav-link-padding-y: 0.5rem;--pa-nav-link-font-weight: ;--pa-nav-link-color: var(--pa-navbar-color);--pa-nav-link-hover-color: var(--pa-navbar-hover-color);--pa-nav-link-disabled-color: var(--pa-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--pa-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--pa-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--pa-navbar-active-color)}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:var(--pa-navbar-toggler-padding-y) var(--pa-navbar-toggler-padding-x);font-size:var(--pa-navbar-toggler-font-size);line-height:1;color:var(--pa-navbar-color);background-color:rgba(0,0,0,0);border:var(--pa-border-width) solid var(--pa-navbar-toggler-border-color);border-radius:var(--pa-navbar-toggler-border-radius);transition:var(--pa-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(--pa-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--pa-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--pa-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(--pa-navbar-nav-link-padding-x);padding-left:var(--pa-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:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;box-shadow:none;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(--pa-navbar-nav-link-padding-x);padding-left:var(--pa-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:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;box-shadow:none;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(--pa-navbar-nav-link-padding-x);padding-left:var(--pa-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:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;box-shadow:none;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(--pa-navbar-nav-link-padding-x);padding-left:var(--pa-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:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;box-shadow:none;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(--pa-navbar-nav-link-padding-x);padding-left:var(--pa-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:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;box-shadow:none;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(--pa-navbar-nav-link-padding-x);padding-left:var(--pa-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:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;box-shadow:none;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,.navbar[data-bs-theme=dark]{--pa-navbar-color: rgba(255, 255, 255, 0.55);--pa-navbar-hover-color: rgba(255, 255, 255, 0.75);--pa-navbar-disabled-color: rgba(255, 255, 255, 0.25);--pa-navbar-active-color: #fff;--pa-navbar-brand-color: #fff;--pa-navbar-brand-hover-color: #fff;--pa-navbar-toggler-border-color: rgba(255, 255, 255, 0.1);--pa-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")}[data-bs-theme=dark] .navbar-toggler-icon{--pa-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")}.badge{--pa-badge-padding-x: 0.65em;--pa-badge-padding-y: 0.35em;--pa-badge-font-size:0.75em;--pa-badge-font-weight: 700;--pa-badge-color: #fff;--pa-badge-border-radius: var(--pa-border-radius);display:inline-block;padding:var(--pa-badge-padding-y) var(--pa-badge-padding-x);font-size:var(--pa-badge-font-size);font-weight:var(--pa-badge-font-weight);line-height:1;color:var(--pa-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--pa-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--pa-alert-bg: transparent;--pa-alert-padding-x: 1rem;--pa-alert-padding-y: 1rem;--pa-alert-margin-bottom: 1rem;--pa-alert-color: inherit;--pa-alert-border-color: transparent;--pa-alert-border: var(--pa-border-width) solid var(--pa-alert-border-color);--pa-alert-border-radius: var(--pa-border-radius);--pa-alert-link-color: inherit;position:relative;padding:var(--pa-alert-padding-y) var(--pa-alert-padding-x);margin-bottom:var(--pa-alert-margin-bottom);color:var(--pa-alert-color);background-color:var(--pa-alert-bg);border:var(--pa-alert-border);border-radius:var(--pa-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--pa-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{--pa-alert-color: var(--pa-primary-text-emphasis);--pa-alert-bg: var(--pa-primary-bg-subtle);--pa-alert-border-color: var(--pa-primary-border-subtle);--pa-alert-link-color: var(--pa-primary-text-emphasis)}.alert-secondary{--pa-alert-color: var(--pa-secondary-text-emphasis);--pa-alert-bg: var(--pa-secondary-bg-subtle);--pa-alert-border-color: var(--pa-secondary-border-subtle);--pa-alert-link-color: var(--pa-secondary-text-emphasis)}.alert-success{--pa-alert-color: var(--pa-success-text-emphasis);--pa-alert-bg: var(--pa-success-bg-subtle);--pa-alert-border-color: var(--pa-success-border-subtle);--pa-alert-link-color: var(--pa-success-text-emphasis)}.alert-info{--pa-alert-color: var(--pa-info-text-emphasis);--pa-alert-bg: var(--pa-info-bg-subtle);--pa-alert-border-color: var(--pa-info-border-subtle);--pa-alert-link-color: var(--pa-info-text-emphasis)}.alert-warning{--pa-alert-color: var(--pa-warning-text-emphasis);--pa-alert-bg: var(--pa-warning-bg-subtle);--pa-alert-border-color: var(--pa-warning-border-subtle);--pa-alert-link-color: var(--pa-warning-text-emphasis)}.alert-danger{--pa-alert-color: var(--pa-danger-text-emphasis);--pa-alert-bg: var(--pa-danger-bg-subtle);--pa-alert-border-color: var(--pa-danger-border-subtle);--pa-alert-link-color: var(--pa-danger-text-emphasis)}.alert-light{--pa-alert-color: var(--pa-light-text-emphasis);--pa-alert-bg: var(--pa-light-bg-subtle);--pa-alert-border-color: var(--pa-light-border-subtle);--pa-alert-link-color: var(--pa-light-text-emphasis)}.alert-dark{--pa-alert-color: var(--pa-dark-text-emphasis);--pa-alert-bg: var(--pa-dark-bg-subtle);--pa-alert-border-color: var(--pa-dark-border-subtle);--pa-alert-link-color: var(--pa-dark-text-emphasis)}.clearfix::after{display:block;clear:both;content:""}.text-bg-primary{color:#fff !important;background-color:RGBA(var(--pa-primary-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-secondary{color:#fff !important;background-color:RGBA(var(--pa-secondary-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-success{color:#fff !important;background-color:RGBA(var(--pa-success-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-info{color:#000 !important;background-color:RGBA(var(--pa-info-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-warning{color:#000 !important;background-color:RGBA(var(--pa-warning-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-danger{color:#fff !important;background-color:RGBA(var(--pa-danger-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-light{color:#000 !important;background-color:RGBA(var(--pa-light-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-dark{color:#fff !important;background-color:RGBA(var(--pa-dark-rgb), var(--pa-bg-opacity, 1)) !important}.link-primary{color:RGBA(var(--pa-primary-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-primary-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-primary:hover,.link-primary:focus{color:RGBA(2, 21, 42, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(2, 21, 42, var(--pa-link-underline-opacity, 1)) !important}.link-secondary{color:RGBA(var(--pa-secondary-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-secondary-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-secondary:hover,.link-secondary:focus{color:RGBA(6, 76, 118, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(6, 76, 118, var(--pa-link-underline-opacity, 1)) !important}.link-success{color:RGBA(var(--pa-success-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-success-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-success:hover,.link-success:focus{color:RGBA(20, 108, 67, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(20, 108, 67, var(--pa-link-underline-opacity, 1)) !important}.link-info{color:RGBA(var(--pa-info-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-info-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-info:hover,.link-info:focus{color:RGBA(61, 213, 243, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(61, 213, 243, var(--pa-link-underline-opacity, 1)) !important}.link-warning{color:RGBA(var(--pa-warning-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-warning-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-warning:hover,.link-warning:focus{color:RGBA(255, 205, 57, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(255, 205, 57, var(--pa-link-underline-opacity, 1)) !important}.link-danger{color:RGBA(var(--pa-danger-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-danger-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-danger:hover,.link-danger:focus{color:RGBA(176, 42, 55, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(176, 42, 55, var(--pa-link-underline-opacity, 1)) !important}.link-light{color:RGBA(var(--pa-light-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-light-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-light:hover,.link-light:focus{color:RGBA(249, 250, 251, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(249, 250, 251, var(--pa-link-underline-opacity, 1)) !important}.link-dark{color:RGBA(var(--pa-dark-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-dark-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-dark:hover,.link-dark:focus{color:RGBA(26, 30, 33, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(26, 30, 33, var(--pa-link-underline-opacity, 1)) !important}.link-body-emphasis{color:RGBA(var(--pa-emphasis-color-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-emphasis-color-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-body-emphasis:hover,.link-body-emphasis:focus{color:RGBA(var(--pa-emphasis-color-rgb), var(--pa-link-opacity, 0.75)) !important;text-decoration-color:RGBA(var(--pa-emphasis-color-rgb), var(--pa-link-underline-opacity, 0.75)) !important}.focus-ring:focus{outline:0;box-shadow:var(--pa-focus-ring-x, 0) var(--pa-focus-ring-y, 0) var(--pa-focus-ring-blur, 0) var(--pa-focus-ring-width) var(--pa-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;text-decoration-color:rgba(var(--pa-link-color-rgb), var(--pa-link-opacity, 0.5));text-underline-offset:.25em;backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media(prefers-reduced-motion: reduce){.icon-link>.bi{transition:none}}.icon-link-hover:hover>.bi,.icon-link-hover:focus-visible>.bi{transform:var(--pa-icon-link-transform, translate3d(0.25em, 0, 0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--pa-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--pa-aspect-ratio: 100%}.ratio-4x3{--pa-aspect-ratio: 75%}.ratio-16x9{--pa-aspect-ratio: 56.25%}.ratio-21x9{--pa-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:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media(min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{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){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}.visually-hidden:not(caption),.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption){position:absolute !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:var(--pa-border-width);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}.object-fit-contain{object-fit:contain !important}.object-fit-cover{object-fit:cover !important}.object-fit-fill{object-fit:fill !important}.object-fit-scale{object-fit:scale-down !important}.object-fit-none{object-fit: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}.overflow-x-auto{overflow-x:auto !important}.overflow-x-hidden{overflow-x:hidden !important}.overflow-x-visible{overflow-x:visible !important}.overflow-x-scroll{overflow-x:scroll !important}.overflow-y-auto{overflow-y:auto !important}.overflow-y-hidden{overflow-y:hidden !important}.overflow-y-visible{overflow-y:visible !important}.overflow-y-scroll{overflow-y: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-inline-grid{display:inline-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:var(--pa-box-shadow) !important}.shadow-sm{box-shadow:var(--pa-box-shadow-sm) !important}.shadow-lg{box-shadow:var(--pa-box-shadow-lg) !important}.shadow-none{box-shadow:none !important}.focus-ring-primary{--pa-focus-ring-color: rgba(var(--pa-primary-rgb), var(--pa-focus-ring-opacity))}.focus-ring-secondary{--pa-focus-ring-color: rgba(var(--pa-secondary-rgb), var(--pa-focus-ring-opacity))}.focus-ring-success{--pa-focus-ring-color: rgba(var(--pa-success-rgb), var(--pa-focus-ring-opacity))}.focus-ring-info{--pa-focus-ring-color: rgba(var(--pa-info-rgb), var(--pa-focus-ring-opacity))}.focus-ring-warning{--pa-focus-ring-color: rgba(var(--pa-warning-rgb), var(--pa-focus-ring-opacity))}.focus-ring-danger{--pa-focus-ring-color: rgba(var(--pa-danger-rgb), var(--pa-focus-ring-opacity))}.focus-ring-light{--pa-focus-ring-color: rgba(var(--pa-light-rgb), var(--pa-focus-ring-opacity))}.focus-ring-dark{--pa-focus-ring-color: rgba(var(--pa-dark-rgb), var(--pa-focus-ring-opacity))}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{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(--pa-border-width) var(--pa-border-style) var(--pa-border-color) !important}.border-0{border:0 !important}.border-top{border-top:var(--pa-border-width) var(--pa-border-style) var(--pa-border-color) !important}.border-top-0{border-top:0 !important}.border-end{border-right:var(--pa-border-width) var(--pa-border-style) var(--pa-border-color) !important}.border-end-0{border-right:0 !important}.border-bottom{border-bottom:var(--pa-border-width) var(--pa-border-style) var(--pa-border-color) !important}.border-bottom-0{border-bottom:0 !important}.border-start{border-left:var(--pa-border-width) var(--pa-border-style) var(--pa-border-color) !important}.border-start-0{border-left:0 !important}.border-primary{--pa-border-opacity: 1;border-color:rgba(var(--pa-primary-rgb), var(--pa-border-opacity)) !important}.border-secondary{--pa-border-opacity: 1;border-color:rgba(var(--pa-secondary-rgb), var(--pa-border-opacity)) !important}.border-success{--pa-border-opacity: 1;border-color:rgba(var(--pa-success-rgb), var(--pa-border-opacity)) !important}.border-info{--pa-border-opacity: 1;border-color:rgba(var(--pa-info-rgb), var(--pa-border-opacity)) !important}.border-warning{--pa-border-opacity: 1;border-color:rgba(var(--pa-warning-rgb), var(--pa-border-opacity)) !important}.border-danger{--pa-border-opacity: 1;border-color:rgba(var(--pa-danger-rgb), var(--pa-border-opacity)) !important}.border-light{--pa-border-opacity: 1;border-color:rgba(var(--pa-light-rgb), var(--pa-border-opacity)) !important}.border-dark{--pa-border-opacity: 1;border-color:rgba(var(--pa-dark-rgb), var(--pa-border-opacity)) !important}.border-black{--pa-border-opacity: 1;border-color:rgba(var(--pa-black-rgb), var(--pa-border-opacity)) !important}.border-white{--pa-border-opacity: 1;border-color:rgba(var(--pa-white-rgb), var(--pa-border-opacity)) !important}.border-primary-subtle{border-color:var(--pa-primary-border-subtle) !important}.border-secondary-subtle{border-color:var(--pa-secondary-border-subtle) !important}.border-success-subtle{border-color:var(--pa-success-border-subtle) !important}.border-info-subtle{border-color:var(--pa-info-border-subtle) !important}.border-warning-subtle{border-color:var(--pa-warning-border-subtle) !important}.border-danger-subtle{border-color:var(--pa-danger-border-subtle) !important}.border-light-subtle{border-color:var(--pa-light-border-subtle) !important}.border-dark-subtle{border-color:var(--pa-dark-border-subtle) !important}.border-1{border-width:1px !important}.border-2{border-width:2px !important}.border-3{border-width:3px !important}.border-4{border-width:4px !important}.border-5{border-width:5px !important}.border-opacity-10{--pa-border-opacity: 0.1}.border-opacity-25{--pa-border-opacity: 0.25}.border-opacity-50{--pa-border-opacity: 0.5}.border-opacity-75{--pa-border-opacity: 0.75}.border-opacity-100{--pa-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}.row-gap-0{row-gap:0 !important}.row-gap-1{row-gap:.25rem !important}.row-gap-2{row-gap:.5rem !important}.row-gap-3{row-gap:1rem !important}.row-gap-4{row-gap:1.5rem !important}.row-gap-5{row-gap:3rem !important}.column-gap-0{column-gap:0 !important}.column-gap-1{column-gap:.25rem !important}.column-gap-2{column-gap:.5rem !important}.column-gap-3{column-gap:1rem !important}.column-gap-4{column-gap:1.5rem !important}.column-gap-5{column-gap:3rem !important}.font-monospace{font-family:var(--pa-font-monospace) !important}.fs-1{font-size:calc(1.375rem + 1.5vw) !important}.fs-2{font-size:calc(1.325rem + 0.9vw) !important}.fs-3{font-size:calc(1.3rem + 0.6vw) !important}.fs-4{font-size:calc(1.275rem + 0.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-lighter{font-weight:lighter !important}.fw-light{font-weight:300 !important}.fw-normal{font-weight:400 !important}.fw-medium{font-weight:500 !important}.fw-semibold{font-weight:600 !important}.fw-bold{font-weight:700 !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{--pa-text-opacity: 1;color:rgba(var(--pa-primary-rgb), var(--pa-text-opacity)) !important}.text-secondary{--pa-text-opacity: 1;color:rgba(var(--pa-secondary-rgb), var(--pa-text-opacity)) !important}.text-success{--pa-text-opacity: 1;color:rgba(var(--pa-success-rgb), var(--pa-text-opacity)) !important}.text-info{--pa-text-opacity: 1;color:rgba(var(--pa-info-rgb), var(--pa-text-opacity)) !important}.text-warning{--pa-text-opacity: 1;color:rgba(var(--pa-warning-rgb), var(--pa-text-opacity)) !important}.text-danger{--pa-text-opacity: 1;color:rgba(var(--pa-danger-rgb), var(--pa-text-opacity)) !important}.text-light{--pa-text-opacity: 1;color:rgba(var(--pa-light-rgb), var(--pa-text-opacity)) !important}.text-dark{--pa-text-opacity: 1;color:rgba(var(--pa-dark-rgb), var(--pa-text-opacity)) !important}.text-black{--pa-text-opacity: 1;color:rgba(var(--pa-black-rgb), var(--pa-text-opacity)) !important}.text-white{--pa-text-opacity: 1;color:rgba(var(--pa-white-rgb), var(--pa-text-opacity)) !important}.text-body{--pa-text-opacity: 1;color:rgba(var(--pa-body-color-rgb), var(--pa-text-opacity)) !important}.text-muted{--pa-text-opacity: 1;color:var(--pa-secondary-color) !important}.text-black-50{--pa-text-opacity: 1;color:rgba(0,0,0,.5) !important}.text-white-50{--pa-text-opacity: 1;color:rgba(255,255,255,.5) !important}.text-body-secondary{--pa-text-opacity: 1;color:var(--pa-secondary-color) !important}.text-body-tertiary{--pa-text-opacity: 1;color:var(--pa-tertiary-color) !important}.text-body-emphasis{--pa-text-opacity: 1;color:var(--pa-emphasis-color) !important}.text-reset{--pa-text-opacity: 1;color:inherit !important}.text-opacity-25{--pa-text-opacity: 0.25}.text-opacity-50{--pa-text-opacity: 0.5}.text-opacity-75{--pa-text-opacity: 0.75}.text-opacity-100{--pa-text-opacity: 1}.text-primary-emphasis{color:var(--pa-primary-text-emphasis) !important}.text-secondary-emphasis{color:var(--pa-secondary-text-emphasis) !important}.text-success-emphasis{color:var(--pa-success-text-emphasis) !important}.text-info-emphasis{color:var(--pa-info-text-emphasis) !important}.text-warning-emphasis{color:var(--pa-warning-text-emphasis) !important}.text-danger-emphasis{color:var(--pa-danger-text-emphasis) !important}.text-light-emphasis{color:var(--pa-light-text-emphasis) !important}.text-dark-emphasis{color:var(--pa-dark-text-emphasis) !important}.link-opacity-10{--pa-link-opacity: 0.1}.link-opacity-10-hover:hover{--pa-link-opacity: 0.1}.link-opacity-25{--pa-link-opacity: 0.25}.link-opacity-25-hover:hover{--pa-link-opacity: 0.25}.link-opacity-50{--pa-link-opacity: 0.5}.link-opacity-50-hover:hover{--pa-link-opacity: 0.5}.link-opacity-75{--pa-link-opacity: 0.75}.link-opacity-75-hover:hover{--pa-link-opacity: 0.75}.link-opacity-100{--pa-link-opacity: 1}.link-opacity-100-hover:hover{--pa-link-opacity: 1}.link-offset-1{text-underline-offset:.125em !important}.link-offset-1-hover:hover{text-underline-offset:.125em !important}.link-offset-2{text-underline-offset:.25em !important}.link-offset-2-hover:hover{text-underline-offset:.25em !important}.link-offset-3{text-underline-offset:.375em !important}.link-offset-3-hover:hover{text-underline-offset:.375em !important}.link-underline-primary{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-primary-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-secondary{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-secondary-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-success{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-success-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-info{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-info-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-warning{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-warning-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-danger{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-danger-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-light{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-light-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-dark{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-dark-rgb), var(--pa-link-underline-opacity)) !important}.link-underline{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-link-color-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-underline-opacity-0{--pa-link-underline-opacity: 0}.link-underline-opacity-0-hover:hover{--pa-link-underline-opacity: 0}.link-underline-opacity-10{--pa-link-underline-opacity: 0.1}.link-underline-opacity-10-hover:hover{--pa-link-underline-opacity: 0.1}.link-underline-opacity-25{--pa-link-underline-opacity: 0.25}.link-underline-opacity-25-hover:hover{--pa-link-underline-opacity: 0.25}.link-underline-opacity-50{--pa-link-underline-opacity: 0.5}.link-underline-opacity-50-hover:hover{--pa-link-underline-opacity: 0.5}.link-underline-opacity-75{--pa-link-underline-opacity: 0.75}.link-underline-opacity-75-hover:hover{--pa-link-underline-opacity: 0.75}.link-underline-opacity-100{--pa-link-underline-opacity: 1}.link-underline-opacity-100-hover:hover{--pa-link-underline-opacity: 1}.bg-primary{--pa-bg-opacity: 1;background-color:rgba(var(--pa-primary-rgb), var(--pa-bg-opacity)) !important}.bg-secondary{--pa-bg-opacity: 1;background-color:rgba(var(--pa-secondary-rgb), var(--pa-bg-opacity)) !important}.bg-success{--pa-bg-opacity: 1;background-color:rgba(var(--pa-success-rgb), var(--pa-bg-opacity)) !important}.bg-info{--pa-bg-opacity: 1;background-color:rgba(var(--pa-info-rgb), var(--pa-bg-opacity)) !important}.bg-warning{--pa-bg-opacity: 1;background-color:rgba(var(--pa-warning-rgb), var(--pa-bg-opacity)) !important}.bg-danger{--pa-bg-opacity: 1;background-color:rgba(var(--pa-danger-rgb), var(--pa-bg-opacity)) !important}.bg-light{--pa-bg-opacity: 1;background-color:rgba(var(--pa-light-rgb), var(--pa-bg-opacity)) !important}.bg-dark{--pa-bg-opacity: 1;background-color:rgba(var(--pa-dark-rgb), var(--pa-bg-opacity)) !important}.bg-black{--pa-bg-opacity: 1;background-color:rgba(var(--pa-black-rgb), var(--pa-bg-opacity)) !important}.bg-white{--pa-bg-opacity: 1;background-color:rgba(var(--pa-white-rgb), var(--pa-bg-opacity)) !important}.bg-body{--pa-bg-opacity: 1;background-color:rgba(var(--pa-body-bg-rgb), var(--pa-bg-opacity)) !important}.bg-transparent{--pa-bg-opacity: 1;background-color:rgba(0,0,0,0) !important}.bg-body-secondary{--pa-bg-opacity: 1;background-color:rgba(var(--pa-secondary-bg-rgb), var(--pa-bg-opacity)) !important}.bg-body-tertiary{--pa-bg-opacity: 1;background-color:rgba(var(--pa-tertiary-bg-rgb), var(--pa-bg-opacity)) !important}.bg-opacity-10{--pa-bg-opacity: 0.1}.bg-opacity-25{--pa-bg-opacity: 0.25}.bg-opacity-50{--pa-bg-opacity: 0.5}.bg-opacity-75{--pa-bg-opacity: 0.75}.bg-opacity-100{--pa-bg-opacity: 1}.bg-primary-subtle{background-color:var(--pa-primary-bg-subtle) !important}.bg-secondary-subtle{background-color:var(--pa-secondary-bg-subtle) !important}.bg-success-subtle{background-color:var(--pa-success-bg-subtle) !important}.bg-info-subtle{background-color:var(--pa-info-bg-subtle) !important}.bg-warning-subtle{background-color:var(--pa-warning-bg-subtle) !important}.bg-danger-subtle{background-color:var(--pa-danger-bg-subtle) !important}.bg-light-subtle{background-color:var(--pa-light-bg-subtle) !important}.bg-dark-subtle{background-color:var(--pa-dark-bg-subtle) !important}.bg-gradient{background-image:var(--pa-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:var(--pa-border-radius) !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:var(--pa-border-radius-sm) !important}.rounded-2{border-radius:var(--pa-border-radius) !important}.rounded-3{border-radius:var(--pa-border-radius-lg) !important}.rounded-4{border-radius:var(--pa-border-radius-xl) !important}.rounded-5{border-radius:var(--pa-border-radius-xxl) !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:var(--pa-border-radius-pill) !important}.rounded-top{border-top-left-radius:var(--pa-border-radius) !important;border-top-right-radius:var(--pa-border-radius) !important}.rounded-top-0{border-top-left-radius:0 !important;border-top-right-radius:0 !important}.rounded-top-1{border-top-left-radius:var(--pa-border-radius-sm) !important;border-top-right-radius:var(--pa-border-radius-sm) !important}.rounded-top-2{border-top-left-radius:var(--pa-border-radius) !important;border-top-right-radius:var(--pa-border-radius) !important}.rounded-top-3{border-top-left-radius:var(--pa-border-radius-lg) !important;border-top-right-radius:var(--pa-border-radius-lg) !important}.rounded-top-4{border-top-left-radius:var(--pa-border-radius-xl) !important;border-top-right-radius:var(--pa-border-radius-xl) !important}.rounded-top-5{border-top-left-radius:var(--pa-border-radius-xxl) !important;border-top-right-radius:var(--pa-border-radius-xxl) !important}.rounded-top-circle{border-top-left-radius:50% !important;border-top-right-radius:50% !important}.rounded-top-pill{border-top-left-radius:var(--pa-border-radius-pill) !important;border-top-right-radius:var(--pa-border-radius-pill) !important}.rounded-end{border-top-right-radius:var(--pa-border-radius) !important;border-bottom-right-radius:var(--pa-border-radius) !important}.rounded-end-0{border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.rounded-end-1{border-top-right-radius:var(--pa-border-radius-sm) !important;border-bottom-right-radius:var(--pa-border-radius-sm) !important}.rounded-end-2{border-top-right-radius:var(--pa-border-radius) !important;border-bottom-right-radius:var(--pa-border-radius) !important}.rounded-end-3{border-top-right-radius:var(--pa-border-radius-lg) !important;border-bottom-right-radius:var(--pa-border-radius-lg) !important}.rounded-end-4{border-top-right-radius:var(--pa-border-radius-xl) !important;border-bottom-right-radius:var(--pa-border-radius-xl) !important}.rounded-end-5{border-top-right-radius:var(--pa-border-radius-xxl) !important;border-bottom-right-radius:var(--pa-border-radius-xxl) !important}.rounded-end-circle{border-top-right-radius:50% !important;border-bottom-right-radius:50% !important}.rounded-end-pill{border-top-right-radius:var(--pa-border-radius-pill) !important;border-bottom-right-radius:var(--pa-border-radius-pill) !important}.rounded-bottom{border-bottom-right-radius:var(--pa-border-radius) !important;border-bottom-left-radius:var(--pa-border-radius) !important}.rounded-bottom-0{border-bottom-right-radius:0 !important;border-bottom-left-radius:0 !important}.rounded-bottom-1{border-bottom-right-radius:var(--pa-border-radius-sm) !important;border-bottom-left-radius:var(--pa-border-radius-sm) !important}.rounded-bottom-2{border-bottom-right-radius:var(--pa-border-radius) !important;border-bottom-left-radius:var(--pa-border-radius) !important}.rounded-bottom-3{border-bottom-right-radius:var(--pa-border-radius-lg) !important;border-bottom-left-radius:var(--pa-border-radius-lg) !important}.rounded-bottom-4{border-bottom-right-radius:var(--pa-border-radius-xl) !important;border-bottom-left-radius:var(--pa-border-radius-xl) !important}.rounded-bottom-5{border-bottom-right-radius:var(--pa-border-radius-xxl) !important;border-bottom-left-radius:var(--pa-border-radius-xxl) !important}.rounded-bottom-circle{border-bottom-right-radius:50% !important;border-bottom-left-radius:50% !important}.rounded-bottom-pill{border-bottom-right-radius:var(--pa-border-radius-pill) !important;border-bottom-left-radius:var(--pa-border-radius-pill) !important}.rounded-start{border-bottom-left-radius:var(--pa-border-radius) !important;border-top-left-radius:var(--pa-border-radius) !important}.rounded-start-0{border-bottom-left-radius:0 !important;border-top-left-radius:0 !important}.rounded-start-1{border-bottom-left-radius:var(--pa-border-radius-sm) !important;border-top-left-radius:var(--pa-border-radius-sm) !important}.rounded-start-2{border-bottom-left-radius:var(--pa-border-radius) !important;border-top-left-radius:var(--pa-border-radius) !important}.rounded-start-3{border-bottom-left-radius:var(--pa-border-radius-lg) !important;border-top-left-radius:var(--pa-border-radius-lg) !important}.rounded-start-4{border-bottom-left-radius:var(--pa-border-radius-xl) !important;border-top-left-radius:var(--pa-border-radius-xl) !important}.rounded-start-5{border-bottom-left-radius:var(--pa-border-radius-xxl) !important;border-top-left-radius:var(--pa-border-radius-xxl) !important}.rounded-start-circle{border-bottom-left-radius:50% !important;border-top-left-radius:50% !important}.rounded-start-pill{border-bottom-left-radius:var(--pa-border-radius-pill) !important;border-top-left-radius:var(--pa-border-radius-pill) !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}.z-n1{z-index:-1 !important}.z-0{z-index:0 !important}.z-1{z-index:1 !important}.z-2{z-index:2 !important}.z-3{z-index:3 !important}@media(min-width: 576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float:none !important}.object-fit-sm-contain{object-fit:contain !important}.object-fit-sm-cover{object-fit:cover !important}.object-fit-sm-fill{object-fit:fill !important}.object-fit-sm-scale{object-fit:scale-down !important}.object-fit-sm-none{object-fit: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-inline-grid{display:inline-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}.row-gap-sm-0{row-gap:0 !important}.row-gap-sm-1{row-gap:.25rem !important}.row-gap-sm-2{row-gap:.5rem !important}.row-gap-sm-3{row-gap:1rem !important}.row-gap-sm-4{row-gap:1.5rem !important}.row-gap-sm-5{row-gap:3rem !important}.column-gap-sm-0{column-gap:0 !important}.column-gap-sm-1{column-gap:.25rem !important}.column-gap-sm-2{column-gap:.5rem !important}.column-gap-sm-3{column-gap:1rem !important}.column-gap-sm-4{column-gap:1.5rem !important}.column-gap-sm-5{column-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}.object-fit-md-contain{object-fit:contain !important}.object-fit-md-cover{object-fit:cover !important}.object-fit-md-fill{object-fit:fill !important}.object-fit-md-scale{object-fit:scale-down !important}.object-fit-md-none{object-fit: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-inline-grid{display:inline-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}.row-gap-md-0{row-gap:0 !important}.row-gap-md-1{row-gap:.25rem !important}.row-gap-md-2{row-gap:.5rem !important}.row-gap-md-3{row-gap:1rem !important}.row-gap-md-4{row-gap:1.5rem !important}.row-gap-md-5{row-gap:3rem !important}.column-gap-md-0{column-gap:0 !important}.column-gap-md-1{column-gap:.25rem !important}.column-gap-md-2{column-gap:.5rem !important}.column-gap-md-3{column-gap:1rem !important}.column-gap-md-4{column-gap:1.5rem !important}.column-gap-md-5{column-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}.object-fit-lg-contain{object-fit:contain !important}.object-fit-lg-cover{object-fit:cover !important}.object-fit-lg-fill{object-fit:fill !important}.object-fit-lg-scale{object-fit:scale-down !important}.object-fit-lg-none{object-fit: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-inline-grid{display:inline-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}.row-gap-lg-0{row-gap:0 !important}.row-gap-lg-1{row-gap:.25rem !important}.row-gap-lg-2{row-gap:.5rem !important}.row-gap-lg-3{row-gap:1rem !important}.row-gap-lg-4{row-gap:1.5rem !important}.row-gap-lg-5{row-gap:3rem !important}.column-gap-lg-0{column-gap:0 !important}.column-gap-lg-1{column-gap:.25rem !important}.column-gap-lg-2{column-gap:.5rem !important}.column-gap-lg-3{column-gap:1rem !important}.column-gap-lg-4{column-gap:1.5rem !important}.column-gap-lg-5{column-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}.object-fit-xl-contain{object-fit:contain !important}.object-fit-xl-cover{object-fit:cover !important}.object-fit-xl-fill{object-fit:fill !important}.object-fit-xl-scale{object-fit:scale-down !important}.object-fit-xl-none{object-fit: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-inline-grid{display:inline-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}.row-gap-xl-0{row-gap:0 !important}.row-gap-xl-1{row-gap:.25rem !important}.row-gap-xl-2{row-gap:.5rem !important}.row-gap-xl-3{row-gap:1rem !important}.row-gap-xl-4{row-gap:1.5rem !important}.row-gap-xl-5{row-gap:3rem !important}.column-gap-xl-0{column-gap:0 !important}.column-gap-xl-1{column-gap:.25rem !important}.column-gap-xl-2{column-gap:.5rem !important}.column-gap-xl-3{column-gap:1rem !important}.column-gap-xl-4{column-gap:1.5rem !important}.column-gap-xl-5{column-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}.object-fit-xxl-contain{object-fit:contain !important}.object-fit-xxl-cover{object-fit:cover !important}.object-fit-xxl-fill{object-fit:fill !important}.object-fit-xxl-scale{object-fit:scale-down !important}.object-fit-xxl-none{object-fit: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-inline-grid{display:inline-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}.row-gap-xxl-0{row-gap:0 !important}.row-gap-xxl-1{row-gap:.25rem !important}.row-gap-xxl-2{row-gap:.5rem !important}.row-gap-xxl-3{row-gap:1rem !important}.row-gap-xxl-4{row-gap:1.5rem !important}.row-gap-xxl-5{row-gap:3rem !important}.column-gap-xxl-0{column-gap:0 !important}.column-gap-xxl-1{column-gap:.25rem !important}.column-gap-xxl-2{column-gap:.5rem !important}.column-gap-xxl-3{column-gap:1rem !important}.column-gap-xxl-4{column-gap:1.5rem !important}.column-gap-xxl-5{column-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-inline-grid{display:inline-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}}body{font-family:"Open Sans",sans-serif;font-weight:400;color:var(--text-color);background-color:var(--bg-color);max-width:1200px;margin:0 auto}.btn-primary{color:var(--text-color-reverse);background-color:var(--primary-color);border-color:var(--primary-color)}.btn-outline-primary{color:var(--primary-color);background:none;border-color:var(--primary-color)}.btn-outline-primary:hover{background-color:var(--primary-color);color:var(--text-color-reverse)}.btn-secondary{color:#fff;background-color:var(--secondary-color);border-color:var(--secondary-color)}.navbar .nav-top{height:86px}.navbar .fixed-menu{width:220px}.navbar .logo img{width:200px}a{text-decoration:underline;color:var(--link-color)}a:hover{color:var(--link-hover-color)}a:active{color:var(--link-color)}h1,.h1,h2,.h2{font-weight:500;line-height:1.25;padding-bottom:12px;padding-top:14px}h1,.h1{font-weight:600}h3,.h3{padding-top:16px}.motto .title{font-weight:600;font-size:32px;padding-top:36px}.motto .motto{font-weight:500;font-size:20px}.btn-fixed{border-width:2px;border-style:solid;width:220px;height:46px;text-transform:uppercase;font-weight:700;border-radius:5px 5px 5px 5px;vertical-align:middle;line-height:42px;padding:0;margin:16px;box-shadow:0 .125rem .25rem rgba(0,0,0,.075)}.pactus-video video{max-width:100%;width:100%;margin-left:auto;margin-right:auto;display:block}.highlighter-rouge .highlight pre{background-color:#0d1117;padding:32px 12px 12px 12px;color:#ccc;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:#0d1117 !important}.nav-tabs .nav-link{border-width:0 !important}.nav-tabs .nav-link:not(.active):hover{color:#fff !important;background-color:gray !important}.nav-tabs .active{color:#fff !important;background-color:#0d1117 !important}table thead tr th{font-weight:700;background-color:var(--bg-color) !important}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:var(--primary-color);color:var(--text-color-reverse)}.footer .section{font-size:1.75rem;font-weight:500;line-height:1.25;padding-bottom:20px}.footer li{padding-bottom:8px}.footer.anchor a{color:var(--text-color-reverse)}.footer.anchor a:link{color:var(--text-color-reverse);background-color:rgba(0,0,0,0);text-decoration:none}.footer.anchor a:hover{color:var(--text-color-reverse)}.footer .legal{color:var(--text-color-reverse);font-size:12px}.community img{margin:4px}.community_ran img{margin:4px}#btn-back-to-top{background-color:var(--primary-color);color:var(--bg-color);position:fixed;bottom:20px;right:20px;display:none}.edit-bar{padding-top:30px}.edit-bar .edit-btn,.edit-bar .edit-btn>a:hover{color:var(--text-color);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}:root{--primary-color-light: #021a34;--secondary-color-light: #075f94;--bg-color-light: #edeef0;--bg-color-reverse-light: #021a34;--bg-color-tinted-light: #b0b2b4;--text-color-light: #4c4c4c;--text-color-reverse-light: #edeef0;--text-muted-color-light: #4c4c4c;--link-color-light: #4c4c4c;--link-hover-color-light: #6c6c6c;--primary-color-dark: #edeef0;--secondary-color-dark: #075f94;--bg-color-dark: #14171c;--bg-color-reverse-dark: #edeef0;--bg-color-tinted-dark: #627191;--text-color-dark: #edeef0;--text-color-reverse-dark: #14171c;--text-muted-color-dark: #edeef0;--link-color-dark: #edeef0;--link-hover-color-dark: #ffffff}[data-bs-theme=light]{--primary-color: var(--primary-color-light);--secondary-color: var(--secondary-color-light);--bg-color-tinted: var(--bg-color-tinted-light);--bg-color: var(--bg-color-light);--bg-color-reverse: var(--bg-color-reverse-light);--text-color: var(--text-color-light);--text-color-reverse: var(--text-color-reverse-light);--text-muted-color: var(--text-muted-color-light);--link-color: var(--link-color-light);--link-hover-color: var(--link-hover-color-light)}[data-bs-theme=dark]{--primary-color: var(--primary-color-dark);--secondary-color: var(--secondary-color-dark);--bg-color: var(--bg-color-dark);--bg-color-reverse: var(--bg-color-reverse-dark);--bg-color-tinted: var(--bg-color-tinted-dark);--text-color: var(--text-color-dark);--text-color-reverse: var(--text-color-reverse-dark);--text-muted-color: var(--text-muted-color-dark);--link-color: var(--link-color-dark);--link-hover-color: var(--link-hover-color-dark)}.faq h3,.faq .h3{margin-top:20px;padding-top:16px;border-top:1px solid var(--primary-color)}.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}.faq .read_more{padding-top:12px}:root{--primary-color-light: #021a34;--secondary-color-light: #075f94;--bg-color-light: #edeef0;--bg-color-reverse-light: #021a34;--bg-color-tinted-light: #b0b2b4;--text-color-light: #4c4c4c;--text-color-reverse-light: #edeef0;--text-muted-color-light: #4c4c4c;--link-color-light: #4c4c4c;--link-hover-color-light: #6c6c6c;--primary-color-dark: #edeef0;--secondary-color-dark: #075f94;--bg-color-dark: #14171c;--bg-color-reverse-dark: #edeef0;--bg-color-tinted-dark: #627191;--text-color-dark: #edeef0;--text-color-reverse-dark: #14171c;--text-muted-color-dark: #edeef0;--link-color-dark: #edeef0;--link-hover-color-dark: #ffffff}[data-bs-theme=light]{--primary-color: var(--primary-color-light);--secondary-color: var(--secondary-color-light);--bg-color-tinted: var(--bg-color-tinted-light);--bg-color: var(--bg-color-light);--bg-color-reverse: var(--bg-color-reverse-light);--text-color: var(--text-color-light);--text-color-reverse: var(--text-color-reverse-light);--text-muted-color: var(--text-muted-color-light);--link-color: var(--link-color-light);--link-hover-color: var(--link-hover-color-light)}[data-bs-theme=dark]{--primary-color: var(--primary-color-dark);--secondary-color: var(--secondary-color-dark);--bg-color: var(--bg-color-dark);--bg-color-reverse: var(--bg-color-reverse-dark);--bg-color-tinted: var(--bg-color-tinted-dark);--text-color: var(--text-color-dark);--text-color-reverse: var(--text-color-reverse-dark);--text-muted-color: var(--text-muted-color-dark);--link-color: var(--link-color-dark);--link-hover-color: var(--link-hover-color-dark)}.toc .btn,.toc a{color:var(--text-color)}.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:var(--bg-color)}.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:var(--bg-color)}.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;width:50%}.timeline-card .card{border:1px solid rgba(0,0,0,.175);border-radius:5px;background-color:#eee;color:#4c4c4c}.timeline-card .card a{color:#4c4c4c}.timeline-card .card .text-muted{color:#898b8d !important}.timeline-card .card-title{padding-bottom:12px;font-size:1.1rem;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-color:#eee;box-sizing:border-box;transform:rotate(45deg) translate(-50%);top:34px;z-index:0;right:33px;border-right:1px solid rgba(0,0,0,.175);border-top:1px solid rgba(0,0,0,.175)}.timeline-card.right::before{content:"";position:absolute;height:20px;width:20px;background-color:#eee !important;box-sizing:border-box;transform:rotate(45deg) translate(-50%);top:33px;z-index:0;left:48px;border-left:1px solid rgba(0,0,0,.175);border-bottom: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:77px !important}.timeline-card.left::after,.timeline-card.right::after{left:8px !important}.timeline-card.left::before{border-right:none;border-top:none;border-left:1px solid rgba(0,0,0,.175);border-bottom:1px solid rgba(0,0,0,.175)}.timeline-card.right::before{right:auto}.timeline-card.right{left:0%}}:root{--primary-color-light: #021a34;--secondary-color-light: #075f94;--bg-color-light: #edeef0;--bg-color-reverse-light: #021a34;--bg-color-tinted-light: #b0b2b4;--text-color-light: #4c4c4c;--text-color-reverse-light: #edeef0;--text-muted-color-light: #4c4c4c;--link-color-light: #4c4c4c;--link-hover-color-light: #6c6c6c;--primary-color-dark: #edeef0;--secondary-color-dark: #075f94;--bg-color-dark: #14171c;--bg-color-reverse-dark: #edeef0;--bg-color-tinted-dark: #627191;--text-color-dark: #edeef0;--text-color-reverse-dark: #14171c;--text-muted-color-dark: #edeef0;--link-color-dark: #edeef0;--link-hover-color-dark: #ffffff}[data-bs-theme=light]{--primary-color: var(--primary-color-light);--secondary-color: var(--secondary-color-light);--bg-color-tinted: var(--bg-color-tinted-light);--bg-color: var(--bg-color-light);--bg-color-reverse: var(--bg-color-reverse-light);--text-color: var(--text-color-light);--text-color-reverse: var(--text-color-reverse-light);--text-muted-color: var(--text-muted-color-light);--link-color: var(--link-color-light);--link-hover-color: var(--link-hover-color-light)}[data-bs-theme=dark]{--primary-color: var(--primary-color-dark);--secondary-color: var(--secondary-color-dark);--bg-color: var(--bg-color-dark);--bg-color-reverse: var(--bg-color-reverse-dark);--bg-color-tinted: var(--bg-color-tinted-dark);--text-color: var(--text-color-dark);--text-color-reverse: var(--text-color-reverse-dark);--text-muted-color: var(--text-muted-color-dark);--link-color: var(--link-color-dark);--link-hover-color: var(--link-hover-color-dark)}.learn h2,.learn .h2{border-top:1px solid var(--primary-color)}[data-bs-theme=dark] blockquote{background:#14171c}[data-bs-theme=dark] .toc .btn-section::before{--svg-color: var(--text)}[data-bs-theme=dark] .fa-linux{color:#fff}/*# 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..a7da8066e --- /dev/null +++ b/ar/assets/css/custom.css.map @@ -0,0 +1 @@ +{"version":3,"sourceRoot":"","sources":["../../_sass/_vars.scss","../../../node_modules/bootstrap/scss/_root.scss","../../../node_modules/bootstrap/scss/vendor/_rfs.scss","../../../node_modules/bootstrap/scss/mixins/_color-mode.scss","../../../node_modules/bootstrap/scss/_reboot.scss","../../../node_modules/bootstrap/scss/_variables.scss","../../../node_modules/bootstrap/scss/mixins/_border-radius.scss","../../../node_modules/bootstrap/scss/_type.scss","../../../node_modules/bootstrap/scss/mixins/_lists.scss","../../../node_modules/bootstrap/scss/_images.scss","../../../node_modules/bootstrap/scss/mixins/_image.scss","../../../node_modules/bootstrap/scss/mixins/_box-shadow.scss","../../../node_modules/bootstrap/scss/_containers.scss","../../../node_modules/bootstrap/scss/mixins/_container.scss","../../../node_modules/bootstrap/scss/mixins/_breakpoints.scss","../../../node_modules/bootstrap/scss/_grid.scss","../../../node_modules/bootstrap/scss/mixins/_grid.scss","../../../node_modules/bootstrap/scss/_tables.scss","../../../node_modules/bootstrap/scss/mixins/_table-variants.scss","../../../node_modules/bootstrap/scss/_buttons.scss","../../../node_modules/bootstrap/scss/mixins/_gradients.scss","../../../node_modules/bootstrap/scss/mixins/_transition.scss","../../../node_modules/bootstrap/scss/mixins/_buttons.scss","../../../node_modules/bootstrap/scss/_transitions.scss","../../../node_modules/bootstrap/scss/_dropdown.scss","../../../node_modules/bootstrap/scss/mixins/_caret.scss","../../../node_modules/bootstrap/scss/_nav.scss","../../../node_modules/bootstrap/scss/_navbar.scss","../../../node_modules/bootstrap/scss/_badge.scss","../../../node_modules/bootstrap/scss/_alert.scss","../../../node_modules/bootstrap/scss/mixins/_clearfix.scss","../../../node_modules/bootstrap/scss/helpers/_color-bg.scss","../../../node_modules/bootstrap/scss/helpers/_colored-links.scss","../../../node_modules/bootstrap/scss/helpers/_focus-ring.scss","../../../node_modules/bootstrap/scss/helpers/_icon-link.scss","../../../node_modules/bootstrap/scss/helpers/_ratio.scss","../../../node_modules/bootstrap/scss/helpers/_position.scss","../../../node_modules/bootstrap/scss/helpers/_stacks.scss","../../../node_modules/bootstrap/scss/helpers/_visually-hidden.scss","../../../node_modules/bootstrap/scss/mixins/_visually-hidden.scss","../../../node_modules/bootstrap/scss/helpers/_stretched-link.scss","../../../node_modules/bootstrap/scss/helpers/_text-truncation.scss","../../../node_modules/bootstrap/scss/mixins/_text-truncate.scss","../../../node_modules/bootstrap/scss/helpers/_vr.scss","../../../node_modules/bootstrap/scss/mixins/_utilities.scss","../../../node_modules/bootstrap/scss/utilities/_api.scss","../../_sass/_styles.scss","../../_sass/_hexdump.scss","../../_sass/_faq.scss","../../_sass/_toc.scss","../../_sass/_roadmap.scss","../../_sass/_learn.scss","../../_sass/dark_mode.scss"],"names":[],"mappings":"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,WLuQM,gBKvQN,WLgQM,iCK5PJ,YFynBkB,IExnBlB,YFwmB0B,IHzgB1B,0BKpGF,WLuQM,kBKvQN,WLgQM,iCK5PJ,YFynBkB,IExnBlB,YFwmB0B,IHzgB1B,0BKpGF,WLuQM,gBKvQN,WLgQM,iCK5PJ,YFynBkB,IExnBlB,YFwmB0B,IHzgB1B,0BKpGF,WLuQM,kBKvQN,WLgQM,iCK5PJ,YFynBkB,IExnBlB,YFwmB0B,IHzgB1B,0BKpGF,WLuQM,gBKvQN,WLgQM,iCK5PJ,YFynBkB,IExnBlB,YFwmB0B,IHzgB1B,0BKpGF,WLuQM,kBK/OR,eCvDE,eACA,gBD2DF,aC5DE,eACA,gBD8DF,kBACE,qBAEA,mCACE,aFsoB0B,ME5nB9B,YL8MM,UALI,QKvMR,yBAIF,YACE,cFiUO,KH1HH,UALI,QK/LR,wBACE,gBAIJ,mBACE,iBACA,cFuTO,KH1HH,UALI,QKtLR,MFtFS,QEwFT,2BACE,aEhGJ,WCIE,eAGA,YDDF,eACE,QJ6jDkC,OI5jDlC,iBJ6jDkC,kBI5jDlC,2DHGE,sCKLE,WARW,wBDKf,eAGA,YDcF,QAEE,qBAGF,YACE,oBACA,cAGF,gBPyPM,UALI,QOlPR,MJgjDkC,0BOllDlC,mGCHA,sBACA,iBACA,WACA,0CACA,yCACA,kBACA,iBCsDE,yBF5CE,yBACE,UPkee,OSvbnB,yBF5CE,uCACE,UPkee,OSvbnB,yBF5CE,qDACE,UPkee,OSvbnB,0BF5CE,mEACE,UPkee,QSvbnB,0BF5CE,kFACE,UPkee,QUlfvB,MAEI,2JAKF,KCNA,sBACA,iBACA,aACA,eAEA,uCACA,2CACA,0CDEE,OCOF,cACA,WACA,eACA,0CACA,yCACA,8BA+CI,KACE,YAGF,iBApCJ,cACA,WAcA,cACE,cACA,WAFF,cACE,cACA,UAFF,cACE,cACA,mBAFF,cACE,cACA,UAFF,cACE,cACA,UAFF,cACE,cACA,mBA+BE,UAhDJ,cACA,WAqDQ,OAhEN,cACA,kBA+DM,OAhEN,cACA,mBA+DM,OAhEN,cACA,UA+DM,OAhEN,cACA,mBA+DM,OAhEN,cACA,mBA+DM,OAhEN,cACA,UA+DM,OAhE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AEE,sBAPF,mBAEE,oBAGF,mBAEE,oBAPF,mBAEE,sBAGF,mBAEE,sBAPF,mBAEE,oBAGF,mBAEE,qBCrHV,OAEE,+BACA,4BACA,gCACA,6BAEA,2CACA,iCACA,gDACA,kCACA,mDACA,gEACA,kDACA,8DACA,iDACA,+DAEA,WACA,cZkYO,KYjYP,eZusB4B,IYtsB5B,0CAOA,yBACE,oBAEA,qFACA,oCACA,oBZ+sB0B,uBY9sB1B,2GAGF,aACE,uBAGF,aACE,sBAIJ,qBACE,+DAOF,aACE,iBAUA,4BACE,sBAeF,gCACE,sCAGA,kCACE,sCAOJ,oCACE,sBAGF,qCACE,mBAUF,2CACE,qDACA,+CAMF,yDACE,qDACA,+CAQJ,cACE,qDACA,+CAQA,8BACE,oDACA,8CC5IF,eAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,iBAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,eAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,YAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,eAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,cAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,aAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,YAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CDiJA,kBACE,gBACA,iCH3FF,4BGyFA,qBACE,gBACA,kCH3FF,4BGyFA,qBACE,gBACA,kCH3FF,4BGyFA,qBACE,gBACA,kCH3FF,6BGyFA,qBACE,gBACA,kCH3FF,6BGyFA,sBACE,gBACA,kCEnKN,KAEE,4BACA,6BACA,uBjBuRI,mBALI,KiBhRR,0BACA,0BACA,qCACA,yBACA,8CACA,mCACA,gDACA,yCACA,6FACA,gCACA,kFAGA,qBACA,wDACA,sCjBsQI,UALI,wBiB/PR,sCACA,sCACA,0BACA,kBACA,qBAEA,sBACA,eACA,iBACA,mEbjBE,0CcfF,iBDkCqB,iBRxBjB,WARW,yBUUX,WFwBJ,mHEpBI,uCFhBN,KEiBQ,iBFqBN,WACE,gCAEA,wCACA,8CAGF,sBAEE,0BACA,kCACA,wCAGF,mBACE,gCCrDF,iBDsDuB,uBACrB,8CACA,UAGE,mEAMJ,8BACE,8CACA,UAGE,mEAMJ,mGAKE,iCACA,yCAGA,+CR3EE,WARW,4BQsFb,yKAGI,sEAON,mDAGE,mCACA,oBACA,2CAEA,iDACA,uCRhGE,WARW,KQoHf,aGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,sCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,eGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,wCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,aGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,wCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,UGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,wCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,aGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,uCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,YGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,uCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,WGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,yCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,UGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,sCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHmHA,qBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,qCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,uBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,sCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,qBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,uCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,kBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,wCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,qBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,uCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,oBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,uCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,mBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,yCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,kBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,sCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBHsGF,UACE,0BACA,qCACA,yBACA,mCACA,iDACA,yCACA,kDACA,0CACA,iCACA,4CACA,gCACA,sCAEA,gBduRwC,Uc7QxC,wBACE,0BAGF,gBACE,gCAWJ,QGxIE,2BACA,yBpB8NI,mBALI,QoBvNR,mDHyIF,QG5IE,4BACA,2BpB8NI,mBALI,SoBvNR,mDCnEF,MFgBM,WEfJ,oBFmBI,uCEpBN,MFqBQ,iBElBN,iBACE,UAMF,qBACE,aAIJ,YACE,SACA,gBFDI,WEEJ,iBFEI,uCELN,YFMQ,iBEDN,gCACE,QACA,YFNE,WEOF,gBFHE,uEACE,iBGpBR,sEAME,kBAGF,iBACE,mBCwBE,wBACE,qBACA,YpB6hBwB,OoB5hBxB,epB2hBwB,OoB1hBxB,WArCJ,sBACA,sCACA,gBACA,qCA0DE,8BACE,cD9CN,eAEE,2BACA,+BACA,2BACA,gCACA,+BtBuQI,wBALI,KsBhQR,0CACA,oCACA,+DACA,qDACA,mDACA,0FACA,6DACA,uCACA,+CACA,+CACA,qDACA,mDACA,sCACA,sCACA,4DACA,mCACA,sCACA,oCACA,qCACA,uCAGA,kBACA,kCACA,aACA,uCACA,kEACA,StB0OI,UALI,6BsBnOR,+BACA,gBACA,gBACA,uCACA,4BACA,6ElBzCE,+CKLE,WARW,8Ba0Df,+BACE,SACA,OACA,qCAwBA,qBACE,qBAEA,qCACE,WACA,OAIJ,mBACE,mBAEA,mCACE,QACA,UV1CJ,yBU4BA,wBACE,qBAEA,wCACE,WACA,OAIJ,sBACE,mBAEA,sCACE,QACA,WV1CJ,yBU4BA,wBACE,qBAEA,wCACE,WACA,OAIJ,sBACE,mBAEA,sCACE,QACA,WV1CJ,yBU4BA,wBACE,qBAEA,wCACE,WACA,OAIJ,sBACE,mBAEA,sCACE,QACA,WV1CJ,0BU4BA,wBACE,qBAEA,wCACE,WACA,OAIJ,sBACE,mBAEA,sCACE,QACA,WV1CJ,0BU4BA,yBACE,qBAEA,yCACE,WACA,OAIJ,uBACE,mBAEA,uCACE,QACA,WAUN,uCACE,SACA,YACA,aACA,wCCpFA,gCACE,qBACA,YpB6hBwB,OoB5hBxB,epB2hBwB,OoB1hBxB,WA9BJ,aACA,sCACA,yBACA,qCAmDE,sCACE,cDgEJ,wCACE,MACA,WACA,UACA,aACA,sCClGA,iCACE,qBACA,YpB6hBwB,OoB5hBxB,epB2hBwB,OoB1hBxB,WAvBJ,oCACA,eACA,uCACA,uBA4CE,uCACE,cD0EF,iCACE,iBAMJ,0CACE,MACA,WACA,UACA,aACA,uCCnHA,mCACE,qBACA,YpB6hBwB,OoB5hBxB,epB2hBwB,OoB1hBxB,WAWA,mCACE,aAGF,oCACE,qBACA,apB0gBsB,OoBzgBtB,epBwgBsB,OoBvgBtB,WAnCN,oCACA,wBACA,uCAsCE,yCACE,cD2FF,oCACE,iBAON,kBACE,SACA,6CACA,gBACA,mDACA,UAMF,eACE,cACA,WACA,4EACA,WACA,YnByb4B,ImBxb5B,oCACA,mBACA,qBACA,mBACA,+BACA,SlBtKE,uDkByKF,0CAEE,0CJ1LF,iBI4LuB,iCAGvB,4CAEE,2CACA,qBJlMF,iBImMuB,kCAGvB,gDAEE,6CACA,oBACA,+BAMJ,oBACE,cAIF,iBACE,cACA,gFACA,gBtBmEI,UALI,SsB5DR,sCACA,mBAIF,oBACE,cACA,4EACA,oCAIF,oBAEE,6BACA,0BACA,+DACA,2BACA,kCACA,qCACA,6DACA,uDACA,sCACA,sCACA,2CACA,oCElPF,KAEE,8BACA,gCAEA,4BACA,0CACA,sDACA,wDAGA,aACA,eACA,eACA,gBACA,gBAGF,UACE,cACA,kExBsQI,UALI,6BwB/PR,2CACA,+BACA,qBACA,gBACA,SLfI,WKgBJ,uFLZI,uCKGN,ULFQ,iBKaN,gCAEE,qCAIF,wBACE,UACA,WrBkhBoB,+BqB9gBtB,sCAEE,wCACA,oBACA,eAQJ,UAEE,mDACA,mDACA,qDACA,4GACA,0DACA,gDACA,wGAGA,oFAEA,oBACE,uDACA,2DpB7CA,wDACA,yDoB+CA,oDAGE,kBACA,wDAIJ,8DAEE,2CACA,mDACA,yDAGF,yBAEE,oDpBjEA,yBACA,0BoB2EJ,WAEE,sDACA,uCACA,uCAGA,qBpB5FE,gDoBgGF,uDAEE,4CNjHF,iBMkHuB,mCASzB,eAEE,6BACA,0CACA,+DAGA,gCAEA,yBACE,gBACA,eACA,uEAEA,8DAEE,iCAIJ,+DAEE,YrB0d0B,IqBzd1B,gDACA,iCAUF,wCAEE,cACA,kBAKF,kDAEE,aACA,YACA,kBAMF,iEACE,WAUF,uBACE,aAEF,qBACE,cC7LJ,QAEE,yBACA,8BACA,4DACA,iEACA,oEACA,gEACA,uCACA,mCACA,qCACA,+DACA,qEACA,uCACA,uCACA,uCACA,uCACA,4QACA,2EACA,2DACA,yCACA,6DAGA,kBACA,aACA,eACA,mBACA,8BACA,8DAMA,2JACE,aACA,kBACA,mBACA,8BAoBJ,cACE,6CACA,gDACA,+CzB4NI,UALI,iCyBrNR,mCACA,qBACA,mBAEA,wCAEE,yCAUJ,YAEE,2BACA,gCAEA,4BACA,4CACA,wDACA,8DAGA,aACA,sBACA,eACA,gBACA,gBAGE,wDAEE,oCAIJ,2BACE,gBASJ,aACE,YtB8gCkC,MsB7gClC,etB6gCkC,MsB5gClC,6BAEA,yDAGE,oCAaJ,iBACE,gBACA,YAGA,mBAIF,gBACE,8EzByII,UALI,mCyBlIR,cACA,6BACA,+BACA,0ErBxIE,qDeHE,WM6IJ,oCNzII,uCMiIN,gBNhIQ,iBM0IN,sBACE,qBAGF,sBACE,qBACA,UACA,sDAMJ,qBACE,qBACA,YACA,aACA,sBACA,kDACA,4BACA,2BACA,qBAGF,mBACE,yCACA,gBb1HE,yBasIA,kBAEI,iBACA,2BAEA,8BACE,mBAEA,6CACE,kBAGF,wCACE,kDACA,iDAIJ,qCACE,iBAGF,mCACE,wBACA,gBAGF,kCACE,aAGF,6BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0BhBhOJ,WARW,KUUX,WMgOI,KAGA,+CACE,aAGF,6CACE,aACA,YACA,UACA,oBb5LR,yBasIA,kBAEI,iBACA,2BAEA,8BACE,mBAEA,6CACE,kBAGF,wCACE,kDACA,iDAIJ,qCACE,iBAGF,mCACE,wBACA,gBAGF,kCACE,aAGF,6BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0BhBhOJ,WARW,KUUX,WMgOI,KAGA,+CACE,aAGF,6CACE,aACA,YACA,UACA,oBb5LR,yBasIA,kBAEI,iBACA,2BAEA,8BACE,mBAEA,6CACE,kBAGF,wCACE,kDACA,iDAIJ,qCACE,iBAGF,mCACE,wBACA,gBAGF,kCACE,aAGF,6BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0BhBhOJ,WARW,KUUX,WMgOI,KAGA,+CACE,aAGF,6CACE,aACA,YACA,UACA,oBb5LR,0BasIA,kBAEI,iBACA,2BAEA,8BACE,mBAEA,6CACE,kBAGF,wCACE,kDACA,iDAIJ,qCACE,iBAGF,mCACE,wBACA,gBAGF,kCACE,aAGF,6BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0BhBhOJ,WARW,KUUX,WMgOI,KAGA,+CACE,aAGF,6CACE,aACA,YACA,UACA,oBb5LR,0BasIA,mBAEI,iBACA,2BAEA,+BACE,mBAEA,8CACE,kBAGF,yCACE,kDACA,iDAIJ,sCACE,iBAGF,oCACE,wBACA,gBAGF,mCACE,aAGF,8BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0BhBhOJ,WARW,KUUX,WMgOI,KAGA,gDACE,aAGF,8CACE,aACA,YACA,UACA,oBAtDR,eAEI,iBACA,2BAEA,2BACE,mBAEA,0CACE,kBAGF,qCACE,kDACA,iDAIJ,kCACE,iBAGF,gCACE,wBACA,gBAGF,+BACE,aAGF,0BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0BhBhOJ,WARW,KUUX,WMgOI,KAGA,4CACE,aAGF,0CACE,aACA,YACA,UACA,mBAiBZ,yCAGE,6CACA,mDACA,sDACA,+BACA,8BACA,oCACA,2DACA,+QAME,0CACE,+QCxRN,OAEE,6BACA,6B1BuRI,qBALI,O0BhRR,4BACA,uBACA,kDAGA,qBACA,4D1B+QI,UALI,0B0BxQR,wCACA,cACA,4BACA,kBACA,mBACA,wBtBJE,4CsBSF,aACE,aAKJ,YACE,kBACA,SChCF,OAEE,2BACA,2BACA,2BACA,+BACA,0BACA,qCACA,6EACA,kDACA,+BAGA,kBACA,4DACA,4CACA,4BACA,oCACA,8BvBHE,4CuBQJ,eAEE,cAIF,YACE,YxB6kB4B,IwB5kB5B,iCAQF,mBACE,cxBo+C8B,KwBj+C9B,8BACE,kBACA,MACA,QACA,UACA,qBAQF,eACE,kDACA,2CACA,yDACA,uDAJF,iBACE,oDACA,6CACA,2DACA,yDAJF,eACE,kDACA,2CACA,yDACA,uDAJF,YACE,+CACA,wCACA,sDACA,oDAJF,eACE,kDACA,2CACA,yDACA,uDAJF,cACE,iDACA,0CACA,wDACA,sDAJF,aACE,gDACA,yCACA,uDACA,qDAJF,YACE,+CACA,wCACA,sDACA,oDC9DF,iBACE,cACA,WACA,WCHF,iBACE,sBACA,iFAFF,mBACE,sBACA,mFAFF,iBACE,sBACA,iFAFF,cACE,sBACA,8EAFF,iBACE,sBACA,i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ACA,WAGF,oBACE,iBACA,iBAKF,cACE,iBCjVJ,SACE,sBACA,eACA,oBAGF,iBACE,+BACA,WAEF,gBACE,c/CRF,MAEE,+BACA,iCAEA,0BACA,kCACA,iCAEA,4BACA,oCACA,kCAEA,4BACA,kCAGA,8BACA,gCAEA,yBACA,iCACA,gCAEA,2BACA,mCACA,iCAEA,2BACA,iCAGF,sBACE,4CACA,gDACA,gDAEA,kCACA,kDACA,sCAEA,sDACA,kDAEA,sCACA,kDAGF,qBACE,2CACA,+CAEA,iCACA,iDACA,+CAEA,qCACA,qDACA,iDAEA,qCACA,iDgD7DA,iBACE,gBACA,iBACA,0CAGF,OACE,qBAGF,YACE,iBAEA,iBACE,gBACA,oBAIJ,gBACE,iBACA,oBAGF,gBACE,iBhDzBJ,MAEE,+BACA,iCAEA,0BACA,kCACA,iCAEA,4BACA,oCACA,kCAEA,4BACA,kCAGA,8BACA,gCAEA,yBACA,iCACA,gCAEA,2BACA,mCACA,iCAEA,2BACA,iCAGF,sBACE,4CACA,gDACA,gDAEA,kCACA,kDACA,sCAEA,sDACA,kDAEA,sCACA,kDAGF,qBACE,2CACA,+CAEA,iCACA,iDACA,+CAEA,qCACA,qDACA,iDAEA,qCACA,iDiD5DA,iBAEE,wBAGF,kBACE,qBACA,gBACA,+BAGF,gDAEE,iCAGF,iBACE,uBACA,mBACA,oBAGF,uEAGE,iCC1BJ,UACE,kBAGA,iBACE,WACA,kBACA,UACA,iBAXS,QAYT,MACA,SACA,SACA,iBAKJ,eACE,kBACA,UAEA,qBACE,kCACA,kBACA,sBACA,cAEA,uBACE,cAGF,iCACE,yBAIJ,2BACE,oBACA,iBACA,gBAIF,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,sBACA,sBACA,wCACA,SACA,UACA,WACA,wCACA,sCAIF,6BACE,WACA,kBACA,YACA,WACA,iCACA,sBACA,wCACA,SACA,UACA,UACA,uCACA,yCAIF,4BACE,WAKJ,qCAGE,iBACE,UAIF,eACE,WACA,6BACA,8BAGA,uBACE,qBAIF,uDAEE,oBAGF,4BACE,kBACA,gBACA,uCACA,yCAGF,6BACE,WAIF,qBACE,SlDlKN,MAEE,+BACA,iCAEA,0BACA,kCACA,iCAEA,4BACA,oCACA,kCAEA,4BACA,kCAGA,8BACA,gCAEA,yBACA,iCACA,gCAEA,2BACA,mCACA,iCAEA,2BACA,iCAGF,sBACE,4CACA,gDACA,gDAEA,kCACA,kDACA,sCAEA,sDACA,kDAEA,sCACA,kDAGF,qBACE,2CACA,+CAEA,iCACA,iDACA,+CAEA,qCACA,qDACA,iDAEA,qCACA,iDmD7DA,qBACE,0CCHF,gCACE,mBAKA,+CACE,yBAIJ,+BACE","sourcesContent":["$primary-color: #021a34;\n$secondary-color: #075f94;\n\n:root {\n // -- Light\n --primary-color-light: #021a34;\n --secondary-color-light: #075f94;\n\n --bg-color-light: #edeef0;\n --bg-color-reverse-light: #021a34;\n --bg-color-tinted-light: #b0b2b4;\n\n --text-color-light: #4c4c4c;\n --text-color-reverse-light: #edeef0;\n --text-muted-color-light: #4c4c4c;\n\n --link-color-light: #4c4c4c;\n --link-hover-color-light: #6c6c6c;\n\n // -- Dark\n --primary-color-dark: #edeef0;\n --secondary-color-dark: #075f94;\n\n --bg-color-dark: #14171c;\n --bg-color-reverse-dark: #edeef0;\n --bg-color-tinted-dark: #627191;\n\n --text-color-dark: #edeef0;\n --text-color-reverse-dark: #14171c;\n --text-muted-color-dark: #edeef0;\n\n --link-color-dark: #edeef0;\n --link-hover-color-dark: #ffffff;\n}\n\n[data-bs-theme=\"light\"] {\n --primary-color: var(--primary-color-light);\n --secondary-color: var(--secondary-color-light);\n --bg-color-tinted: var(--bg-color-tinted-light);\n\n --bg-color: var(--bg-color-light);\n --bg-color-reverse: var(--bg-color-reverse-light);\n --text-color: var(--text-color-light);\n\n --text-color-reverse: var(--text-color-reverse-light);\n --text-muted-color: var(--text-muted-color-light);\n\n --link-color: var(--link-color-light);\n --link-hover-color: var(--link-hover-color-light);\n}\n\n[data-bs-theme=\"dark\"] {\n --primary-color: var(--primary-color-dark);\n --secondary-color: var(--secondary-color-dark);\n\n --bg-color: var(--bg-color-dark);\n --bg-color-reverse: var(--bg-color-reverse-dark);\n --bg-color-tinted: var(--bg-color-tinted-dark);\n\n --text-color: var(--text-color-dark);\n --text-color-reverse: var(--text-color-reverse-dark);\n --text-muted-color: var(--text-muted-color-dark);\n\n --link-color: var(--link-color-dark);\n --link-hover-color: var(--link-hover-color-dark);\n}\n",":root,\n[data-bs-theme=\"light\"] {\n // Note: Custom variable values only support SassScript inside `#{}`.\n\n // Colors\n //\n // Generate palettes for full colors, grays, and theme colors.\n\n @each $color, $value in $colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $grays {\n --#{$prefix}gray-#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors-rgb {\n --#{$prefix}#{$color}-rgb: #{$value};\n }\n\n @each $color, $value in $theme-colors-text {\n --#{$prefix}#{$color}-text-emphasis: #{$value};\n }\n\n @each $color, $value in $theme-colors-bg-subtle {\n --#{$prefix}#{$color}-bg-subtle: #{$value};\n }\n\n @each $color, $value in $theme-colors-border-subtle {\n --#{$prefix}#{$color}-border-subtle: #{$value};\n }\n\n --#{$prefix}white-rgb: #{to-rgb($white)};\n --#{$prefix}black-rgb: #{to-rgb($black)};\n\n // Fonts\n\n // Note: Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$prefix}gradient: #{$gradient};\n\n // Root and body\n // scss-docs-start root-body-variables\n @if $font-size-root != null {\n --#{$prefix}root-font-size: #{$font-size-root};\n }\n --#{$prefix}body-font-family: #{inspect($font-family-base)};\n @include rfs($font-size-base, --#{$prefix}body-font-size);\n --#{$prefix}body-font-weight: #{$font-weight-base};\n --#{$prefix}body-line-height: #{$line-height-base};\n @if $body-text-align != null {\n --#{$prefix}body-text-align: #{$body-text-align};\n }\n\n --#{$prefix}body-color: #{$body-color};\n --#{$prefix}body-color-rgb: #{to-rgb($body-color)};\n --#{$prefix}body-bg: #{$body-bg};\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg)};\n\n --#{$prefix}emphasis-color: #{$body-emphasis-color};\n --#{$prefix}emphasis-color-rgb: #{to-rgb($body-emphasis-color)};\n\n --#{$prefix}secondary-color: #{$body-secondary-color};\n --#{$prefix}secondary-color-rgb: #{to-rgb($body-secondary-color)};\n --#{$prefix}secondary-bg: #{$body-secondary-bg};\n --#{$prefix}secondary-bg-rgb: #{to-rgb($body-secondary-bg)};\n\n --#{$prefix}tertiary-color: #{$body-tertiary-color};\n --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color)};\n --#{$prefix}tertiary-bg: #{$body-tertiary-bg};\n --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg)};\n // scss-docs-end root-body-variables\n\n --#{$prefix}heading-color: #{$headings-color};\n\n --#{$prefix}link-color: #{$link-color};\n --#{$prefix}link-color-rgb: #{to-rgb($link-color)};\n --#{$prefix}link-decoration: #{$link-decoration};\n\n --#{$prefix}link-hover-color: #{$link-hover-color};\n --#{$prefix}link-hover-color-rgb: #{to-rgb($link-hover-color)};\n\n @if $link-hover-decoration != null {\n --#{$prefix}link-hover-decoration: #{$link-hover-decoration};\n }\n\n --#{$prefix}code-color: #{$code-color};\n --#{$prefix}highlight-color: #{$mark-color};\n --#{$prefix}highlight-bg: #{$mark-bg};\n\n // scss-docs-start root-border-var\n --#{$prefix}border-width: #{$border-width};\n --#{$prefix}border-style: #{$border-style};\n --#{$prefix}border-color: #{$border-color};\n --#{$prefix}border-color-translucent: #{$border-color-translucent};\n\n --#{$prefix}border-radius: #{$border-radius};\n --#{$prefix}border-radius-sm: #{$border-radius-sm};\n --#{$prefix}border-radius-lg: #{$border-radius-lg};\n --#{$prefix}border-radius-xl: #{$border-radius-xl};\n --#{$prefix}border-radius-xxl: #{$border-radius-xxl};\n --#{$prefix}border-radius-2xl: var(--#{$prefix}border-radius-xxl); // Deprecated in v5.3.0 for consistency\n --#{$prefix}border-radius-pill: #{$border-radius-pill};\n // scss-docs-end root-border-var\n\n --#{$prefix}box-shadow: #{$box-shadow};\n --#{$prefix}box-shadow-sm: #{$box-shadow-sm};\n --#{$prefix}box-shadow-lg: #{$box-shadow-lg};\n --#{$prefix}box-shadow-inset: #{$box-shadow-inset};\n\n // Focus styles\n // scss-docs-start root-focus-variables\n --#{$prefix}focus-ring-width: #{$focus-ring-width};\n --#{$prefix}focus-ring-opacity: #{$focus-ring-opacity};\n --#{$prefix}focus-ring-color: #{$focus-ring-color};\n // scss-docs-end root-focus-variables\n\n // scss-docs-start root-form-validation-variables\n --#{$prefix}form-valid-color: #{$form-valid-color};\n --#{$prefix}form-valid-border-color: #{$form-valid-border-color};\n --#{$prefix}form-invalid-color: #{$form-invalid-color};\n --#{$prefix}form-invalid-border-color: #{$form-invalid-border-color};\n // scss-docs-end root-form-validation-variables\n}\n\n@if $enable-dark-mode {\n @include color-mode(dark, true) {\n color-scheme: dark;\n\n // scss-docs-start root-dark-mode-vars\n --#{$prefix}body-color: #{$body-color-dark};\n --#{$prefix}body-color-rgb: #{to-rgb($body-color-dark)};\n --#{$prefix}body-bg: #{$body-bg-dark};\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg-dark)};\n\n --#{$prefix}emphasis-color: #{$body-emphasis-color-dark};\n --#{$prefix}emphasis-color-rgb: #{to-rgb($body-emphasis-color-dark)};\n\n --#{$prefix}secondary-color: #{$body-secondary-color-dark};\n --#{$prefix}secondary-color-rgb: #{to-rgb($body-secondary-color-dark)};\n --#{$prefix}secondary-bg: #{$body-secondary-bg-dark};\n --#{$prefix}secondary-bg-rgb: #{to-rgb($body-secondary-bg-dark)};\n\n --#{$prefix}tertiary-color: #{$body-tertiary-color-dark};\n --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color-dark)};\n --#{$prefix}tertiary-bg: #{$body-tertiary-bg-dark};\n --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg-dark)};\n\n @each $color, $value in $theme-colors-text-dark {\n --#{$prefix}#{$color}-text-emphasis: #{$value};\n }\n\n @each $color, $value in $theme-colors-bg-subtle-dark {\n --#{$prefix}#{$color}-bg-subtle: #{$value};\n }\n\n @each $color, $value in $theme-colors-border-subtle-dark {\n --#{$prefix}#{$color}-border-subtle: #{$value};\n }\n\n --#{$prefix}heading-color: #{$headings-color-dark};\n\n --#{$prefix}link-color: #{$link-color-dark};\n --#{$prefix}link-hover-color: #{$link-hover-color-dark};\n --#{$prefix}link-color-rgb: #{to-rgb($link-color-dark)};\n --#{$prefix}link-hover-color-rgb: #{to-rgb($link-hover-color-dark)};\n\n --#{$prefix}code-color: #{$code-color-dark};\n --#{$prefix}highlight-color: #{$mark-color-dark};\n --#{$prefix}highlight-bg: #{$mark-bg-dark};\n\n --#{$prefix}border-color: #{$border-color-dark};\n --#{$prefix}border-color-translucent: #{$border-color-translucent-dark};\n\n --#{$prefix}form-valid-color: #{$form-valid-color-dark};\n --#{$prefix}form-valid-border-color: #{$form-valid-border-color-dark};\n --#{$prefix}form-invalid-color: #{$form-invalid-color-dark};\n --#{$prefix}form-invalid-border-color: #{$form-invalid-border-color-dark};\n // scss-docs-end root-dark-mode-vars\n }\n}\n","// stylelint-disable scss/dimension-no-non-numeric-values\n\n// SCSS RFS mixin\n//\n// Automated responsive values for font sizes, paddings, margins and much more\n//\n// Licensed under MIT (https://github.com/twbs/rfs/blob/main/LICENSE)\n\n// Configuration\n\n// Base value\n$rfs-base-value: 1.25rem !default;\n$rfs-unit: rem !default;\n\n@if $rfs-unit != rem and $rfs-unit != px {\n @error \"`#{$rfs-unit}` is not a valid unit for $rfs-unit. Use `px` or `rem`.\";\n}\n\n// Breakpoint at where values start decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n@if $rfs-breakpoint-unit != px and $rfs-breakpoint-unit != em and $rfs-breakpoint-unit != rem {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n}\n\n// Resize values based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != number or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Mode. Possibilities: \"min-media-query\", \"max-media-query\"\n$rfs-mode: min-media-query !default;\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-rfs to false\n$enable-rfs: true !default;\n\n// Cache $rfs-base-value unit\n$rfs-base-value-unit: unit($rfs-base-value);\n\n@function divide($dividend, $divisor, $precision: 10) {\n $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);\n $dividend: abs($dividend);\n $divisor: abs($divisor);\n @if $dividend == 0 {\n @return 0;\n }\n @if $divisor == 0 {\n @error \"Cannot divide by 0\";\n }\n $remainder: $dividend;\n $result: 0;\n $factor: 10;\n @while ($remainder > 0 and $precision >= 0) {\n $quotient: 0;\n @while ($remainder >= $divisor) {\n $remainder: $remainder - $divisor;\n $quotient: $quotient + 1;\n }\n $result: $result * 10 + $quotient;\n $factor: $factor * .1;\n $remainder: $remainder * 10;\n $precision: $precision - 1;\n @if ($precision < 0 and $remainder >= $divisor * 5) {\n $result: $result + 1;\n }\n }\n $result: $result * $factor * $sign;\n $dividend-unit: unit($dividend);\n $divisor-unit: unit($divisor);\n $unit-map: (\n \"px\": 1px,\n \"rem\": 1rem,\n \"em\": 1em,\n \"%\": 1%\n );\n @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {\n $result: $result * map-get($unit-map, $dividend-unit);\n }\n @return $result;\n}\n\n// Remove px-unit from $rfs-base-value for calculations\n@if $rfs-base-value-unit == px {\n $rfs-base-value: divide($rfs-base-value, $rfs-base-value * 0 + 1);\n}\n@else if $rfs-base-value-unit == rem {\n $rfs-base-value: divide($rfs-base-value, divide($rfs-base-value * 0 + 1, $rfs-rem-value));\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == px {\n $rfs-breakpoint: divide($rfs-breakpoint, $rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == rem or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: divide($rfs-breakpoint, divide($rfs-breakpoint * 0 + 1, $rfs-rem-value));\n}\n\n// Calculate the media query value\n$rfs-mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{divide($rfs-breakpoint, $rfs-rem-value)}#{$rfs-breakpoint-unit});\n$rfs-mq-property-width: if($rfs-mode == max-media-query, max-width, min-width);\n$rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height);\n\n// Internal mixin used to determine which media query needs to be used\n@mixin _rfs-media-query {\n @if $rfs-two-dimensional {\n @if $rfs-mode == max-media-query {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}), (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) and (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) {\n @content;\n }\n }\n}\n\n// Internal mixin that adds disable classes to the selector if needed.\n@mixin _rfs-rule {\n @if $rfs-class == disable and $rfs-mode == max-media-query {\n // Adding an extra class increases specificity, which prevents the media query to override the property\n &,\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @else if $rfs-class == enable and $rfs-mode == min-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Internal mixin that adds enable classes to the selector if needed.\n@mixin _rfs-media-query-rule {\n\n @if $rfs-class == enable {\n @if $rfs-mode == min-media-query {\n @content;\n }\n\n @include _rfs-media-query () {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n }\n @else {\n @if $rfs-class == disable and $rfs-mode == min-media-query {\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @include _rfs-media-query () {\n @content;\n }\n }\n}\n\n// Helper function to get the formatted non-responsive value\n@function rfs-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: \"\";\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + \" 0\";\n }\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n @if $unit == px {\n // Convert to rem if needed\n $val: $val + \" \" + if($rfs-unit == rem, #{divide($value, $value * 0 + $rfs-rem-value)}rem, $value);\n }\n @else if $unit == rem {\n // Convert to px if needed\n $val: $val + \" \" + if($rfs-unit == px, #{divide($value, $value * 0 + 1) * $rfs-rem-value}px, $value);\n } @else {\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n $val: $val + \" \" + $value;\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// Helper function to get the responsive value calculated by RFS\n@function rfs-fluid-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: \"\";\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + \" 0\";\n } @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $unit or $unit != px and $unit != rem {\n $val: $val + \" \" + $value;\n } @else {\n // Remove unit from $value for calculations\n $value: divide($value, $value * 0 + if($unit == px, 1, divide(1, $rfs-rem-value)));\n\n // Only add the media query if the value is greater than the minimum value\n @if abs($value) <= $rfs-base-value or not $enable-rfs {\n $val: $val + \" \" + if($rfs-unit == rem, #{divide($value, $rfs-rem-value)}rem, #{$value}px);\n }\n @else {\n // Calculate the minimum value\n $value-min: $rfs-base-value + divide(abs($value) - $rfs-base-value, $rfs-factor);\n\n // Calculate difference between $value and the minimum value\n $value-diff: abs($value) - $value-min;\n\n // Base value formatting\n $min-width: if($rfs-unit == rem, #{divide($value-min, $rfs-rem-value)}rem, #{$value-min}px);\n\n // Use negative value if needed\n $min-width: if($value < 0, -$min-width, $min-width);\n\n // Use `vmin` if two-dimensional is enabled\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{divide($value-diff * 100, $rfs-breakpoint)}#{$variable-unit};\n\n // Return the calculated value\n $val: $val + \" calc(\" + $min-width + if($value < 0, \" - \", \" + \") + $variable-width + \")\";\n }\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// RFS mixin\n@mixin rfs($values, $property: font-size) {\n @if $values != null {\n $val: rfs-value($values);\n $fluid-val: rfs-fluid-value($values);\n\n // Do not print the media query if responsive & non-responsive values are the same\n @if $val == $fluid-val {\n #{$property}: $val;\n }\n @else {\n @include _rfs-rule () {\n #{$property}: if($rfs-mode == max-media-query, $val, $fluid-val);\n\n // Include safari iframe resize fix if needed\n min-width: if($rfs-safari-iframe-resize-bug-fix, (0 * 1vw), null);\n }\n\n @include _rfs-media-query-rule () {\n #{$property}: if($rfs-mode == max-media-query, $fluid-val, $val);\n }\n }\n }\n}\n\n// Shorthand helper mixins\n@mixin font-size($value) {\n @include rfs($value);\n}\n\n@mixin padding($value) {\n @include rfs($value, padding);\n}\n\n@mixin padding-top($value) {\n @include rfs($value, padding-top);\n}\n\n@mixin padding-right($value) {\n @include rfs($value, padding-right);\n}\n\n@mixin padding-bottom($value) {\n @include rfs($value, padding-bottom);\n}\n\n@mixin padding-left($value) {\n @include rfs($value, padding-left);\n}\n\n@mixin margin($value) {\n @include rfs($value, margin);\n}\n\n@mixin margin-top($value) {\n @include rfs($value, margin-top);\n}\n\n@mixin margin-right($value) {\n @include rfs($value, margin-right);\n}\n\n@mixin margin-bottom($value) {\n @include rfs($value, margin-bottom);\n}\n\n@mixin margin-left($value) {\n @include rfs($value, margin-left);\n}\n","// scss-docs-start color-mode-mixin\n@mixin color-mode($mode: light, $root: false) {\n @if $color-mode-type == \"media-query\" {\n @if $root == true {\n @media (prefers-color-scheme: $mode) {\n :root {\n @content;\n }\n }\n } @else {\n @media (prefers-color-scheme: $mode) {\n @content;\n }\n }\n } @else {\n [data-bs-theme=\"#{$mode}\"] {\n @content;\n }\n }\n}\n// scss-docs-end color-mode-mixin\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n\n// Root\n//\n// Ability to the value of the root font sizes, affecting the value of `rem`.\n// null by default, thus nothing is generated.\n\n:root {\n @if $font-size-root != null {\n @include font-size(var(--#{$prefix}root-font-size));\n }\n\n @if $enable-smooth-scroll {\n @media (prefers-reduced-motion: no-preference) {\n scroll-behavior: smooth;\n }\n }\n}\n\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Prevent adjustments of font size after orientation changes in iOS.\n// 4. Change the default tap highlight to be completely transparent in iOS.\n\n// scss-docs-start reboot-body-rules\nbody {\n margin: 0; // 1\n font-family: var(--#{$prefix}body-font-family);\n @include font-size(var(--#{$prefix}body-font-size));\n font-weight: var(--#{$prefix}body-font-weight);\n line-height: var(--#{$prefix}body-line-height);\n color: var(--#{$prefix}body-color);\n text-align: var(--#{$prefix}body-text-align);\n background-color: var(--#{$prefix}body-bg); // 2\n -webkit-text-size-adjust: 100%; // 3\n -webkit-tap-highlight-color: rgba($black, 0); // 4\n}\n// scss-docs-end reboot-body-rules\n\n\n// Content grouping\n//\n// 1. Reset Firefox's gray color\n\nhr {\n margin: $hr-margin-y 0;\n color: $hr-color; // 1\n border: 0;\n border-top: $hr-border-width solid $hr-border-color;\n opacity: $hr-opacity;\n}\n\n\n// Typography\n//\n// 1. Remove top margins from headings\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n\n%heading {\n margin-top: 0; // 1\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-style: $headings-font-style;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: var(--#{$prefix}heading-color);\n}\n\nh1 {\n @extend %heading;\n @include font-size($h1-font-size);\n}\n\nh2 {\n @extend %heading;\n @include font-size($h2-font-size);\n}\n\nh3 {\n @extend %heading;\n @include font-size($h3-font-size);\n}\n\nh4 {\n @extend %heading;\n @include font-size($h4-font-size);\n}\n\nh5 {\n @extend %heading;\n @include font-size($h5-font-size);\n}\n\nh6 {\n @extend %heading;\n @include font-size($h6-font-size);\n}\n\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\n\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n\n// Abbreviations\n//\n// 1. Add the correct text decoration in Chrome, Edge, Opera, and Safari.\n// 2. Add explicit cursor to indicate changed behavior.\n// 3. Prevent the text-decoration to be skipped.\n\nabbr[title] {\n text-decoration: underline dotted; // 1\n cursor: help; // 2\n text-decoration-skip-ink: none; // 3\n}\n\n\n// Address\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\n\n// Lists\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\n// 1. Undo browser default\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // 1\n}\n\n\n// Blockquote\n\nblockquote {\n margin: 0 0 1rem;\n}\n\n\n// Strong\n//\n// Add the correct font weight in Chrome, Edge, and Safari\n\nb,\nstrong {\n font-weight: $font-weight-bolder;\n}\n\n\n// Small\n//\n// Add the correct font size in all browsers\n\nsmall {\n @include font-size($small-font-size);\n}\n\n\n// Mark\n\nmark {\n padding: $mark-padding;\n color: var(--#{$prefix}highlight-color);\n background-color: var(--#{$prefix}highlight-bg);\n}\n\n\n// Sub and Sup\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n\nsub,\nsup {\n position: relative;\n @include font-size($sub-sup-font-size);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n// Links\n\na {\n color: rgba(var(--#{$prefix}link-color-rgb), var(--#{$prefix}link-opacity, 1));\n text-decoration: $link-decoration;\n\n &:hover {\n --#{$prefix}link-color-rgb: var(--#{$prefix}link-hover-color-rgb);\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n &,\n &:hover {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n// Code\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-code;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\n// 1. Remove browser default top margin\n// 2. Reset browser default of `1em` to use `rem`s\n// 3. Don't allow content to break outside\n\npre {\n display: block;\n margin-top: 0; // 1\n margin-bottom: 1rem; // 2\n overflow: auto; // 3\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\ncode {\n @include font-size($code-font-size);\n color: var(--#{$prefix}code-color);\n word-wrap: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n\n kbd {\n padding: 0;\n @include font-size(1em);\n font-weight: $nested-kbd-font-weight;\n }\n}\n\n\n// Figures\n//\n// Apply a consistent margin strategy (matches our type styles).\n\nfigure {\n margin: 0 0 1rem;\n}\n\n\n// Images and content\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\n\n// Tables\n//\n// Prevent double borders\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: $table-cell-padding-y;\n padding-bottom: $table-cell-padding-y;\n color: $table-caption-color;\n text-align: left;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // 1\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n text-transform: none;\n}\n// Set the cursor for non-` +

+ + + + + +
+
+
+
+

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

+ + + 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..0025a8762 --- /dev/null +++ b/ar/community/index.html @@ -0,0 +1,444 @@ + + + + + + + + + + + + + المجتمع | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+

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

+ +

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

+ + + +

To explore the communities managed by members of the community, you can follow the links below.

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

المساهمة

+ + +

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..ba9150f29 --- /dev/null +++ b/ar/download/index.html @@ -0,0 +1,543 @@ + + + + + + + + + + + + + تنزيل | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+

تحميل بكتوس

+ +

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

+ +
+ +

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

+ +

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

+ +

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

+ +
+ +

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

+ +

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

+ +

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

+ +

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

+ +

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

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
File nameKindOSArch
pactus-gui_1.0.2_darwin_amd64.tar.gzArchive macOS64-bit
pactus-gui_1.0.2_darwin_amd64.dmgDMG macOS64-bit
pactus-gui_1.0.2_darwin_arm64.tar.gzArchive macOSARM64
pactus-gui_1.0.2_darwin_arm64.dmgDMG macOSARM64
pactus-gui_1.0.2_linux_amd64.tar.gzArchive Linux64-bit
pactus-gui_1.0.2_windows_amd64.zipArchive Windows64-bit
pactus-gui_1.0.2_windows_amd64_installer.exeInstaller Windows64-bit
+ +
+ تطبيق غير موثوق

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

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

+ +
+ +

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

+ +

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

+ +

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

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
File nameOSArch
pactus-cli_1.0.2_android_arm64.tar.gz AndroidARM64
pactus-cli_1.0.2_darwin_amd64.tar.gz macOS64-bit
pactus-cli_1.0.2_darwin_arm64.tar.gz macOSARM64
pactus-cli_1.0.2_freebsd_amd64.tar.gz FreeBSD64-bit
pactus-cli_1.0.2_freebsd_arm.tar.gz FreeBSDARM
pactus-cli_1.0.2_linux_amd64.tar.gz Linux64-bit
pactus-cli_1.0.2_linux_arm64.tar.gz LinuxARM64
pactus-cli_1.0.2_windows_386.zip Windows32-bit
pactus-cli_1.0.2_windows_amd64.zip Windows64-bit
+ +

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

+ +

Downloader script

+ +

For Unix-like systems (e.g., Linux, macOS, or MSYS2 on Windows), there is a downloader script available. This script can download the archived file, verify it, and extract it for you. To use it, simply run the following command in your terminal:

+ +
curl --proto '=https' --tlsv1.2 -sSL https://github.com/pactus-project/pactus/releases/download/v1.0.2/pactus_downloader.sh | sh
+
+ +
+ +

🐳 حاوية دوكر

+ +

يمكن للمستخدم المتقدم الحصول على صورة بكتوس دوكر من 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..b2da51a3b --- /dev/null +++ b/ar/feed.xml @@ -0,0 +1,1223 @@ +Jekyll2024-03-10T09:34:38+00:00https://pactus.org/feed.xmlPactus blockchainPactus 1.0.2 (Istanbul) Released2024-02-18T00:00:00+00:002024-02-18T00:00:00+00:00https://pactus.org/2024/02/18/release-1-0-2Overview
+ +

Pactus Blockchain Version 1.0.2 (Istanbul) +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.

+ +

This release is named after the city of Istanbul and it +was unanimously selected by Pactus community.

+ +

Pactus Version 1.0.2 (Istanbul)

+ +

Highlights

+ +

This update fixes a major issue that decreases the number of inbound connections of the nodes over time. +We highly recommend all users to upgrade to the new version for better connectivity.

+ +

Download

+ +

To start using Pactus blockchain, download the latest version from the download +page and join the Mainnet.

+ +

How to Upgrade

+ +

If you are running an older version, close it first. +Then uninstall the previous version and install the newer version. +If you are using the archived version, simply replace it with the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Fix

+ + + +

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

]]>Pactus 1.0.1 (Beijing) Released2024-02-10T00:00:00+00:002024-02-10T00:00:00+00:00https://pactus.org/2024/02/10/release-1-0-1Overview + +

Pactus Blockchain Version 1.0.1 (Beijing) +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.

+ +

This release is named after the city of Beijing and it +was unanimously selected by Pactus community.

+ +

Pactus Version 1.0.1 (Beijing)

+ +

Highlights

+ +

This update fixes several issues identified after the release of +1.0.0 (Beijing). +Specifically, it fixes the missed log file on the Windows GUI application and improves the node connectivity.

+ +

Download

+ +

To start using Pactus blockchain, download the latest version from the download +page and join the Mainnet.

+ +

How to Upgrade

+ +

If you are running an older version, close it first. +Then uninstall the previous version and install the newer version. +If you are using the archived version, simply replace it with the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • gui: add connections and moniker fields to main windows (#1090)
  • +
+ +

Fix

+ +
    +
  • network: set dial and accept limit in connection gater (#1089)
  • +
  • gui stderr logger in windows os (#1081)
  • +
  • sync: improve syncing process (#1087)
  • +
  • network: redefine resource limits (#1086)
  • +
+ +

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

]]>
Pactus 1.0.0 (Beijing) Released2024-01-31T00:00:00+00:002024-01-31T00:00:00+00:00https://pactus.org/2024/01/31/release-1-0-0Overview + +

Pactus Blockchain Version 1.0.0 (Beijing) +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.

+ +

Pactus Version 1.0.0 (Beijing)

+ +

Highlights

+ +

Mainnet Official Release v1.0.0 (Beijing)

+ +

The much-anticipated official software release of Pactus v1.0.0 (Beijing) marks a significant milestone +for our community. +This impressive mainnet release represents the culmination of extensive development efforts. +Pactus v1.0.0 (Beijing) offers a pioneering solution for streamlining the validation of Pactus blockchain, +enhancing security, and providing a user-friendly experience. We’re excited to unveil the official software +and welcome users to experience the power of Pactus in revolutionizing the future of blockchain. Join us on +this exciting journey.

+ +

Onboarding validators

+ +

On February 1st, a total of 53,494 PAC coins will be distributed among 1,311 validators who participated in +Testnet-0, +Testnet-1, and +Testnet-2. +This marks the beginning of a new chapter in the decentralized world.

+ +

Download

+ +

This version has been implemented for Mainnet +To start using Pactus Mainnet, download the latest version from the download +page and join the Mainnet.

+ +

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

+ + + +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • implement get validator address for grpc (#975)
  • +
  • add bootstrap.json and load in config on build (#964)
  • +
  • add mainnet config and genesis files (#951)
  • +
  • add Consensus-address to network info (#952)
  • +
  • grpc: sign transaction using wallet client (#945)
  • +
  • pactus gui lock support (#947)
  • +
  • consensus: turning consensus to a zero-config module (#942)
  • +
+ +

Fix

+ +
    +
  • localnet wallet issue (#970)
  • +
  • sync: remove ReachabilityStatus from agent info (#956)
  • +
  • daemon: keeping previous behavior for password flag, linting CLI messages (#950)
  • +
  • consensus: detect if the system time is behind the network (#939)
  • +
+ +

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

]]>
Mainnet launched 🚀2024-01-24T20:24:00+00:002024-01-24T20:24:00+00:00https://pactus.org/2024/01/24/mainnet-launchedYears to Launch + +

Pactus Mainnet started creating the first block on 24 January 2024 at 20:24:10 UTC time. +Pactus Mainnet is the result of years of hard work, research, and innovation. +It started from one idea:

+ +

A low-cost, truly decentralized blockchain, built by the people for the people, +where anyone could run and be their own validator.

+ +

We faced many challenges and obstacles along the way, but we never gave up.
+We overcame them with our determination and perseverance.
+We learned from our mistakes and improved our solutions.
+We grew from a small team to a large community.
+We achieved many milestones and breakthroughs. And we did it.
+We created Pactus, the platform that empowers you.

+ +

Thanks to Community

+ +

We want to thank Pactus community for helping us on the Testnet.

+ +

You have been instrumental in testing and improving the Testnet.
+You have given us your honest feedback and constructive suggestions.
+You have reported and help fixed bugs and errors.
+You have challenged and pushed us to do better.
+You have been our partners and friends in this journey.

+ +

On the Road

+ +

The true journey has just started.
+The Mainnet is not the end, but the beginning.
+The beginning of a new era of blockchain innovation.
+The beginning of a new challenge and opportunity.
+The beginning of a new revolution and evolution!

+ +

We welcome you more than ever.
+We need you to join us in this exciting adventure.
+We need you to support us in this ambitious endeavor.
+We need you to be part of Pactus, the platform that empowers you!

+ +

We Have a Dream

+ +

We have a dream.
+A dream of a world where blockchain technology is not a privilege, but a right for everyone.
+A dream of a world where smart contracts and decentralized applications are fast, secure, and scalable.
+A dream of a world where Pactus is the platform that empowers you.

+ +

This dream is not just ours. It is yours too.
+You share our vision and passion for blockchain innovation.
+You believe in our potential and impact.
+You support our goals and values.
+You are part of our dream.

+ +

And this dream is not just a fantasy. It is a reality.
+A reality that we have created together.
+A reality that we have launched today. A reality that we can explore and enjoy together.
+A reality that we can shape and improve together.
+A reality that we can make better and brighter together!

]]>
Story of Testnet-22024-01-22T00:00:00+00:002024-01-22T00:00:00+00:00https://pactus.org/2024/01/22/testnet-2-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

+ +

In October 2023, we launched Testnet-2. +The main purpose of this Testnet was to closely monitor the new consensus mechanism and the stability of the P2P network.

+ +

The committee for Testnet-2 was set to 51 validators, +and 2084 validators joined during the Testnet period. +More than 1500 computers and servers joined the network, and we experienced a high volume of data transmission in the network. +More than 800,000 blocks were created, and about 2 million transactions were processed during this time. +The size of the blockchain is about 450 megabytes.

+ +

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

+ +

Stability of Consensus

+ +

In Testnet-1, we had one consensus failure that caused us to +conclude the Testnet-1. +During Testnet-2, there were no issues with the consensus mechanism, and +we had no case of failure during the testing period, +although the number of validators and nodes significantly increased on Testnet-2 compared to its predecessor. +It proved that the consensus mechanism is in a stable situation.

+ +

Networking issues

+ +

In Testnet-2, the blockchain stopped twice, and each time it took more than 24 hours to fix the problem. +In the second blockage, we had no choice but to ask active validators inside the committee to +update their nodes to overcome the networking issue. +The development team faced a difficult situation and had to make the proper decision to fix the networking issues. +On one hand, the networking traffic increased significantly, and on the other hand, we had to +make sure normal users with limited internet bandwidth could still participate in the consensus mechanism without any problems. +After examining different scenarios, the networking issues were resolved, and +no major problems were reported till the end of Testnet.

+ +

Major updates

+ +

During Testnet-2, we introduced several updates, including versions +0.15.0, +0.16.0, +0.17.0, +0.18.0, +0.19.0, and +0.20.0. +The update process went smoothly, and with the stability of Version 0.20.0 confirmed, +the development team shifted its focus to the Mainnet launch.

+ +

Special 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 PAC coins to set up their validators.

+ +

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

]]>
Pactus 0.20.0 Released2024-01-11T00:00:00+00:002024-01-11T00:00:00+00:00https://pactus.org/2024/01/11/release-0-20-0Overview + +

Pactus Blockchain Version 0.20.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

+ +

Validator Stake Management

+ +

The new GUI application enables users to easily Unbond and Withdraw their validator’s stake.

+ +

Withdraw dialog

+ +

Improving Network Connectivity

+ +

Some users have reported that UDP packets are being dropped by their Internet Service Providers. +Therefore, the UDP protocol is disabled by default. +Users can still activate the UDP protocol by configuring the settings in the file if necessary.

+ +

Also, the experimental Node Gossip feature has been removed in this version. +Node gossip could cause some validators to become isolated from the rest of the network.

+ +

Relay service

+ +

This version enables users to turn their node into a relay service. +A relay service node can help users behind NAT to communicate with each other. +It is disabled by default and can be enabled inside the config file. +Please note that it is still in an experimental state.

+ +

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

+ +
    +
  • implement relay service (#931)
  • +
  • HTTP: Integrate AddRowDouble and update tests (#926)
  • +
  • network: making listen address private in config (#921)
  • +
  • http: adding AvailabilityScore to http module (#917)
  • +
  • network: adding ‘enable_udp’ config (#918)
  • +
  • network: removing gossip node service (#916)
  • +
  • gRPC: adding AvailabilityScore to gRPC (#910)
  • +
  • GUI: unbond and withdraw transaction dialogs (#908)
  • +
+ +

Fix

+ +
    +
  • gRPC: adding missing get raw transaction APIs to gRPC gateway (#925)
  • +
  • network: preventing self dial (#924)
  • +
  • fixing time lag on starting node (#923)
  • +
  • network: fixing network deadlock on linux arm64 (#922)
  • +
  • GUI: updating unbond and withdraw dialogs (#911)
  • +
  • fixing gRPC node info issue (#906)
  • +
+ +

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

]]>
Pactus records its IPs in IPMINTER2024-01-10T00:00:00+00:002024-01-10T00:00:00+00:00https://pactus.org/2024/01/10/pactus-records-its-ips-in-ipminterIPMINTER

+ +

In our continuous pursuit of innovation, the recording of our intellectual property is the +cornerstone philosophy of Pactus. Yet, we found traditional patenting methods to be a +slow and expensive hurdle. That is… until we discovered IPMINTER!

+ +

Pactus profile in IPMINTER

+ +

We are ecstatic to announce that the blockchain-based platform by IPMINTER has +revolutionized the way we secure our creations.

+ +

Gone are the days of lengthy processes and hefty fees. With IPMINTER, registering our +intellectual property on the blockchain was a cakewalk – accomplished in a mere 10 minutes! +Plus, the moment we received our exquisite certificate, complete with a QR code directly linking +to our secure blockchain entry, our confidence in this platform soared.

+ +

Our journey with IPMINTER didn’t end there, it became our trusted ally in the ongoing mission +to protect our inventive proposals. The assurance we’ve experienced using their platform has +been unparalleled.

+ +

We’re proud to share our story and to recommend IPMINTER to those on a quest for a straightforward, +economical, and robust IP recording solution. They have our heartfelt endorsement!

+ +

Join us in embracing the future of IP management with IPMINTER. Record what’s yours, the smart way!

]]>
Mainnet announcement2024-01-08T00:00:00+00:002024-01-08T00:00:00+00:00https://pactus.org/2024/01/08/mainnet-announcementThe much-awaited Mainnet Launch of The Pactus Blockchain is finally here! +On January 24, 2024, at 20:24:00 UTC, the first block, known as the Genesis block, +will be minted by four Bootstrap validators. +After that, every 10 seconds, a new block will be added to the blockchain. +Each block contains the committed transactions in the network. +The block finality in the Pactus blockchain is immediate. +It means that there is no need to wait for block confirmation to ensure a transaction is committed.

+ +

Later, more than 2000 community validators will secure the blockchain and make it decentralized. +These validators are Testnet participants who helped test Pactus during our testing period. +The community validators will receive the initial staking coins from a Discord Bot named RoboPac.

+ +

To ensure everything works smoothly on the Mainnet, three different Testnets ( +Testnet0, +Testnet1, and +Testnet2) have been run.

+ +

The Mainnet will never be stopped or interrupted by the core developers of Pactus, +and validators should primarily participate in and maintain the security of the blockchain.

]]>
Pactus 0.19.0 Released2024-01-04T00:00:00+00:002024-01-04T00:00:00+00:00https://pactus.org/2024/01/04/release-0-19-0Overview + +

Pactus Blockchain Version 0.19.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 has improved the overall performance of the blockchain by implementing +PIP-15. +PIP-15 suggests to add caching algorithms to the database for the most frequently used items.

+ +

Additionally, this version has enhanced the connectivity of the nodes in the P2P network.

+ +

Availability Score

+ +

This version comes with the implementation of PIP-19. +PIP-19 suggests assigning the “Availability Score” to each validator based on their activities in the +committee. +Validators with a score less than 0.8 won’t receive the block reward, +as their proposals will be rejected by other validators. +The main reason behind this PIP is to prevent users from downgrading +their node specifications and running Pactus on machines with low resources.

+ +

Breaking change

+ +

The Docker container now contains both daemon and wallet binary files. +Users who use Docker to run Pacts now need to add the entry point to run Pactus.

+ +

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

+ +
    +
  • gRPC: defining network and peers info response’s properly (#898)
  • +
  • implementing pip-19 (#899)
  • +
  • network: disabling GosipSub, only FloodSub (#895)
  • +
  • www: adding change proposer round and value to consensus info votes (#892)
  • +
  • network: adding relay service to dial relay nodes (#887)
  • +
  • implementing pip-15 (#843)
  • +
  • check already running by lock file (#871)
  • +
+ +

Fix

+ +
    +
  • store: use cache to check if public key exists (#902)
  • +
  • executor: not rejecting bond transaction for bootstrap validator (#901)
  • +
  • GUI: removing unnecessary tags in transaction confirm dialog (#893)
  • +
  • network: close relay connection for public node (#891)
  • +
  • network: refining GossipSubParams for Gossiper node (#882)
  • +
  • sync: adding sequence number to the bundle (#881)
  • +
  • network: turn off mesh for gossiper node (#880)
  • +
  • consensus: check voteset for CP strong termination (#879)
  • +
  • adding querier to query messages (#878)
  • +
  • execution: fixing issue #869 (#870)
  • +
  • fixing logger issue on rotating log file (#859)
  • +
+ +

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

]]>
Pactus 0.18.0 Released2023-12-12T00:00:00+00:002023-12-12T00:00:00+00:00https://pactus.org/2023/12/12/release-0-18-0Overview + +

Pactus Blockchain Version 0.18.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 has significantly improved the syncing progress. +The syncing process concurrently requests blocks from 8 different peers and +actively connects to the most optimal peers for downloading the blockchain.

+ +

Additionally, users can now import private keys into their wallet and securely encrypt them using their wallet password.

+ +

Breaking change

+ +

For Unix-based systems, please note that the working directory for root users has changed from /pactus to /root/pactus.

+ +

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.

+ +

+After you update the node, the configuration file will automatically get updated, keeping the old settings. +If you want to return the configuration file to its default settings, +just delete the current config file and restart the node. +

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • implement pip-14 (#841)
  • +
  • sort wallet addresses (#836)
  • +
  • grpc: endpoints for creating raw transaction (#838)
  • +
  • network reachability API (#834)
  • +
  • implement pip-13 (#835)
  • +
  • subscribing to libp2p eventbus (#831)
  • +
  • implement helper methods for wallet address path (#830)
  • +
  • logger: adding rotate log file after days, compress and maxgae for logger config (#822)
  • +
  • enable bandwidth router metric (#819)
  • +
+ +

Fix

+ +
    +
  • network: refining the connection limit (#849)
  • +
  • corrected mistake when retrieving the reward address (#848)
  • +
  • config: restore default config when it is deleted (#847)
  • +
  • cmd: changing home directory for root users (#846)
  • +
  • removing BasicCheck for hash (#845)
  • +
  • disabling libp2p ping protocol (#844)
  • +
  • build docker file (#839)
  • +
  • sync: ignore publishing a block if it is received before (#829)
  • +
  • network: subscribing to the Libp2p event bus (#828)
  • +
  • sync: ignore block request if blocks are already inside the cache (#817)
  • +
+ +

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

]]>
Pactus 0.17.0 Released2023-11-12T00:00:00+00:002023-11-12T00:00:00+00:00https://pactus.org/2023/11/12/release-0-17-0Overview + +

Pactus Blockchain Version 0.17.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 Testnet has been upgraded and all validators must update their nodes.

+ +

This version will address major networking issues, reduce network usage, and improve overall performance.

+ +

A new node type, “Node Gossips”, has been introduced to help broadcast and spread messages across the network. +Node Gossips support the network by delivering messages to non-gossiping nodes. +This gossip option is disabled by default but can be enabled in the configuration file. +If you are running Pactus on a stable and reliable server, we recommend enabling this option for your node. +Please note that this option is still experimental and subject to potential changes in future releases.

+ +

Node gossip in config 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.

+ +

+After updating the node, the configuration file will be overwritten with a new version. +You need to make modifications to the config file if you had customized it prior to the update. +

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • network: default configs for bootstrap and relay peers (#812)
  • +
  • introducing node gossip type (#811)
  • +
  • sync: adding remote address to the peer info (#804)
  • +
  • network: adding public address to factory (#795)
  • +
  • network: filter private ips (#793)
  • +
+ +

Fix

+ +
    +
  • upgrading Testnet (#814)
  • +
  • sync: prevent opening sessions indefinitely (#813)
  • +
  • execution: fixing mistake on calculating unbonded power (#806)
  • +
  • network: check connection threshold on gater (#803)
  • +
  • network: no transient connection (#799)
  • +
  • not close connection for bootstrap nodes (#792)
  • +
+ +

Refactor

+ +
    +
  • sync: refactoring sync process (#807)
  • +
+ +

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

]]>
Pactus 0.16.0 Released2023-10-29T00:00:00+00:002023-10-29T00:00:00+00:00https://pactus.org/2023/10/29/release-0-16-0Overview + +

Pactus Blockchain Version 0.16.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 allows users to create new addresses for both validators and accounts. +The networking module has been improved, and users can now set limits on the number of connections. +A random crash on the agreement protocol has been fixed in this version.

+ +

New address dialog

+ +

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

+ +
    +
  • gui: display network ID (#780)
  • +
  • create new validator address (CLI and GUI) (#757)
  • +
  • add community bootstrap nodes to testnet config (#764)
  • +
  • network: implementing connection manager (#773)
  • +
  • network: adding bootstrapper mode to the network config (#760)
  • +
+ +

Fix

+ +
    +
  • network: redefine the network limits (#788)
  • +
  • consensus: not increase the vote-box power on duplicated votes (#785)
  • +
  • network: close connection when unable 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)
  • +
  • consensus: strong termination for the binary agreement (#765)
  • +
  • consensus: not increase the voting power on duplicated binary votes (#762)
  • +
+ +

Refactor

+ +
    +
  • network: refactoring peer manager (#787)
  • +
+ +

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 51, +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-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

+ +

In May 2023, we launched Testnet-1. +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

+ +

Major updates

+ +

During Testnet-1, we released three versions(Version +0.11.0, +0.12.0, +0.13.0), and the upgrade process was smooth. +Unfortunately, during Testnet-1, we encountered a consensus failure that may occur at any time in the future. +The consensus failure was resolved by requiring some validators to re-sync their nodes. +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.

+ +

Special 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 PAC coins to set up their validators.

+ +

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.

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


تشغيل عقدة

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


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

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


كن مُصدِّق

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


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

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

Our Partners

+
+
+
+ + Sensifia + +
+
+ + IPMINTER + +
+
+
+
+
+ +
+
+
+

Our Validators

+
+
+
+ + SGTstake + +
+
+ + NodeSync.Top + +
+
+ + CodeBlockLabs + +
+
+ + CoreNode + +
+
+ + CoreNode + +
+
+ + Validator247 + +
+
+ + VNBnode + +
+
+ + Ionode + +
+
+ + dnsarz + +
+
+ + genznodes + +
+
+ + node39 + +
+
+ + tpes + +
+
+ + oshvank + +
+
+ + testnetnodes + +
+
+ + p10node + +
+
+ + kenz + +
+
+ + blocksync + +
+
+ + adora + +
+
+ + ykpbb + +
+
+ + validator-wiki + +
+
+ + nodeops + +
+
+ + catsmile + +
+
+ + str + +
+
+ + tpes + +
+
+
+
+ + + + + +
+ + +
+ + diff --git a/ar/learn/api/grpc/index.html b/ar/learn/api/grpc/index.html new file mode 100644 index 000000000..0ea0c57f2 --- /dev/null +++ b/ar/learn/api/grpc/index.html @@ -0,0 +1,3656 @@ + + + + + + + + + + + + + gRPC API Reference | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

gRPC API Reference

+ +

Each node in the Pactus network can be configured to use the gRPC protocol for communication. +Here you can find the list of all gRPC methods and messages.

+ +

Table of Contents

+ +
+ +
+ +

Transaction Service transaction.proto

+

Transaction service defines various RPC methods for interacting with transactions.

+

GetTransaction rpc

+
Request message: GetTransactionRequest
+
Response message: GetTransactionResponse
+

GetTransaction retrieves transaction details based on the provided request parameters.

+

CalculateFee rpc

+
Request message: CalculateFeeRequest
+
Response message: CalculateFeeResponse
+

CalculateFee calculates the transaction fee based on the specified amount and payload type.

+

BroadcastTransaction rpc

+ + +

BroadcastTransaction broadcasts a signed transaction to the network.

+

GetRawTransferTransaction rpc

+ +
Response message: GetRawTransactionResponse
+

GetRawTransferTransaction retrieves raw details of a transfer transaction.

+

GetRawBondTransaction rpc

+ +
Response message: GetRawTransactionResponse
+

GetRawBondTransaction retrieves raw details of a bond transaction.

+

GetRawUnBondTransaction rpc

+ +
Response message: GetRawTransactionResponse
+

GetRawUnBondTransaction retrieves raw details of an unbond transaction.

+

GetRawWithdrawTransaction rpc

+ +
Response message: GetRawTransactionResponse
+

GetRawWithdrawTransaction retrieves raw details of a withdraw transaction.

+

Blockchain Service blockchain.proto

+

Blockchain service defines RPC methods for interacting with the blockchain.

+

GetBlock rpc

+
Request message: GetBlockRequest
+
Response message: GetBlockResponse
+

GetBlock retrieves information about a block based on the provided request parameters.

+

GetBlockHash rpc

+
Request message: GetBlockHashRequest
+
Response message: GetBlockHashResponse
+

GetBlockHash retrieves the hash of a block at the specified height.

+

GetBlockHeight rpc

+
Request message: GetBlockHeightRequest
+
Response message: GetBlockHeightResponse
+

GetBlockHeight retrieves the height of a block with the specified hash.

+

GetBlockchainInfo rpc

+
Request message: GetBlockchainInfoRequest
+
Response message: GetBlockchainInfoResponse
+

GetBlockchainInfo retrieves general information about the blockchain.

+

GetConsensusInfo rpc

+
Request message: GetConsensusInfoRequest
+
Response message: GetConsensusInfoResponse
+

GetConsensusInfo retrieves information about the consensus instances.

+

GetAccount rpc

+
Request message: GetAccountRequest
+
Response message: GetAccountResponse
+

GetAccount retrieves information about an account based on the provided address.

+

GetValidator rpc

+
Request message: GetValidatorRequest
+
Response message: GetValidatorResponse
+

GetValidator retrieves information about a validator based on the provided address.

+

GetValidatorByNumber rpc

+ +
Response message: GetValidatorResponse
+

GetValidatorByNumber retrieves information about a validator based on the provided number.

+

GetValidatorAddresses rpc

+ + +

GetValidatorAddresses retrieves a list of all validator addresses.

+

GetPublicKey rpc

+
Request message: GetPublicKeyRequest
+
Response message: GetPublicKeyResponse
+

GetPublicKey retrieves the public key of an account based on the provided address.

+

Network Service network.proto

+

Network service provides RPCs for retrieving information about the network.

+

GetNetworkInfo rpc

+
Request message: GetNetworkInfoRequest
+
Response message: GetNetworkInfoResponse
+

GetNetworkInfo retrieves information about the overall network.

+

GetNodeInfo rpc

+
Request message: GetNodeInfoRequest
+
Response message: GetNodeInfoResponse
+

GetNodeInfo retrieves information about a specific node in the network.

+

Wallet Service wallet.proto

+

Define the Wallet service with various RPC methods for wallet management.

+

CreateWallet rpc

+
Request message: CreateWalletRequest
+
Response message: CreateWalletResponse
+

CreateWallet creates a new wallet with the specified parameters.

+

LoadWallet rpc

+
Request message: LoadWalletRequest
+
Response message: LoadWalletResponse
+

LoadWallet loads an existing wallet with the given name.

+

UnloadWallet rpc

+
Request message: UnloadWalletRequest
+
Response message: UnloadWalletResponse
+

UnloadWallet unloads a currently loaded wallet with the specified name.

+

LockWallet rpc

+
Request message: LockWalletRequest
+
Response message: LockWalletResponse
+

LockWallet locks a currently loaded wallet with the provided password and timeout.

+

UnlockWallet rpc

+
Request message: UnlockWalletRequest
+
Response message: UnlockWalletResponse
+

UnlockWallet unlocks a locked wallet with the provided password and timeout.

+

SignRawTransaction rpc

+
Request message: SignRawTransactionRequest
+
Response message: SignRawTransactionResponse
+

SignRawTransaction signs a raw transaction for a specified wallet.

+

GetValidatorAddress rpc

+ +
Response message: GetValidatorAddressResponse
+

GetValidatorAddress retrieves the validator address associated with a public key.

+

Messages and Enums

+

+BroadcastTransactionRequest +msg +

+

Request message for broadcasting a signed transaction.

+ + + + + + + + + + + + +
FieldTypeDescription
signed_raw_transaction + bytes + Signed raw transaction data.
+

+BroadcastTransactionResponse +msg +

+

Response message containing the ID of the broadcasted transaction.

+ + + + + + + + + + + + +
FieldTypeDescription
id + bytes + Transaction ID.
+

+CalculateFeeRequest +msg +

+

Request message for calculating transaction fee.

+ + + + + + + + + + + + + + + + + +
FieldTypeDescription
amount + int64 + Transaction amount.
payloadType + PayloadType + Type of transaction payload.
+

+CalculateFeeResponse +msg +

+

Response message containing the calculated transaction fee.

+ + + + + + + + + + + + +
FieldTypeDescription
fee + int64 + Calculated transaction fee.
+

+GetRawBondTransactionRequest +msg +

+

Request message for retrieving raw details of a bond transaction.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
lock_time + uint32 + Lock time for the transaction.
sender + string + Sender's address.
receiver + string + Receiver's address.
stake + int64 + Stake amount.
public_key + string + Public key of the validator.
fee + int64 + Transaction fee.
memo + string + Transaction memo.
+

+GetRawTransactionResponse +msg +

+

Response message containing raw transaction data.

+ + + + + + + + + + + + +
FieldTypeDescription
raw_transaction + bytes + Raw transaction data.
+

+GetRawTransferTransactionRequest +msg +

+

Request message for retrieving raw details of a transfer transaction.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
lock_time + uint32 + Lock time for the transaction.
sender + string + Sender's address.
receiver + string + Receiver's address.
amount + int64 + Transaction amount.
fee + int64 + Transaction fee.
memo + string + Transaction memo.
+

+GetRawUnBondTransactionRequest +msg +

+

Request message for retrieving raw details of an unbond transaction.

+ + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
lock_time + uint32 + Lock time for the transaction.
validator_address + string + Address of the validator to unbond from.
memo + string + Transaction memo.
+

+GetRawWithdrawTransactionRequest +msg +

+

Request message for retrieving raw details of a withdraw transaction.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
lock_time + uint32 + Lock time for the transaction.
validator_address + string + Address of the validator to withdraw from.
account_address + string + Address of the account to withdraw to.
fee + int64 + Transaction fee.
amount + int64 + Withdrawal amount.
memo + string + Transaction memo.
+

+GetTransactionRequest +msg +

+

Request message for retrieving transaction details.

+ + + + + + + + + + + + + + + + + +
FieldTypeDescription
id + bytes + Transaction ID.
verbosity + TransactionVerbosity + Verbosity level for transaction details.
+

+GetTransactionResponse +msg +

+

Response message containing details of a transaction.

+ + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
block_height + uint32 + Height of the block containing the transaction.
block_time + uint32 + Time of the block containing the transaction.
transaction + TransactionInfo + Information about the transaction.
+

+PayloadBond +msg +

+

Payload for a bond transaction.

+ + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
sender + string + Sender's address.
receiver + string + Receiver's address.
stake + int64 + Stake amount.
+

+PayloadSortition +msg +

+

Payload for a sortition transaction.

+ + + + + + + + + + + + + + + + + +
FieldTypeDescription
address + string + Address associated with the sortition.
proof + bytes + Proof for the sortition.
+

+PayloadTransfer +msg +

+

Payload for a transfer transaction.

+ + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
sender + string + Sender's address.
receiver + string + Receiver's address.
amount + int64 + Transaction amount.
+

+PayloadUnbond +msg +

+

Payload for an unbond transaction.

+ + + + + + + + + + + + +
FieldTypeDescription
validator + string + Address of the validator to unbond from.
+

+PayloadWithdraw +msg +

+

Payload for a withdraw transaction.

+ + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
from + string + Address to withdraw from.
to + string + Address to withdraw to.
amount + int64 + Withdrawal amount.
+

+TransactionInfo +msg +

+

Information about a transaction.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
id + bytes + Transaction ID.
data + bytes + Transaction data.
version + int32 + Transaction version.
lock_time + uint32 + Lock time for the transaction.
value + int64 + Transaction value.
fee + int64 + Transaction fee.
payloadType + PayloadType + Type of transaction payload.
transfer + PayloadTransfer + Transfer payload.
bond + PayloadBond + Bond payload.
sortition + PayloadSortition + Sortition payload.
unbond + PayloadUnbond + Unbond payload.
withdraw + PayloadWithdraw + Withdraw payload.
memo + string + Transaction memo.
public_key + string + Public key associated with the transaction.
signature + bytes + Transaction signature.
+

+AccountInfo +msg +

+

Message containing information about an account.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
hash + bytes + Hash of the account.
data + bytes + Account data.
number + int32 + Account number.
balance + int64 + Account balance.
address + string + Address of the account.
+

+BlockHeaderInfo +msg +

+

Message containing information about the header of a block.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
version + int32 + Block version.
prev_block_hash + bytes + Hash of the previous block.
state_root + bytes + State root of the block.
sortition_seed + bytes + Sortition seed of the block.
proposer_address + string + Address of the proposer of the block.
+

+CertificateInfo +msg +

+

Message containing information about a certificate.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
hash + bytes + Hash of the certificate.
round + int32 + Round of the certificate.
committersrepeated + int32 + List of committers in the certificate.
absenteesrepeated + int32 + List of absentees in the certificate.
signature + bytes + Certificate signature.
+

+ConsensusInfo +msg +

+

Message containing information about consensus.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
address + string + Address of the consensus instance.
Active + bool + Whether the consensus instance is active.
height + uint32 + Height of the consensus instance.
round + int32 + Round of the consensus instance.
votesrepeated + VoteInfo + List of votes in the consensus instance.
+

+GetAccountRequest +msg +

+

Message to request account information based on an address.

+ + + + + + + + + + + + +
FieldTypeDescription
address + string + Address of the account.
+

+GetAccountResponse +msg +

+

Message containing the response with account information.

+ + + + + + + + + + + + +
FieldTypeDescription
account + AccountInfo + Account information.
+

+GetBlockHashRequest +msg +

+

Message to request block hash based on height.

+ + + + + + + + + + + + +
FieldTypeDescription
height + uint32 + Height of the block.
+

+GetBlockHashResponse +msg +

+

Message containing the response with the block hash.

+ + + + + + + + + + + + +
FieldTypeDescription
hash + bytes + Hash of the block.
+

+GetBlockHeightRequest +msg +

+

Message to request block height based on hash.

+ + + + + + + + + + + + +
FieldTypeDescription
hash + bytes + Hash of the block.
+

+GetBlockHeightResponse +msg +

+

Message containing the response with the block height.

+ + + + + + + + + + + + +
FieldTypeDescription
height + uint32 + Height of the block.
+

+GetBlockRequest +msg +

+

Message to request block information based on height and verbosity.

+ + + + + + + + + + + + + + + + + +
FieldTypeDescription
height + uint32 + Height of the block.
verbosity + BlockVerbosity + Verbosity level for block information.
+

+GetBlockResponse +msg +

+

Message containing the response with block information.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
height + uint32 + Height of the block.
hash + bytes + Hash of the block.
data + bytes + Block data.
block_time + uint32 + Block timestamp.
header + BlockHeaderInfo + Block header information.
prev_cert + CertificateInfo + Certificate information of the previous block.
txsrepeated + TransactionInfo + List of transactions in the block.
+

+GetBlockchainInfoRequest +msg +

+

Message to request general information about the blockchain.

+

Message has no fields.

+

+GetBlockchainInfoResponse +msg +

+

Message containing the response with general blockchain information.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
last_block_height + uint32 + Height of the last block.
last_block_hash + bytes + Hash of the last block.
total_accounts + int32 + Total number of accounts.
total_validators + int32 + Total number of validators.
total_power + int64 + Total power in the blockchain.
committee_power + int64 + Power of the committee.
committee_validatorsrepeated + ValidatorInfo + List of committee validators.
+

+GetConsensusInfoRequest +msg +

+

Message to request consensus information.

+

Message has no fields.

+

+GetConsensusInfoResponse +msg +

+

Message containing the response with consensus information.

+ + + + + + + + + + + + +
FieldTypeDescription
instancesrepeated + ConsensusInfo + List of consensus instances.
+

+GetPublicKeyRequest +msg +

+

Message to request public key based on an address.

+ + + + + + + + + + + + +
FieldTypeDescription
address + string + Address for which public key is requested.
+

+GetPublicKeyResponse +msg +

+

Message containing the response with the public key.

+ + + + + + + + + + + + +
FieldTypeDescription
public_key + string + Public key of the account.
+

+GetValidatorAddressesRequest +msg +

+

Message to request validator addresses.

+

Message has no fields.

+

+GetValidatorAddressesResponse +msg +

+

Message containing the response with a list of validator addresses.

+ + + + + + + + + + + + +
FieldTypeDescription
addressesrepeated + string + List of validator addresses.
+

+GetValidatorByNumberRequest +msg +

+

Message to request validator information based on a validator number.

+ + + + + + + + + + + + +
FieldTypeDescription
number + int32 + Validator number.
+

+GetValidatorRequest +msg +

+

Message to request validator information based on an address.

+ + + + + + + + + + + + +
FieldTypeDescription
address + string + Address of the validator.
+

+GetValidatorResponse +msg +

+

Message containing the response with validator information.

+ + + + + + + + + + + + +
FieldTypeDescription
validator + ValidatorInfo + Validator information.
+

+ValidatorInfo +msg +

+

Message containing information about a validator.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
hash + bytes + Hash of the validator.
data + bytes + Validator data.
public_key + string + Public key of the validator.
number + int32 + Validator number.
stake + int64 + Validator stake.
last_bonding_height + uint32 + Last bonding height.
last_sortition_height + uint32 + Last sortition height.
unbonding_height + uint32 + Unbonding height.
address + string + Address of the validator.
availability_score + double + Availability score of the validator.
+

+VoteInfo +msg +

+

Message containing information about a vote.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
type + VoteType + Type of the vote.
voter + string + Voter's address.
block_hash + bytes + Hash of the block being voted on.
round + int32 + Round of the vote.
cp_round + int32 + Consensus round of the vote.
cp_value + int32 + Consensus value of the vote.
+

+GetNetworkInfoRequest +msg +

+

Request message for retrieving overall network information.

+

Message has no fields.

+

+GetNetworkInfoResponse +msg +

+

Response message containing information about the overall network.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
network_name + string + Name of the network.
total_sent_bytes + uint32 + Total bytes sent across the network.
total_received_bytes + uint32 + Total bytes received across the network.
connected_peers_count + uint32 + Number of connected peers.
connected_peersrepeated + PeerInfo + List of connected peers.
sent_bytesrepeated + GetNetworkInfoResponse.SentBytesEntry + Bytes sent per peer ID.
received_bytesrepeated + GetNetworkInfoResponse.ReceivedBytesEntry + Bytes received per peer ID.
+

+GetNetworkInfoResponse.ReceivedBytesEntry +msg +

+

+ + + + + + + + + + + + + + + + + +
FieldTypeDescription
key + uint32 +
value + uint64 +
+

+GetNetworkInfoResponse.SentBytesEntry +msg +

+

+ + + + + + + + + + + + + + + + + +
FieldTypeDescription
key + uint32 +
value + uint64 +
+

+GetNodeInfoRequest +msg +

+

Request message for retrieving information about a specific node in the network.

+

Message has no fields.

+

+GetNodeInfoResponse +msg +

+

Response message containing information about a specific node in the network.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
moniker + string + Moniker of the node.
agent + string + Agent information of the node.
peer_id + bytes + Peer ID of the node.
started_at + uint64 + Timestamp when the node started.
reachability + string + Reachability status of the node.
servicesrepeated + int32 + List of services provided by the node.
services_namesrepeated + string + Names of services provided by the node.
addrsrepeated + string + List of addresses associated with the node.
protocolsrepeated + string + List of protocols supported by the node.
+

+PeerInfo +msg +

+

Information about a peer in the network.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
status + int32 + Status of the peer.
moniker + string + Moniker of the peer.
agent + string + Agent information of the peer.
peer_id + bytes + Peer ID of the peer.
consensus_keysrepeated + string + Consensus keys used by the peer.
consensus_addressrepeated + string + Consensus address of the peer.
services + uint32 + Services provided by the peer.
last_block_hash + bytes + Hash of the last block the peer knows.
height + uint32 + Height of the peer in the blockchain.
received_messages + int32 + Count of received messages.
invalid_messages + int32 + Count of invalid messages received.
last_sent + int64 + Timestamp of the last sent message.
last_received + int64 + Timestamp of the last received message.
sent_bytesrepeated + PeerInfo.SentBytesEntry + Bytes sent per message type.
received_bytesrepeated + PeerInfo.ReceivedBytesEntry + Bytes received per message type.
address + string + Network address of the peer.
direction + string + Direction of connection with the peer.
protocolsrepeated + string + List of protocols supported by the peer.
total_sessions + int32 + Total sessions with the peer.
completed_sessions + int32 + Completed sessions with the peer.
+

+PeerInfo.ReceivedBytesEntry +msg +

+

+ + + + + + + + + + + + + + + + + +
FieldTypeDescription
key + int32 +
value + int64 +
+

+PeerInfo.SentBytesEntry +msg +

+

+ + + + + + + + + + + + + + + + + +
FieldTypeDescription
key + int32 +
value + int64 +
+

+CreateWalletRequest +msg +

+

Request message for creating a new wallet.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
wallet_name + string + Name of the new wallet.
mnemonic + string + Mnemonic for wallet recovery.
language + string + Language for the mnemonic.
password + string + Password for securing the wallet.
+

+CreateWalletResponse +msg +

+

Response message containing the name of the created wallet.

+ + + + + + + + + + + + +
FieldTypeDescription
wallet_name + string + Name of the created wallet.
+

+GetValidatorAddressRequest +msg +

+

Request message for obtaining the validator address associated with a public key.

+ + + + + + + + + + + + +
FieldTypeDescription
public_key + string + Public key for which the validator address is requested.
+

+GetValidatorAddressResponse +msg +

+

Response message containing the validator address corresponding to a public key.

+ + + + + + + + + + + + +
FieldTypeDescription
address + string + Validator address associated with the public key.
+

+LoadWalletRequest +msg +

+

Request message for loading an existing wallet.

+ + + + + + + + + + + + +
FieldTypeDescription
wallet_name + string + Name of the wallet to load.
+

+LoadWalletResponse +msg +

+

Response message containing the name of the loaded wallet.

+ + + + + + + + + + + + +
FieldTypeDescription
wallet_name + string + Name of the loaded wallet.
+

+LockWalletRequest +msg +

+

Request message for locking a currently loaded wallet.

+ + + + + + + + + + + + +
FieldTypeDescription
wallet_name + string + Name of the wallet to lock.
+

+LockWalletResponse +msg +

+

Response message containing the name of the locked wallet.

+ + + + + + + + + + + + +
FieldTypeDescription
wallet_name + string + Name of the locked wallet.
+

+SignRawTransactionRequest +msg +

+

Request message for signing a raw transaction.

+ + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
wallet_name + string + Name of the wallet used for signing.
raw_transaction + bytes + Raw transaction data to be signed.
password + string + Password for unlocking the wallet for signing.
+

+SignRawTransactionResponse +msg +

+

Response message containing the transaction ID and signed raw transaction.

+ + + + + + + + + + + + + + + + + +
FieldTypeDescription
transaction_id + bytes + ID of the signed transaction.
signed_raw_transaction + bytes + Signed raw transaction data.
+

+UnloadWalletRequest +msg +

+

Request message for unloading a currently loaded wallet.

+ + + + + + + + + + + + +
FieldTypeDescription
wallet_name + string + Name of the wallet to unload.
+

+UnloadWalletResponse +msg +

+

Response message containing the name of the unloaded wallet.

+ + + + + + + + + + + + +
FieldTypeDescription
wallet_name + string + Name of the unloaded wallet.
+

+UnlockWalletRequest +msg +

+

Request message for unlocking a wallet.

+ + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
wallet_name + string + Name of the wallet to unlock.
password + string + Password for unlocking the wallet.
timeout + int32 + Timeout duration for the unlocked state.
+

+UnlockWalletResponse +msg +

+

Response message containing the name of the unlocked wallet.

+ + + + + + + + + + + + +
FieldTypeDescription
wallet_name + string + Name of the unlocked wallet.
+ +

+PayloadType +enum +

+

Enumeration for different types of transaction payloads.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameNumberDescription
UNKNOWN0Unknown payload type.
TRANSFER_PAYLOAD1Transfer payload type.
BOND_PAYLOAD2Bond payload type.
SORTITION_PAYLOAD3Sortition payload type.
UNBOND_PAYLOAD4Unbond payload type.
WITHDRAW_PAYLOAD5Withdraw payload type.
+

+TransactionVerbosity +enum +

+

Enumeration for verbosity level when requesting transaction details.

+ + + + + + + + + + + + + + + + + + + +
NameNumberDescription
TRANSACTION_DATA0Request only transaction data.
TRANSACTION_INFO1Request detailed transaction information.
+

+BlockVerbosity +enum +

+

Enumeration for verbosity level when requesting block information.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameNumberDescription
BLOCK_DATA0Request block data only.
BLOCK_INFO1Request block information only.
BLOCK_TRANSACTIONS2Request block transactions only.
+

+VoteType +enum +

+

Enumeration for types of votes.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameNumberDescription
VOTE_UNKNOWN0Unknown vote type.
VOTE_PREPARE1Prepare vote type.
VOTE_PRECOMMIT2Precommit vote type.
VOTE_CHANGE_PROPOSER3Change proposer vote type.
+ +

Scalar Value Types

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
.proto TypeC++JavaPythonGoC#PHP
doubledoubledoublefloatfloat64doublefloat
floatfloatfloatfloatfloat32floatfloat
int32int32intintint32intinteger
int64int64longint/longint64longinteger/string
uint32uint32intint/longuint32uintinteger
uint64uint64longint/longuint64ulonginteger/string
sint32int32intintint32intinteger
sint64int64longint/longint64longinteger/string
fixed32uint32intintuint32uintinteger
fixed64uint64longint/longuint64ulonginteger/string
sfixed32int32intintint32intinteger
sfixed64int64longint/longint64longinteger/string
boolboolbooleanbooleanboolboolboolean
stringstringStringstr/unicodestringstringstring
bytesstringByteStringstr[]byteByteStringstring
+ +
+
+
+ + + + + diff --git a/ar/learn/blockchain/account/index.html b/ar/learn/blockchain/account/index.html new file mode 100644 index 000000000..2bee30928 --- /dev/null +++ b/ar/learn/blockchain/account/index.html @@ -0,0 +1,663 @@ + + + + + + + + + + + + + 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 in the Pactus blockchain that holds 21 million coins at the genesis time. +The treasury address is defined as: 000000000000000000000000000000000000000000. +The address type is 0, and therefore, +it doesn’t have any key pair associated with it. +Every time a block is created, one coin from the Treasury account transfers to the proposer account as a block reward.

+ +
+
+
+ + + + + diff --git a/ar/learn/blockchain/address/index.html b/ar/learn/blockchain/address/index.html new file mode 100644 index 000000000..4406fb6d5 --- /dev/null +++ b/ar/learn/blockchain/address/index.html @@ -0,0 +1,670 @@ + + + + + + + + + + + + + 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..c720ef4e3 --- /dev/null +++ b/ar/learn/blockchain/block/index.html @@ -0,0 +1,786 @@ + + + + + + + + + + + + + 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..ce8834821 --- /dev/null +++ b/ar/learn/blockchain/cryptography/index.html @@ -0,0 +1,649 @@ + + + + + + + + + + + + + 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..7dd5c23b7 --- /dev/null +++ b/ar/learn/blockchain/genesis/index.html @@ -0,0 +1,671 @@ + + + + + + + + + + + + + Genesis | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Genesis

+ +

The Pactus blockchain starts from scratch, with no pre-existing accounts or pre-allocated coins. +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 51 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 +holds 21 million coins at the genesis time. Each coin is divided into 1 billion units.
  • +
  • Reserved Accounts: Reserved account are defined at the Genesis time and at total they have 21 milion coins. +These coins are reserved and the main purpise is to support the project over time.
  • +
  • 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..a58abcf2b --- /dev/null +++ b/ar/learn/blockchain/incentive/index.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + Incentive | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Incentive

+ +
+

The incentive may help encourage nodes to stay honest.

+ +

Satoshi Nakamoto

+
+ +

In Pactus, rewards are given to validators for collecting valid transactions and creating new blocks. +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 42,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..a0cc516f7 --- /dev/null +++ b/ar/learn/blockchain/serialization/index.html @@ -0,0 +1,774 @@ + + + + + + + + + + + + + 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..a965c07ea --- /dev/null +++ b/ar/learn/blockchain/state-hash/index.html @@ -0,0 +1,681 @@ + + + + + + + + + + + + + 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..8c7207c01 --- /dev/null +++ b/ar/learn/blockchain/validator/index.html @@ -0,0 +1,677 @@ + + + + + + + + + + + + + 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..495698223 --- /dev/null +++ b/ar/learn/consensus/committee/index.html @@ -0,0 +1,765 @@ + + + + + + + + + + + + + Committee | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Committee

+ +

The committee is a group of 51 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 51 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 51. +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 51 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%51357\(3.34 \times 10^{-14}\)
15%996714\(1.41 \times 10^{-24}\)
10%21152\(3.39 \times 10^{-09}\)
10%51355\(1.90 \times 10^{-18}\)
10%99679\(2.91 \times 10^{-35}\)
5%21151\(2.81 \times 10^{-13}\)
5%51352\(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..4ffc5d29b --- /dev/null +++ b/ar/learn/consensus/parameters/index.html @@ -0,0 +1,663 @@ + + + + + + + + + + + + + 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 51 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..8145c7525 --- /dev/null +++ b/ar/learn/consensus/proof-of-stake/index.html @@ -0,0 +1,684 @@ + + + + + + + + + + + + + Solid State Proof of Stake | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Solid State 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..f0f3ea67f --- /dev/null +++ b/ar/learn/consensus/protocol/index.html @@ -0,0 +1,885 @@ + + + + + + + + + + + + + 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+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..974ffd019 --- /dev/null +++ b/ar/learn/consensus/sortition/index.html @@ -0,0 +1,781 @@ + + + + + + + + + + + + + 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..8e3013f27 --- /dev/null +++ b/ar/learn/consensus/specification/index.html @@ -0,0 +1,661 @@ + + + + + + + + + + + + + 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..fb27e2fcc --- /dev/null +++ b/ar/learn/index.html @@ -0,0 +1,502 @@ + + + + + + + + + + + + + تعلم | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+

تعلم

+ +

هنا يمكنك العثور على الوثائق التقنية لمشروع بكتوس.

+ +

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..43d6b982d --- /dev/null +++ b/ar/learn/smart-contract/storage/index.html @@ -0,0 +1,738 @@ + + + + + + + + + + + + + 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..e8ed32d47 --- /dev/null +++ b/ar/learn/transaction/bond/index.html @@ -0,0 +1,669 @@ + + + + + + + + + + + + + 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
VariantAmount
+ +
    +
  • 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..6e6a1e22e --- /dev/null +++ b/ar/learn/transaction/fee/index.html @@ -0,0 +1,671 @@ + + + + + + + + + + + + + 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..c8c52b925 --- /dev/null +++ b/ar/learn/transaction/format/index.html @@ -0,0 +1,708 @@ + + + + + + + + + + + + + Transaction Format | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Transaction Format

+ +

Transactions in Pactus consists the following fields:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SizeField
1 byteVersion
4 bytesLock Time
VariantFee
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..f39fc8f52 --- /dev/null +++ b/ar/learn/transaction/sortition/index.html @@ -0,0 +1,659 @@ + + + + + + + + + + + + + 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..fc243f6ac --- /dev/null +++ b/ar/learn/transaction/transfer/index.html @@ -0,0 +1,673 @@ + + + + + + + + + + + + + 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
VariantAmount
+ +
    +
  • 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..f2ebd0237 --- /dev/null +++ b/ar/learn/transaction/unbond/index.html @@ -0,0 +1,650 @@ + + + + + + + + + + + + + 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..92d53e4f7 --- /dev/null +++ b/ar/learn/transaction/withdraw/index.html @@ -0,0 +1,659 @@ + + + + + + + + + + + + + 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
VariantAmount
+ +
    +
  • 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..0c9b8774d --- /dev/null +++ b/ar/sitemap.xml @@ -0,0 +1,272 @@ + + + +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/29/release-0-16-0.html +2023-10-29T00:00:00+00:00 + + +https://pactus.org/2023/11/12/release-0-17-0.html +2023-11-12T00:00:00+00:00 + + +https://pactus.org/2023/12/12/release-0-18-0.html +2023-12-12T00:00:00+00:00 + + +https://pactus.org/2024/01/04/release-0-19-0.html +2024-01-04T00:00:00+00:00 + + +https://pactus.org/2024/01/08/mainnet-announcement.html +2024-01-08T00:00:00+00:00 + + +https://pactus.org/2024/01/10/pactus-records-its-ips-in-ipminter.html +2024-01-10T00:00:00+00:00 + + +https://pactus.org/2024/01/11/release-0-20-0.html +2024-01-11T00:00:00+00:00 + + +https://pactus.org/2024/01/22/testnet-2-concluded.html +2024-01-22T00:00:00+00:00 + + +https://pactus.org/2024/01/24/mainnet-launched.html +2024-01-24T20:24:00+00:00 + + +https://pactus.org/2024/01/31/release-1-0-0.html +2024-01-31T00:00:00+00:00 + + +https://pactus.org/2024/02/10/release-1-0-1.html +2024-02-10T00:00:00+00:00 + + +https://pactus.org/2024/02/18/release-1-0-2.html +2024-02-18T00:00:00+00:00 + + +https://pactus.org/blog/ + + +https://pactus.org/ + + +https://pactus.org/community/ + + +https://pactus.org/contributing/ + + +https://pactus.org/user-guides/run-pactus-docker/ + + +https://pactus.org/user-guides/send-transactions-gui/ + + +https://pactus.org/user-guides/grpc-sign-transactions/ + + +https://pactus.org/user-guides/reduce-network/ + + +https://pactus.org/user-guides/run-pactus-cli/ + + +https://pactus.org/user-guides/run-pactus-metrics/ + + +https://pactus.org/user-guides/run-pactus-gui/ + + +https://pactus.org/user-guides/use-wallet-cli/ + + +https://pactus.org/user-guides/ + + +https://pactus.org/download/ + + +https://pactus.org/term-of-use/ + + +https://pactus.org/about/what-is-pactus/ + + +https://pactus.org/about/roadmap/ + + +https://pactus.org/about/faq/ + + +https://pactus.org/learn/blockchain/block/ + + +https://pactus.org/learn/blockchain/state-hash/ + + +https://pactus.org/learn/blockchain/account/ + + +https://pactus.org/learn/blockchain/genesis/ + + +https://pactus.org/learn/blockchain/validator/ + + +https://pactus.org/learn/blockchain/cryptography/ + + +https://pactus.org/learn/blockchain/address/ + + +https://pactus.org/learn/blockchain/incentive/ + + +https://pactus.org/learn/blockchain/serialization/ + + +https://pactus.org/learn/consensus/specification/ + + +https://pactus.org/learn/consensus/proof-of-stake/ + + +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/smart-contract/storage/ + + +https://pactus.org/learn/transaction/transfer/ + + +https://pactus.org/learn/transaction/fee/ + + +https://pactus.org/learn/transaction/withdraw/ + + +https://pactus.org/learn/transaction/unbond/ + + +https://pactus.org/learn/transaction/bond/ + + +https://pactus.org/learn/transaction/format/ + + +https://pactus.org/learn/transaction/sortition/ + + +https://pactus.org/learn/api/grpc/ + + +https://pactus.org/learn/ + + diff --git a/ar/term-of-use/index.html b/ar/term-of-use/index.html new file mode 100644 index 000000000..d7a0bdc22 --- /dev/null +++ b/ar/term-of-use/index.html @@ -0,0 +1,560 @@ + + + + + + + + + + + + + Term of Use | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+

Terms of Use

+ +

Welcome to Pactus.

+ +

By using our website or services, you agree to these Terms of Use (“Terms”). +Please review them carefully. +If you do not accept the Terms, please do not use our website or services.

+ +

We may update the Terms occasionally. +Your continued use of our website or services after any changes means you accept the updates. +If you do not agree to the updates, please stop using our website and services.

+ +

“We,” “us,” “our,” and “Pactus” refer to the Pactus Blockchain Project. “You” refers to each user of our +website or services.

+ +

Website Access and Modifications

+ +

We strive to provide continuous website access but cannot guarantee uninterrupted or error-free service. +Pactus is not liable for any inaccessible features or website unavailability.

+ +

We may modify, expand, limit, or discontinue any part of the website or +services at any time to accommodate users or for other reasons, without notice. +We reserve the right to suspend website access temporarily or permanently, at our discretion, without notice.

+ +

Users may need to update their computer hardware or software to access some website content or features. +Pactus is not responsible for any inability to access the website or services due to user systems, +internet networks, or other causes.

+ +

Age Limit

+ +

Our website and services are not intended for those under 18. +If you are under 18, you may only use this website with the supervision of a parent, guardian, or other responsible adult.

+ +

No Personalized Advice

+ +

This website does not provide individualized legal, tax, financial, or investment advice. +Since everyone’s situation is different, we recommend consulting a qualified professional for financial decisions.

+ +

PAC coin is meant to be used as a medium of exchange. +Nothing on this website should be considered investment advice or a solicitation to +buy, hold, invest in, own, or use PAC coin.

+ +

No Content Guarantees

+ +

We cannot guarantee the accuracy, completeness, or quality of the information on this website. +All content is provided on an “as is” and “as available” basis, and use is at your own risk.

+ +

The content may be sourced from third parties. +Pactus is not responsible for any errors, omissions, or inaccuracies. +The information may not suit everyone and may only apply to certain regions.

+ +

It is your responsibility to evaluate if the information and services are technically and legally suitable for +your intended use and comply with applicable laws. +Always verify any information before using it for personal, financial, or business purposes.

+ +

We may modify website content and services at any time without notice. +We are not obligated to inform you of any changes or corrections.

+ +

External Content

+ +

Any testimonials, opinions, advice, offers, or other third party content on this website reflect the views +and intentions of those parties/people only. +They do not represent the views of Pactus.

+ +

We do not guarantee the accuracy, completeness, reliability, or usefulness of external content. +Users are responsible for assessing external content. +Pactus is not liable for any damage or loss from relying on or using third party content.

+ +

User Generated Content

+ +

By posting or submitting any material to this website, including the forum, you grant Pactus a +worldwide, fully paid-up, non-exclusive license to edit and display your materials on our website and +social media platforms as we deem appropriate.

+ +

You agree to indemnify and hold harmless Pactus and its Users from any third-party claims arising from +your materials. +You also represent that you own or have the right to post the materials, that they are +accurate, their use on the Pactus website complies with laws, and they will not cause harm to any +person.

+ +

Pactus has the right to remove any materials we deem objectionable, offensive, illegal, harmful, or in +violation of these Terms. +We may disclose user information if legally required.

+ +

Please contact info@pactus.org to request the removal of your posted content for reasons such as +privacy concerns, copyright issues, or no longer wanting your content to appear publicly. +We will review removal requests on a case-by-case basis.

+ +

File Safety and Security

+ +

Pactus implements measures to protect downloadable files on our website but cannot guarantee they +are free of infections, viruses, or harmful code.

+ +

We are also not responsible if users’ devices are infected by visiting our website or downloading files in +the event of a security breach.

+ +

If uncertain, users should consider compiling Pactus from the provided source code. +Users are responsible for meeting their own security requirements.

+ + + +

Pactus works with reputable partners, but does not endorse or take responsibility for sponsored content claims. +We do not review, recommend, or endorse any products or services promoted on our site.

+ +

Pactus is not liable for damages from misuse of personal information given to sponsors. +We are also not responsible for losses from using sponsor links or services on our site.

+ + + +

For user convenience, our website may contain links to external sites and resources. +However, we do not control these external sites and are not responsible for +their content, products, services, or information.

+ +

Link inclusion does not imply Pactus endorsement or affiliation. +Users should be aware they may leave our website by clicking links. +External site terms of use may differ from ours.Pactus is not responsible for +losses from users following links to external sites. +We encourage caution and reviewing external sites’ terms and policies before transacting or engaging.

+ +

Electronic Communications

+ +

Our website responses and email communications will be delivered electronically. +Pactus reserves the right to disclose any user emails or objectionable material +to comply with legal processes or protect the +rights and property of Pactus, its customers, suppliers, and users.

+ +

No Financial Services

+ +

This website does not engage in storing, selling, buying, sending, or receiving Pactus coins. +All activities related to owning and transferring Pactus coins occur on the DEX/CEX/decentralized Pactus network. +This website does not actively participate in that network.

+ +

No Liability

+ +

Pactus assumes no liability for any damages, claims, or losses related to using Pactus. +This includes third party actions or inactions and events.

+ +

It includes but is not limited to: security issues when using Pactus software/services, technical problems +when using Pactus software/services, software or data corruption when using Pactus software/services, +or user errors when using Pactus software/services.

+ +

Disclaimer of Warranties

+ +

Pactus expressly disclaims all warranties, representations, and conditions, whether express or implied, +including but not limited to the implied warranties and conditions of merchantability, fitness for a +particular purpose, and non-infringement.

+ +

This disclaimer extends to the use of this website and its services, as well as the accuracy, completeness, +timeliness, or currentness of its content, in any manner and for any purpose.

+ +

No Consequential Damages

+ +

Under no circumstances will Pactus be liable for any incidental, special, consequential, exemplary, +indirect, or other damages arising from use of this website, its services, or content. +This includes but is not limited to data loss, even if advised of such damage possibilities.

+ +

This disclaimer applies whether based on contract, tort, negligence, product liability, strict liability, or otherwise. +It extends to all potential scenarios and circumstances.

+ +

General

+ +

These Terms of Use (TOU) and any applicable Terms of Service are the full agreement for website use by +users and Pactus. They replace previous agreements.

+ +

If Pactus or a user does not exercise a TOU right, this does not waive the right. If a TOU provision is +invalid, the rest remain valid.

+ +

The TOU and Terms of Service are intentionally in English, the governing language for Pactus and users.

+ + + +

Attributed Content

+ +

Logos for operating systems, platforms, and sponsors we support are copyrighted by their respective owners. +Pactus does not own these copyrights but uses the logos with permission or in a clear, non- harmful way.

+ +

Privacy Policy

+ +

Data Collection and Use

+ +

We collect standard server logs from our website. +This data helps provide site statistics, improve content and information flow, analyze errors, and diagnose dead links. +A segment of server logs gathers download statistics to better understand user needs.

+ +
    +
  • Last update: 25 January 2024
  • +
+ +
+
+
+
+ + + + + diff --git a/ar/user-guides/grpc-sign-transactions/index.html b/ar/user-guides/grpc-sign-transactions/index.html new file mode 100644 index 000000000..c7031655f --- /dev/null +++ b/ar/user-guides/grpc-sign-transactions/index.html @@ -0,0 +1,523 @@ + + + + + + + + + + + + + How to sign transaction using gRPC? | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

How to sign transaction using gRPC?

+ +

Preface

+ +

The Pactus Blockchain provides a gRPC interface that allows users to interact with the blockchain and native wallet. +This is ideal for merchants and users who want to create, sign, and broadcast transactions using their local node. +This tutorial will guide you step-by-step on how to use gRPC to sign transactions.

+ +

Setup node

+ +

Initialize the node

+ +

To follow along with this tutorial, you’ll first need to set up and run a localnet blockchain, which is suitable for testing:

+ +
./build/pactus-daemon init \
+  --localnet \
+  --working-dir ./pactus-localnet \
+  --password "super-secret-password" \
+  --val-num 7 \
+  --restore "fish cool avoid history kitten quick olive purchase blossom grocery cool treat"
+
+ +

This command initializes a Pactus blockchain as a localnet. +The purpose of this network is for testing. +The above command actually restores a node from the given mnemonic. +This helps you to create the same wallet with this tutorial. The first two addresses in this wallet are:

+ +
tpc1zhv2hq30rnu9lkjusgwqk4f5qfdr72sd2mndnn6
+tpc1zsrvuvn0j80vc3we5q44apjrv8j7ta5807z7xc7
+
+ +

We are going to transfer 1 PAC from the first account to the second one.

+ +

Run the node

+ +

Now you can run the node simply with this command:

+ +
./build/pactus-daemon start \
+  --working-dir ./pactus-localnet \
+  --password "super-secret-password"
+
+ +

By running the node, you will see that it starts creating blocks, and +therefore the reward account address will be rewarded locally. +We can use this balance for testing purposes.

+ +

Interact with the node

+ +

Open another terminal and run the following command:

+ +
./pactus-ctl --server-addr localhost:50052 \
+  blockchain get-blockchain-info
+
+ +

It should print information about the localnet blockchain. +The pactus-ctl application uses gRPC to interact with the blockchain. +In this tutorial, we use pactus-ctl to interact with the blockchain. +You can either use gRPC-gateway REST APIs or make direct gRPC calls to interact with the node. +They are more or less similar and all interact with the node using gRPC endpoints.

+ +

Signing Transitions

+ +

Create raw transaction

+ +

To sign a transaction, we first need to create a raw transaction and then sign it. +We can use the get_raw_transfer_transaction method to create a raw transfer transaction. +Similar methods can be used to create raw bond, unbond, and withdraw transactions.

+ +
./pactus-ctl --server-addr localhost:50052 \
+  transaction get-raw-transfer-transaction \
+    --sender tpc1zhv2hq30rnu9lkjusgwqk4f5qfdr72sd2mndnn6 \
+    --receiver tpc1zsrvuvn0j80vc3we5q44apjrv8j7ta5807z7xc7 \
+    --amount 1
+{
+  "rawTransaction":  "AgGWBQAA6AcAAQK7FXBF458L+0uQQ4FqpoBLR+VBqgKA2cZN8jvZiLs0BWvQyGw8vL7Q7wE="
+}
+
+ +

The sender account is the first reward address in the wallet, therefore it should have some coins in its account.

+ +

Please note that the amount here is in atomic units. +There is a Working-In-Progress PR to accept and return all amounts in PAC units (10^9).

+ +

Sign transaction

+ +

Now you can sign this raw transaction. To sign a transaction, first, we need to load a wallet. +At the time of writing this document, Pactus only supports the “default_wallet”. +Soon, creating wallets through gRPC and loading them will be supported.

+ +
./pactus-ctl --server-addr localhost:50052 \
+  wallet load-wallet --wallet-name "default_wallet"
+{
+  "walletName":  "default_wallet"
+}
+
+ +

Now that the “default_wallet” is loaded, we can proceed to sign the raw transaction:

+ +
./pactus-ctl --server-addr localhost:50052 \
+  wallet sign-raw-transaction \
+    --wallet-name "default_wallet" \
+    --password "super-secret-password" \
+    --raw-transaction "AgGWBQAA6AcAAQK7FXBF458L+0uQQ4FqpoBLR+VBqgKA2cZN8jvZiLs0BWvQyGw8vL7Q7wE="
+{
+  "transactionId": "JZqOnVq87eWBd67LvF1bYIYiXjy/orru/vSmrir9iGA=",
+  "signedRawTransaction": "AAGWBQAA6AcAAQK7FXBF458L+0uQQ4FqpoBLR+VBqgKA2cZN8jvZiLs0BWvQyGw8vL7Q7wG0VVIZZ6CfW7J91B0lcw8Ji7+hgRbB88uT8pWyxf9cTqWGLL3sIbnNA1zQol+GtO6C645tYQYi6FWxtOcgYuurrsTapgSa911ZBuToQxJ8D5hj/BPqBiAtfMFwSWlXXbUKr4CGOCCPsA+IEAY0zVpxFa/bl3VMcZF4mgeAoJLZ3hcjz2leLJG9oVvNdwqvu0U="
+}
+
+ +

Transaction successfully signed.

+ +

Broadcast signed transaction

+ +

Now you can broadcast the signed transaction:

+ +
./pactus-ctl --server-addr localhost:50052 \
+  transaction broadcast-transaction \
+    --signed-raw-transaction "AAGWBQAA6AcAAQK7FXBF458L+0uQQ4FqpoBLR+VBqgKA2cZN8jvZiLs0BWvQyGw8vL7Q7wG0VVIZZ6CfW7J91B0lcw8Ji7+hgRbB88uT8pWyxf9cTqWGLL3sIbnNA1zQol+GtO6C645tYQYi6FWxtOcgYuurrsTapgSa911ZBuToQxJ8D5hj/BPqBiAtfMFwSWlXXbUKr4CGOCCPsA+IEAY0zVpxFa/bl3VMcZF4mgeAoJLZ3hcjz2leLJG9oVvNdwqvu0U="
+{
+  "id": "JZqOnVq87eWBd67LvF1bYIYiXjy/orru/vSmrir9iGA="
+}
+
+ +

Transaction successfully broadcasted.

+ +

Production Security Considerations

+ +

In this tutorial, we utilized a localnet version of Pactus. +For production purposes, you’ll need to set up the node for the Mainnet and synchronize it with the network. +Additionally, in production, the wallet service is disabled by default. +You can enable the wallet service in the configuration file.

+ +

When signing transactions in production, you need to prioritize the security of the wallet. +Make sure you have set a strong password for the native wallet. +Ensure that it is called on localhost for safety. +If you intend to call it on a remote server, there are several security measures to consider:

+ +
    +
  • Ensure SSL is installed using Nginx to secure the connections.
  • +
  • Secure the API using a password (currently under development; see here: PIP-20).
  • +
+ + + + + +
+
+
+
+ + + + + diff --git a/ar/user-guides/index.html b/ar/user-guides/index.html new file mode 100644 index 000000000..c4c04cd63 --- /dev/null +++ b/ar/user-guides/index.html @@ -0,0 +1,387 @@ + + + + + + + + + + + + + دلائل المستخدم | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + diff --git a/ar/user-guides/reduce-network/index.html b/ar/user-guides/reduce-network/index.html new file mode 100644 index 000000000..0aa7d82f9 --- /dev/null +++ b/ar/user-guides/reduce-network/index.html @@ -0,0 +1,418 @@ + + + + + + + + + + + + + How to reduce the network usage? | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

How to reduce the network usage?

+ +

Preface

+ +

Pactus is designed for low traffic usage. +However, some users still face bandwidth limitations imposed by their Internet Service Providers (ISPs). +This guide will explore effective ways to reduce networking usage for a Pactus node.

+ +

Reducing the number of connection

+ +

By default, Pactus attempts to maintain 64 open connections with other nodes, +split into 32 inbound and 32 outbound connections. +To reduce networking usage, you can decrease this maximum number of connections. +However, it’s important to remember that more connections with +peers usually enable the node to function more effectively and securely. +The max_connections setting in the config file can be adjusted to manage the maximum number of connections.

+ +

Disabling Relay

+ +

A relay connection is a type of connection that can be established between two peers, +usually behind a NAT, by a third-party peer known as a relay. +This is especially helpful when users run Pactus on a private network like home internet. +However, the relay connection is not as stable as a direct connection. +Disabling the relay connection may reduce network usage. +If you have a reliable and public IP address, you can disable the relay connection. +The relay connection is enabled by default. To disable the relay connection, +set enable_relay to false inside the config file.

+ +

Disabling Node-Network service

+ +

A node-network is a type of node that provides historical data, such as blocks, +to other nodes so they can sync with the network. +By default, this service is enabled. +Disabling this service helps reduce traffic usage. +Keep in mind that new nodes rely on other nodes to be able to sync. +To disable the node-network service, set node_network to false.

+ + + + + +
+
+
+
+ + + + + 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..e7efd71dd --- /dev/null +++ b/ar/user-guides/run-pactus-cli/index.html @@ -0,0 +1,545 @@ + + + + + + + + + + + + + كيفية تشغيل بكتوس في وضع سطر الأوامر؟ | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

كيفية تشغيل بكتوس في وضع سطر الأوامر؟

+ + +

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..a421a5e87 --- /dev/null +++ b/ar/user-guides/run-pactus-docker/index.html @@ -0,0 +1,559 @@ + + + + + + + + + + + + + كيفية تشغيل بكتوس باستخدام دوكر؟ | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

كيفية تشغيل بكتوس باستخدام دوكر؟

+ + +

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..dee6ba6eb 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..3a50c2f34 --- /dev/null +++ b/ar/user-guides/run-pactus-gui/index.html @@ -0,0 +1,526 @@ + + + + + + + + + + + + + كيفية تشغيل بكتوس في الوضع الرسومي؟ | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

كيفية تشغيل بكتوس في الوضع الرسومي؟

+ + +

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..0f9f69d90 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..d11797b50 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/run-pactus-metrics/index.html b/ar/user-guides/run-pactus-metrics/index.html new file mode 100644 index 000000000..894a13b4d --- /dev/null +++ b/ar/user-guides/run-pactus-metrics/index.html @@ -0,0 +1,520 @@ + + + + + + + + + + + + + How to run Pactus Metrics? | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

How to run Pactus Metrics?

+ +

Preface

+ +

Pactus can be run with metrics, providing you with the ability to monitor your node. +This tutorial will guide you through the steps to run Pactus with metrics, suitable for advanced users.

+ +

Prerequisites

+ +

Before proceeding with the steps below, ensure that you have the following:

+ + + +

Configure Pactus Node for Metrics

+ +

To Configure the Pactus Node for Metrics, navigate to the Pactus directory; by default, it’s located at the following path.

+ +
/home/YourUsername/pactus
+
+ +

There’s a file named config.toml that contains all the configurations for your node. +There are two parameters that you should enable for metrics: the first is enable_metrics, +and the second is enable http. After editing the config.toml you should restart your node. +The metrics now can be accessed at http://localhost:80/metrics/prometheus (this url going to be use by prometheus).

+ +
+ +if you are running Pactus with docker image, make sure to expose :80 port. + +
+ +
+ +

Configure Grafana And Prometheus

+ +

You should run Grafana and Prometheus for gathering metrics and displaying them in charts. +First, create a directory named prometheus-grafana. Inside the directory, +create a docker-compose.yml file and paste the code below.

+ +
services:
+  prometheus:
+    image: prom/prometheus
+    container_name: prometheus
+    command:
+      - "--config.file=/etc/prometheus/prometheus.yml"
+    ports:
+      - 9090:9090
+    restart: unless-stopped
+    volumes:
+      - ./prometheus:/etc/prometheus
+      - prom_data:/prometheus
+  grafana:
+    image: grafana/grafana
+    container_name: grafana
+    ports:
+      - 3000:3000
+    restart: unless-stopped
+    environment:
+      - GF_SECURITY_ADMIN_USER=admin
+      - GF_SECURITY_ADMIN_PASSWORD=admin
+    volumes:
+      - ./grafana:/etc/grafana/provisioning/datasources
+volumes: prom_data
+
+ +

You can change the default username and password of Grafana by modifying the values of GF_SECURITY_ADMIN_USER and GF_SECURITY_ADMIN_PASSWORD. +Now, save the file. Then, in the current directory (meaning you are inside the prometheus-grafana directory), +create another directory named grafana. Then, go to the directory. So now you’re in the path /prometheus-grafana/grafana/. +In the current directory, create a file named datasource.yml and paste the code below there.

+ +
apiVersion: 1
+
+datasources:
+  - name: Prometheus
+    type: prometheus
+    url: http://prometheus:9090
+    isDefault: true
+    access: proxy
+    editable: true
+
+ +

Then save the file and exit. +Now, we should go up one directory level from the current directory and navigate to the /prometheus-grafana directory. +In the current directory, which is /prometheus-grafana, create another directory named prometheus, +then go into the directory.In the prometheus directory create a file named prometheus.yml and paste below code there.

+ +
global:
+  scrape_interval: 15s
+  scrape_timeout: 10s
+  evaluation_interval: 15s
+alerting:
+  alertmanagers:
+    - static_configs:
+        - targets: []
+      scheme: http
+      timeout: 10s
+      api_version: v1
+scrape_configs:
+  - job_name: prometheus
+    honor_timestamps: true
+    scrape_interval: 15s
+    scrape_timeout: 10s
+    metrics_path: /metrics/prometheus
+    scheme: http
+    static_configs:
+      - targets:
+          - 127.0.0.1
+
+ +

Then save the file and exit.

+ +
+ +Tip: In the last section of the code, you will see the targets section where I’ve written 127.0.0.1. +You can change it based on your localhost IP or your website domain. +Please be aware that your target should match with your node http port. +The default http port of pactus node is 80. + +
+ +

Run Grafana and Prometheus

+ +

Go to the /prometheus-grafana directory where the docker-compose.yml is located and run the command below.

+ +
docker compose up -d
+
+ +

Congratulations! Grafana and Prometheus are now up and accessible at ports 3000 and 9090 respectively.

+ +

Import Pactus Metrics to Grafana Dashboard

+ +

As Pactus uses libp2p for its peer-to-peer network, we should import libp2p metrics that you can find here. +Download one of the metrics config and then Import it into Grafana Dashboard.

+ +

Congratulations! You did it. Now, you can perform the same operations for other configurations.

+ + + + + +
+
+
+
+ + + + + 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..cd7f8d11a --- /dev/null +++ b/ar/user-guides/send-transactions-gui/index.html @@ -0,0 +1,431 @@ + + + + + + + + + + + + + كيفية إرسال المعاملات في الوضع الرسومي؟ | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

كيفية إرسال المعاملات في الوضع الرسومي؟

+ + +

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..be59b06a2 --- /dev/null +++ b/ar/user-guides/use-wallet-cli/index.html @@ -0,0 +1,1146 @@ + + + + + + + + + + + + + كيفية استخدام المحفظة في وضع سطر الأوامر؟ | بلوكشين بكتوس + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

كيفية استخدام المحفظة في وضع سطر الأوامر؟

+ + +

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/custom.css b/assets/css/custom.css new file mode 100644 index 000000000..309f55ddc --- /dev/null +++ b/assets/css/custom.css @@ -0,0 +1 @@ +:root{--primary-color-light: #021a34;--secondary-color-light: #075f94;--bg-color-light: #edeef0;--bg-color-reverse-light: #021a34;--bg-color-tinted-light: #b0b2b4;--text-color-light: #4c4c4c;--text-color-reverse-light: #edeef0;--text-muted-color-light: #4c4c4c;--link-color-light: #4c4c4c;--link-hover-color-light: #6c6c6c;--primary-color-dark: #edeef0;--secondary-color-dark: #075f94;--bg-color-dark: #14171c;--bg-color-reverse-dark: #edeef0;--bg-color-tinted-dark: #627191;--text-color-dark: #edeef0;--text-color-reverse-dark: #14171c;--text-muted-color-dark: #edeef0;--link-color-dark: #edeef0;--link-hover-color-dark: #ffffff}[data-bs-theme=light]{--primary-color: var(--primary-color-light);--secondary-color: var(--secondary-color-light);--bg-color-tinted: var(--bg-color-tinted-light);--bg-color: var(--bg-color-light);--bg-color-reverse: var(--bg-color-reverse-light);--text-color: var(--text-color-light);--text-color-reverse: var(--text-color-reverse-light);--text-muted-color: var(--text-muted-color-light);--link-color: var(--link-color-light);--link-hover-color: var(--link-hover-color-light)}[data-bs-theme=dark]{--primary-color: var(--primary-color-dark);--secondary-color: var(--secondary-color-dark);--bg-color: var(--bg-color-dark);--bg-color-reverse: var(--bg-color-reverse-dark);--bg-color-tinted: var(--bg-color-tinted-dark);--text-color: var(--text-color-dark);--text-color-reverse: var(--text-color-reverse-dark);--text-muted-color: var(--text-muted-color-dark);--link-color: var(--link-color-dark);--link-hover-color: var(--link-hover-color-dark)}:root,[data-bs-theme=light]{--pa-blue: #0d6efd;--pa-indigo: #6610f2;--pa-purple: #6f42c1;--pa-pink: #d63384;--pa-red: #dc3545;--pa-orange: #fd7e14;--pa-yellow: #ffc107;--pa-green: #198754;--pa-teal: #20c997;--pa-cyan: #0dcaf0;--pa-black: #000;--pa-white: #fff;--pa-gray: #6c757d;--pa-gray-dark: #343a40;--pa-gray-100: #f8f9fa;--pa-gray-200: #e9ecef;--pa-gray-300: #dee2e6;--pa-gray-400: #ced4da;--pa-gray-500: #adb5bd;--pa-gray-600: #6c757d;--pa-gray-700: #495057;--pa-gray-800: #343a40;--pa-gray-900: #212529;--pa-primary: #021a34;--pa-secondary: #075f94;--pa-success: #198754;--pa-info: #0dcaf0;--pa-warning: #ffc107;--pa-danger: #dc3545;--pa-light: #f8f9fa;--pa-dark: #212529;--pa-primary-rgb: 2, 26, 52;--pa-secondary-rgb: 7, 95, 148;--pa-success-rgb: 25, 135, 84;--pa-info-rgb: 13, 202, 240;--pa-warning-rgb: 255, 193, 7;--pa-danger-rgb: 220, 53, 69;--pa-light-rgb: 248, 249, 250;--pa-dark-rgb: 33, 37, 41;--pa-primary-text-emphasis: #010a15;--pa-secondary-text-emphasis: #03263b;--pa-success-text-emphasis: #0a3622;--pa-info-text-emphasis: #055160;--pa-warning-text-emphasis: #664d03;--pa-danger-text-emphasis: #58151c;--pa-light-text-emphasis: #495057;--pa-dark-text-emphasis: #495057;--pa-primary-bg-subtle: #ccd1d6;--pa-secondary-bg-subtle: #cddfea;--pa-success-bg-subtle: #d1e7dd;--pa-info-bg-subtle: #cff4fc;--pa-warning-bg-subtle: #fff3cd;--pa-danger-bg-subtle: #f8d7da;--pa-light-bg-subtle: #fcfcfd;--pa-dark-bg-subtle: #ced4da;--pa-primary-border-subtle: #9aa3ae;--pa-secondary-border-subtle: #9cbfd4;--pa-success-border-subtle: #a3cfbb;--pa-info-border-subtle: #9eeaf9;--pa-warning-border-subtle: #ffe69c;--pa-danger-border-subtle: #f1aeb5;--pa-light-border-subtle: #e9ecef;--pa-dark-border-subtle: #adb5bd;--pa-white-rgb: 255, 255, 255;--pa-black-rgb: 0, 0, 0;--pa-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";--pa-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--pa-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--pa-body-font-family: var(--pa-font-sans-serif);--pa-body-font-size:1rem;--pa-body-font-weight: 400;--pa-body-line-height: 1.5;--pa-body-color: #212529;--pa-body-color-rgb: 33, 37, 41;--pa-body-bg: #fff;--pa-body-bg-rgb: 255, 255, 255;--pa-emphasis-color: #000;--pa-emphasis-color-rgb: 0, 0, 0;--pa-secondary-color: rgba(33, 37, 41, 0.75);--pa-secondary-color-rgb: 33, 37, 41;--pa-secondary-bg: #e9ecef;--pa-secondary-bg-rgb: 233, 236, 239;--pa-tertiary-color: rgba(33, 37, 41, 0.5);--pa-tertiary-color-rgb: 33, 37, 41;--pa-tertiary-bg: #f8f9fa;--pa-tertiary-bg-rgb: 248, 249, 250;--pa-heading-color: inherit;--pa-link-color: #021a34;--pa-link-color-rgb: 2, 26, 52;--pa-link-decoration: underline;--pa-link-hover-color: #02152a;--pa-link-hover-color-rgb: 2, 21, 42;--pa-code-color: #d63384;--pa-highlight-color: #212529;--pa-highlight-bg: #fff3cd;--pa-border-width: 1px;--pa-border-style: solid;--pa-border-color: #dee2e6;--pa-border-color-translucent: rgba(0, 0, 0, 0.175);--pa-border-radius: 0.375rem;--pa-border-radius-sm: 0.25rem;--pa-border-radius-lg: 0.5rem;--pa-border-radius-xl: 1rem;--pa-border-radius-xxl: 2rem;--pa-border-radius-2xl: var(--pa-border-radius-xxl);--pa-border-radius-pill: 50rem;--pa-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--pa-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--pa-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);--pa-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);--pa-focus-ring-width: 0.25rem;--pa-focus-ring-opacity: 0.25;--pa-focus-ring-color: rgba(2, 26, 52, 0.25);--pa-form-valid-color: #198754;--pa-form-valid-border-color: #198754;--pa-form-invalid-color: #dc3545;--pa-form-invalid-border-color: #dc3545}[data-bs-theme=dark]{color-scheme:dark;--pa-body-color: #dee2e6;--pa-body-color-rgb: 222, 226, 230;--pa-body-bg: #212529;--pa-body-bg-rgb: 33, 37, 41;--pa-emphasis-color: #fff;--pa-emphasis-color-rgb: 255, 255, 255;--pa-secondary-color: rgba(222, 226, 230, 0.75);--pa-secondary-color-rgb: 222, 226, 230;--pa-secondary-bg: #343a40;--pa-secondary-bg-rgb: 52, 58, 64;--pa-tertiary-color: rgba(222, 226, 230, 0.5);--pa-tertiary-color-rgb: 222, 226, 230;--pa-tertiary-bg: #2b3035;--pa-tertiary-bg-rgb: 43, 48, 53;--pa-primary-text-emphasis: #677685;--pa-secondary-text-emphasis: #6a9fbf;--pa-success-text-emphasis: #75b798;--pa-info-text-emphasis: #6edff6;--pa-warning-text-emphasis: #ffda6a;--pa-danger-text-emphasis: #ea868f;--pa-light-text-emphasis: #f8f9fa;--pa-dark-text-emphasis: #dee2e6;--pa-primary-bg-subtle: #00050a;--pa-secondary-bg-subtle: #01131e;--pa-success-bg-subtle: #051b11;--pa-info-bg-subtle: #032830;--pa-warning-bg-subtle: #332701;--pa-danger-bg-subtle: #2c0b0e;--pa-light-bg-subtle: #343a40;--pa-dark-bg-subtle: #1a1d20;--pa-primary-border-subtle: #01101f;--pa-secondary-border-subtle: #043959;--pa-success-border-subtle: #0f5132;--pa-info-border-subtle: #087990;--pa-warning-border-subtle: #997404;--pa-danger-border-subtle: #842029;--pa-light-border-subtle: #495057;--pa-dark-border-subtle: #343a40;--pa-heading-color: inherit;--pa-link-color: #677685;--pa-link-hover-color: #85919d;--pa-link-color-rgb: 103, 118, 133;--pa-link-hover-color-rgb: 133, 145, 157;--pa-code-color: #e685b5;--pa-highlight-color: #dee2e6;--pa-highlight-bg: #664d03;--pa-border-color: #495057;--pa-border-color-translucent: rgba(255, 255, 255, 0.15);--pa-form-valid-color: #75b798;--pa-form-valid-border-color: #75b798;--pa-form-invalid-color: #ea868f;--pa-form-invalid-border-color: #ea868f}*,*::before,*::after{box-sizing:border-box}@media(prefers-reduced-motion: no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--pa-body-font-family);font-size:var(--pa-body-font-size);font-weight:var(--pa-body-font-weight);line-height:var(--pa-body-line-height);color:var(--pa-body-color);text-align:var(--pa-body-text-align);background-color:var(--pa-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;border:0;border-top:var(--pa-border-width) solid;opacity:.25}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--pa-heading-color)}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 + 0.9vw)}@media(min-width: 1200px){h2,.h2{font-size:2rem}}h3,.h3{font-size:calc(1.3rem + 0.6vw)}@media(min-width: 1200px){h3,.h3{font-size:1.75rem}}h4,.h4{font-size:calc(1.275rem + 0.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]{text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{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:0.875em}mark,.mark{padding:.1875em;color:var(--pa-highlight-color);background-color:var(--pa-highlight-bg)}sub,sup{position:relative;font-size:0.75em;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}a{color:rgba(var(--pa-link-color-rgb), var(--pa-link-opacity, 1));text-decoration:underline}a:hover{--pa-link-color-rgb: var(--pa-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:var(--pa-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:0.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:0.875em;color:var(--pa-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:0.875em;color:var(--pa-body-bg);background-color:var(--pa-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:var(--pa-secondary-color);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,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}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]: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 + 0.3vw);line-height:inherit}@media(min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::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:0.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:0.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:var(--pa-body-bg);border:var(--pa-border-width) solid var(--pa-border-color);border-radius:var(--pa-border-radius);box-shadow:var(--pa-box-shadow-sm);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:0.875em;color:var(--pa-secondary-color)}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{--pa-gutter-x: 1.5rem;--pa-gutter-y: 0;width:100%;padding-right:calc(var(--pa-gutter-x)*.5);padding-left:calc(var(--pa-gutter-x)*.5);margin-right:auto;margin-left:auto}@media(min-width: 576px){.container-sm,.container{max-width:540px}}@media(min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media(min-width: 1400px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}}:root{--pa-breakpoint-xs: 0;--pa-breakpoint-sm: 576px;--pa-breakpoint-md: 768px;--pa-breakpoint-lg: 992px;--pa-breakpoint-xl: 1200px;--pa-breakpoint-xxl: 1400px}.row{--pa-gutter-x: 1.5rem;--pa-gutter-y: 0;display:flex;flex-wrap:wrap;margin-top:calc(-1*var(--pa-gutter-y));margin-right:calc(-0.5*var(--pa-gutter-x));margin-left:calc(-0.5*var(--pa-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--pa-gutter-x)*.5);padding-left:calc(var(--pa-gutter-x)*.5);margin-top:var(--pa-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.33333333%}.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.66666667%}.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{--pa-gutter-x: 0}.g-0,.gy-0{--pa-gutter-y: 0}.g-1,.gx-1{--pa-gutter-x: 0.25rem}.g-1,.gy-1{--pa-gutter-y: 0.25rem}.g-2,.gx-2{--pa-gutter-x: 0.5rem}.g-2,.gy-2{--pa-gutter-y: 0.5rem}.g-3,.gx-3{--pa-gutter-x: 1rem}.g-3,.gy-3{--pa-gutter-y: 1rem}.g-4,.gx-4{--pa-gutter-x: 1.5rem}.g-4,.gy-4{--pa-gutter-y: 1.5rem}.g-5,.gx-5{--pa-gutter-x: 3rem}.g-5,.gy-5{--pa-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.33333333%}.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.66666667%}.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{--pa-gutter-x: 0}.g-sm-0,.gy-sm-0{--pa-gutter-y: 0}.g-sm-1,.gx-sm-1{--pa-gutter-x: 0.25rem}.g-sm-1,.gy-sm-1{--pa-gutter-y: 0.25rem}.g-sm-2,.gx-sm-2{--pa-gutter-x: 0.5rem}.g-sm-2,.gy-sm-2{--pa-gutter-y: 0.5rem}.g-sm-3,.gx-sm-3{--pa-gutter-x: 1rem}.g-sm-3,.gy-sm-3{--pa-gutter-y: 1rem}.g-sm-4,.gx-sm-4{--pa-gutter-x: 1.5rem}.g-sm-4,.gy-sm-4{--pa-gutter-y: 1.5rem}.g-sm-5,.gx-sm-5{--pa-gutter-x: 3rem}.g-sm-5,.gy-sm-5{--pa-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.33333333%}.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.66666667%}.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{--pa-gutter-x: 0}.g-md-0,.gy-md-0{--pa-gutter-y: 0}.g-md-1,.gx-md-1{--pa-gutter-x: 0.25rem}.g-md-1,.gy-md-1{--pa-gutter-y: 0.25rem}.g-md-2,.gx-md-2{--pa-gutter-x: 0.5rem}.g-md-2,.gy-md-2{--pa-gutter-y: 0.5rem}.g-md-3,.gx-md-3{--pa-gutter-x: 1rem}.g-md-3,.gy-md-3{--pa-gutter-y: 1rem}.g-md-4,.gx-md-4{--pa-gutter-x: 1.5rem}.g-md-4,.gy-md-4{--pa-gutter-y: 1.5rem}.g-md-5,.gx-md-5{--pa-gutter-x: 3rem}.g-md-5,.gy-md-5{--pa-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.33333333%}.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.66666667%}.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{--pa-gutter-x: 0}.g-lg-0,.gy-lg-0{--pa-gutter-y: 0}.g-lg-1,.gx-lg-1{--pa-gutter-x: 0.25rem}.g-lg-1,.gy-lg-1{--pa-gutter-y: 0.25rem}.g-lg-2,.gx-lg-2{--pa-gutter-x: 0.5rem}.g-lg-2,.gy-lg-2{--pa-gutter-y: 0.5rem}.g-lg-3,.gx-lg-3{--pa-gutter-x: 1rem}.g-lg-3,.gy-lg-3{--pa-gutter-y: 1rem}.g-lg-4,.gx-lg-4{--pa-gutter-x: 1.5rem}.g-lg-4,.gy-lg-4{--pa-gutter-y: 1.5rem}.g-lg-5,.gx-lg-5{--pa-gutter-x: 3rem}.g-lg-5,.gy-lg-5{--pa-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.33333333%}.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.66666667%}.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{--pa-gutter-x: 0}.g-xl-0,.gy-xl-0{--pa-gutter-y: 0}.g-xl-1,.gx-xl-1{--pa-gutter-x: 0.25rem}.g-xl-1,.gy-xl-1{--pa-gutter-y: 0.25rem}.g-xl-2,.gx-xl-2{--pa-gutter-x: 0.5rem}.g-xl-2,.gy-xl-2{--pa-gutter-y: 0.5rem}.g-xl-3,.gx-xl-3{--pa-gutter-x: 1rem}.g-xl-3,.gy-xl-3{--pa-gutter-y: 1rem}.g-xl-4,.gx-xl-4{--pa-gutter-x: 1.5rem}.g-xl-4,.gy-xl-4{--pa-gutter-y: 1.5rem}.g-xl-5,.gx-xl-5{--pa-gutter-x: 3rem}.g-xl-5,.gy-xl-5{--pa-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.33333333%}.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.66666667%}.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{--pa-gutter-x: 0}.g-xxl-0,.gy-xxl-0{--pa-gutter-y: 0}.g-xxl-1,.gx-xxl-1{--pa-gutter-x: 0.25rem}.g-xxl-1,.gy-xxl-1{--pa-gutter-y: 0.25rem}.g-xxl-2,.gx-xxl-2{--pa-gutter-x: 0.5rem}.g-xxl-2,.gy-xxl-2{--pa-gutter-y: 0.5rem}.g-xxl-3,.gx-xxl-3{--pa-gutter-x: 1rem}.g-xxl-3,.gy-xxl-3{--pa-gutter-y: 1rem}.g-xxl-4,.gx-xxl-4{--pa-gutter-x: 1.5rem}.g-xxl-4,.gy-xxl-4{--pa-gutter-y: 1.5rem}.g-xxl-5,.gx-xxl-5{--pa-gutter-x: 3rem}.g-xxl-5,.gy-xxl-5{--pa-gutter-y: 3rem}}.table{--pa-table-color-type: initial;--pa-table-bg-type: initial;--pa-table-color-state: initial;--pa-table-bg-state: initial;--pa-table-color: var(--pa-emphasis-color);--pa-table-bg: var(--pa-body-bg);--pa-table-border-color: var(--pa-border-color);--pa-table-accent-bg: transparent;--pa-table-striped-color: var(--pa-emphasis-color);--pa-table-striped-bg: rgba(var(--pa-emphasis-color-rgb), 0.05);--pa-table-active-color: var(--pa-emphasis-color);--pa-table-active-bg: rgba(var(--pa-emphasis-color-rgb), 0.1);--pa-table-hover-color: var(--pa-emphasis-color);--pa-table-hover-bg: rgba(var(--pa-emphasis-color-rgb), 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--pa-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--pa-table-color-state, var(--pa-table-color-type, var(--pa-table-color)));background-color:var(--pa-table-bg);border-bottom-width:var(--pa-border-width);box-shadow:inset 0 0 0 9999px var(--pa-table-bg-state, var(--pa-table-bg-type, var(--pa-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(var(--pa-border-width) * 2) solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:var(--pa-border-width) 0}.table-bordered>:not(caption)>*>*{border-width:0 var(--pa-border-width)}.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)>*{--pa-table-color-type: var(--pa-table-striped-color);--pa-table-bg-type: var(--pa-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(even){--pa-table-color-type: var(--pa-table-striped-color);--pa-table-bg-type: var(--pa-table-striped-bg)}.table-active{--pa-table-color-state: var(--pa-table-active-color);--pa-table-bg-state: var(--pa-table-active-bg)}.table-hover>tbody>tr:hover>*{--pa-table-color-state: var(--pa-table-hover-color);--pa-table-bg-state: var(--pa-table-hover-bg)}.table-primary{--pa-table-color: #000;--pa-table-bg: #ccd1d6;--pa-table-border-color: #a3a7ab;--pa-table-striped-bg: #c2c7cb;--pa-table-striped-color: #000;--pa-table-active-bg: #b8bcc1;--pa-table-active-color: #000;--pa-table-hover-bg: #bdc1c6;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-secondary{--pa-table-color: #000;--pa-table-bg: #cddfea;--pa-table-border-color: #a4b2bb;--pa-table-striped-bg: #c3d4de;--pa-table-striped-color: #000;--pa-table-active-bg: #b9c9d3;--pa-table-active-color: #000;--pa-table-hover-bg: #beced8;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-success{--pa-table-color: #000;--pa-table-bg: #d1e7dd;--pa-table-border-color: #a7b9b1;--pa-table-striped-bg: #c7dbd2;--pa-table-striped-color: #000;--pa-table-active-bg: #bcd0c7;--pa-table-active-color: #000;--pa-table-hover-bg: #c1d6cc;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-info{--pa-table-color: #000;--pa-table-bg: #cff4fc;--pa-table-border-color: #a6c3ca;--pa-table-striped-bg: #c5e8ef;--pa-table-striped-color: #000;--pa-table-active-bg: #badce3;--pa-table-active-color: #000;--pa-table-hover-bg: #bfe2e9;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-warning{--pa-table-color: #000;--pa-table-bg: #fff3cd;--pa-table-border-color: #ccc2a4;--pa-table-striped-bg: #f2e7c3;--pa-table-striped-color: #000;--pa-table-active-bg: #e6dbb9;--pa-table-active-color: #000;--pa-table-hover-bg: #ece1be;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-danger{--pa-table-color: #000;--pa-table-bg: #f8d7da;--pa-table-border-color: #c6acae;--pa-table-striped-bg: #eccccf;--pa-table-striped-color: #000;--pa-table-active-bg: #dfc2c4;--pa-table-active-color: #000;--pa-table-hover-bg: #e5c7ca;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-light{--pa-table-color: #000;--pa-table-bg: #f8f9fa;--pa-table-border-color: #c6c7c8;--pa-table-striped-bg: #ecedee;--pa-table-striped-color: #000;--pa-table-active-bg: #dfe0e1;--pa-table-active-color: #000;--pa-table-hover-bg: #e5e6e7;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-dark{--pa-table-color: #fff;--pa-table-bg: #212529;--pa-table-border-color: #4d5154;--pa-table-striped-bg: #2c3034;--pa-table-striped-color: #fff;--pa-table-active-bg: #373b3e;--pa-table-active-color: #fff;--pa-table-hover-bg: #323539;--pa-table-hover-color: #fff;color:var(--pa-table-color);border-color:var(--pa-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}}.btn{--pa-btn-padding-x: 0.75rem;--pa-btn-padding-y: 0.375rem;--pa-btn-font-family: ;--pa-btn-font-size:1rem;--pa-btn-font-weight: 400;--pa-btn-line-height: 1.5;--pa-btn-color: var(--pa-body-color);--pa-btn-bg: transparent;--pa-btn-border-width: var(--pa-border-width);--pa-btn-border-color: transparent;--pa-btn-border-radius: var(--pa-border-radius);--pa-btn-hover-border-color: transparent;--pa-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);--pa-btn-disabled-opacity: 0.65;--pa-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--pa-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--pa-btn-padding-y) var(--pa-btn-padding-x);font-family:var(--pa-btn-font-family);font-size:var(--pa-btn-font-size);font-weight:var(--pa-btn-font-weight);line-height:var(--pa-btn-line-height);color:var(--pa-btn-color);text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;border:var(--pa-btn-border-width) solid var(--pa-btn-border-color);border-radius:var(--pa-btn-border-radius);background-color:var(--pa-btn-bg);box-shadow:var(--pa-btn-box-shadow);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:hover{color:var(--pa-btn-hover-color);background-color:var(--pa-btn-hover-bg);border-color:var(--pa-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--pa-btn-color);background-color:var(--pa-btn-bg);border-color:var(--pa-btn-border-color)}.btn:focus-visible{color:var(--pa-btn-hover-color);background-color:var(--pa-btn-hover-bg);border-color:var(--pa-btn-hover-border-color);outline:0;box-shadow:var(--pa-btn-box-shadow),var(--pa-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--pa-btn-hover-border-color);outline:0;box-shadow:var(--pa-btn-box-shadow),var(--pa-btn-focus-box-shadow)}.btn-check:checked+.btn,:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--pa-btn-active-color);background-color:var(--pa-btn-active-bg);border-color:var(--pa-btn-active-border-color);box-shadow:var(--pa-btn-active-shadow)}.btn-check:checked+.btn:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible{box-shadow:var(--pa-btn-active-shadow),var(--pa-btn-focus-box-shadow)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{color:var(--pa-btn-disabled-color);pointer-events:none;background-color:var(--pa-btn-disabled-bg);border-color:var(--pa-btn-disabled-border-color);opacity:var(--pa-btn-disabled-opacity);box-shadow:none}.btn-primary{--pa-btn-color: #fff;--pa-btn-bg: #021a34;--pa-btn-border-color: #021a34;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #02162c;--pa-btn-hover-border-color: #02152a;--pa-btn-focus-shadow-rgb: 40, 60, 82;--pa-btn-active-color: #fff;--pa-btn-active-bg: #02152a;--pa-btn-active-border-color: #021427;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #fff;--pa-btn-disabled-bg: #021a34;--pa-btn-disabled-border-color: #021a34}.btn-secondary{--pa-btn-color: #fff;--pa-btn-bg: #075f94;--pa-btn-border-color: #075f94;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #06517e;--pa-btn-hover-border-color: #064c76;--pa-btn-focus-shadow-rgb: 44, 119, 164;--pa-btn-active-color: #fff;--pa-btn-active-bg: #064c76;--pa-btn-active-border-color: #05476f;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #fff;--pa-btn-disabled-bg: #075f94;--pa-btn-disabled-border-color: #075f94}.btn-success{--pa-btn-color: #fff;--pa-btn-bg: #198754;--pa-btn-border-color: #198754;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #157347;--pa-btn-hover-border-color: #146c43;--pa-btn-focus-shadow-rgb: 60, 153, 110;--pa-btn-active-color: #fff;--pa-btn-active-bg: #146c43;--pa-btn-active-border-color: #13653f;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #fff;--pa-btn-disabled-bg: #198754;--pa-btn-disabled-border-color: #198754}.btn-info{--pa-btn-color: #000;--pa-btn-bg: #0dcaf0;--pa-btn-border-color: #0dcaf0;--pa-btn-hover-color: #000;--pa-btn-hover-bg: #31d2f2;--pa-btn-hover-border-color: #25cff2;--pa-btn-focus-shadow-rgb: 11, 172, 204;--pa-btn-active-color: #000;--pa-btn-active-bg: #3dd5f3;--pa-btn-active-border-color: #25cff2;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #000;--pa-btn-disabled-bg: #0dcaf0;--pa-btn-disabled-border-color: #0dcaf0}.btn-warning{--pa-btn-color: #000;--pa-btn-bg: #ffc107;--pa-btn-border-color: #ffc107;--pa-btn-hover-color: #000;--pa-btn-hover-bg: #ffca2c;--pa-btn-hover-border-color: #ffc720;--pa-btn-focus-shadow-rgb: 217, 164, 6;--pa-btn-active-color: #000;--pa-btn-active-bg: #ffcd39;--pa-btn-active-border-color: #ffc720;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #000;--pa-btn-disabled-bg: #ffc107;--pa-btn-disabled-border-color: #ffc107}.btn-danger{--pa-btn-color: #fff;--pa-btn-bg: #dc3545;--pa-btn-border-color: #dc3545;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #bb2d3b;--pa-btn-hover-border-color: #b02a37;--pa-btn-focus-shadow-rgb: 225, 83, 97;--pa-btn-active-color: #fff;--pa-btn-active-bg: #b02a37;--pa-btn-active-border-color: #a52834;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #fff;--pa-btn-disabled-bg: #dc3545;--pa-btn-disabled-border-color: #dc3545}.btn-light{--pa-btn-color: #000;--pa-btn-bg: #f8f9fa;--pa-btn-border-color: #f8f9fa;--pa-btn-hover-color: #000;--pa-btn-hover-bg: #d3d4d5;--pa-btn-hover-border-color: #c6c7c8;--pa-btn-focus-shadow-rgb: 211, 212, 213;--pa-btn-active-color: #000;--pa-btn-active-bg: #c6c7c8;--pa-btn-active-border-color: #babbbc;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #000;--pa-btn-disabled-bg: #f8f9fa;--pa-btn-disabled-border-color: #f8f9fa}.btn-dark{--pa-btn-color: #fff;--pa-btn-bg: #212529;--pa-btn-border-color: #212529;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #424649;--pa-btn-hover-border-color: #373b3e;--pa-btn-focus-shadow-rgb: 66, 70, 73;--pa-btn-active-color: #fff;--pa-btn-active-bg: #4d5154;--pa-btn-active-border-color: #373b3e;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #fff;--pa-btn-disabled-bg: #212529;--pa-btn-disabled-border-color: #212529}.btn-outline-primary{--pa-btn-color: #021a34;--pa-btn-border-color: #021a34;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #021a34;--pa-btn-hover-border-color: #021a34;--pa-btn-focus-shadow-rgb: 2, 26, 52;--pa-btn-active-color: #fff;--pa-btn-active-bg: #021a34;--pa-btn-active-border-color: #021a34;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #021a34;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #021a34;--pa-gradient: none}.btn-outline-secondary{--pa-btn-color: #075f94;--pa-btn-border-color: #075f94;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #075f94;--pa-btn-hover-border-color: #075f94;--pa-btn-focus-shadow-rgb: 7, 95, 148;--pa-btn-active-color: #fff;--pa-btn-active-bg: #075f94;--pa-btn-active-border-color: #075f94;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #075f94;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #075f94;--pa-gradient: none}.btn-outline-success{--pa-btn-color: #198754;--pa-btn-border-color: #198754;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #198754;--pa-btn-hover-border-color: #198754;--pa-btn-focus-shadow-rgb: 25, 135, 84;--pa-btn-active-color: #fff;--pa-btn-active-bg: #198754;--pa-btn-active-border-color: #198754;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #198754;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #198754;--pa-gradient: none}.btn-outline-info{--pa-btn-color: #0dcaf0;--pa-btn-border-color: #0dcaf0;--pa-btn-hover-color: #000;--pa-btn-hover-bg: #0dcaf0;--pa-btn-hover-border-color: #0dcaf0;--pa-btn-focus-shadow-rgb: 13, 202, 240;--pa-btn-active-color: #000;--pa-btn-active-bg: #0dcaf0;--pa-btn-active-border-color: #0dcaf0;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #0dcaf0;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #0dcaf0;--pa-gradient: none}.btn-outline-warning{--pa-btn-color: #ffc107;--pa-btn-border-color: #ffc107;--pa-btn-hover-color: #000;--pa-btn-hover-bg: #ffc107;--pa-btn-hover-border-color: #ffc107;--pa-btn-focus-shadow-rgb: 255, 193, 7;--pa-btn-active-color: #000;--pa-btn-active-bg: #ffc107;--pa-btn-active-border-color: #ffc107;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #ffc107;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #ffc107;--pa-gradient: none}.btn-outline-danger{--pa-btn-color: #dc3545;--pa-btn-border-color: #dc3545;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #dc3545;--pa-btn-hover-border-color: #dc3545;--pa-btn-focus-shadow-rgb: 220, 53, 69;--pa-btn-active-color: #fff;--pa-btn-active-bg: #dc3545;--pa-btn-active-border-color: #dc3545;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #dc3545;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #dc3545;--pa-gradient: none}.btn-outline-light{--pa-btn-color: #f8f9fa;--pa-btn-border-color: #f8f9fa;--pa-btn-hover-color: #000;--pa-btn-hover-bg: #f8f9fa;--pa-btn-hover-border-color: #f8f9fa;--pa-btn-focus-shadow-rgb: 248, 249, 250;--pa-btn-active-color: #000;--pa-btn-active-bg: #f8f9fa;--pa-btn-active-border-color: #f8f9fa;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #f8f9fa;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #f8f9fa;--pa-gradient: none}.btn-outline-dark{--pa-btn-color: #212529;--pa-btn-border-color: #212529;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #212529;--pa-btn-hover-border-color: #212529;--pa-btn-focus-shadow-rgb: 33, 37, 41;--pa-btn-active-color: #fff;--pa-btn-active-bg: #212529;--pa-btn-active-border-color: #212529;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #212529;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #212529;--pa-gradient: none}.btn-link{--pa-btn-font-weight: 400;--pa-btn-color: var(--pa-link-color);--pa-btn-bg: transparent;--pa-btn-border-color: transparent;--pa-btn-hover-color: var(--pa-link-hover-color);--pa-btn-hover-border-color: transparent;--pa-btn-active-color: var(--pa-link-hover-color);--pa-btn-active-border-color: transparent;--pa-btn-disabled-color: #6c757d;--pa-btn-disabled-border-color: transparent;--pa-btn-box-shadow: 0 0 0 #000;--pa-btn-focus-shadow-rgb: 40, 60, 82;text-decoration:underline}.btn-link:focus-visible{color:var(--pa-btn-color)}.btn-link:hover{color:var(--pa-btn-hover-color)}.btn-lg{--pa-btn-padding-y: 0.5rem;--pa-btn-padding-x: 1rem;--pa-btn-font-size:1.25rem;--pa-btn-border-radius: var(--pa-border-radius-lg)}.btn-sm{--pa-btn-padding-y: 0.25rem;--pa-btn-padding-x: 0.5rem;--pa-btn-font-size:0.875rem;--pa-btn-border-radius: var(--pa-border-radius-sm)}.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}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-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 rgba(0,0,0,0);border-bottom:0;border-left:.3em solid rgba(0,0,0,0)}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--pa-dropdown-zindex: 1000;--pa-dropdown-min-width: 10rem;--pa-dropdown-padding-x: 0;--pa-dropdown-padding-y: 0.5rem;--pa-dropdown-spacer: 0.125rem;--pa-dropdown-font-size:1rem;--pa-dropdown-color: var(--pa-body-color);--pa-dropdown-bg: var(--pa-body-bg);--pa-dropdown-border-color: var(--pa-border-color-translucent);--pa-dropdown-border-radius: var(--pa-border-radius);--pa-dropdown-border-width: var(--pa-border-width);--pa-dropdown-inner-border-radius: calc(var(--pa-border-radius) - var(--pa-border-width));--pa-dropdown-divider-bg: var(--pa-border-color-translucent);--pa-dropdown-divider-margin-y: 0.5rem;--pa-dropdown-box-shadow: var(--pa-box-shadow);--pa-dropdown-link-color: var(--pa-body-color);--pa-dropdown-link-hover-color: var(--pa-body-color);--pa-dropdown-link-hover-bg: var(--pa-tertiary-bg);--pa-dropdown-link-active-color: #fff;--pa-dropdown-link-active-bg: #021a34;--pa-dropdown-link-disabled-color: var(--pa-tertiary-color);--pa-dropdown-item-padding-x: 1rem;--pa-dropdown-item-padding-y: 0.25rem;--pa-dropdown-header-color: #6c757d;--pa-dropdown-header-padding-x: 1rem;--pa-dropdown-header-padding-y: 0.5rem;position:absolute;z-index:var(--pa-dropdown-zindex);display:none;min-width:var(--pa-dropdown-min-width);padding:var(--pa-dropdown-padding-y) var(--pa-dropdown-padding-x);margin:0;font-size:var(--pa-dropdown-font-size);color:var(--pa-dropdown-color);text-align:left;list-style:none;background-color:var(--pa-dropdown-bg);background-clip:padding-box;border:var(--pa-dropdown-border-width) solid var(--pa-dropdown-border-color);border-radius:var(--pa-dropdown-border-radius);box-shadow:var(--pa-dropdown-box-shadow)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--pa-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(--pa-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid rgba(0,0,0,0);border-bottom:.3em solid;border-left:.3em solid rgba(0,0,0,0)}.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(--pa-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:0;border-bottom:.3em solid rgba(0,0,0,0);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(--pa-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 rgba(0,0,0,0);border-right:.3em solid;border-bottom:.3em solid rgba(0,0,0,0)}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--pa-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--pa-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--pa-dropdown-item-padding-y) var(--pa-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--pa-dropdown-link-color);text-align:inherit;text-decoration:none;white-space:nowrap;background-color:rgba(0,0,0,0);border:0;border-radius:var(--pa-dropdown-item-border-radius, 0)}.dropdown-item:hover,.dropdown-item:focus{color:var(--pa-dropdown-link-hover-color);background-color:var(--pa-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--pa-dropdown-link-active-color);text-decoration:none;background-color:var(--pa-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--pa-dropdown-link-disabled-color);pointer-events:none;background-color:rgba(0,0,0,0)}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--pa-dropdown-header-padding-y) var(--pa-dropdown-header-padding-x);margin-bottom:0;font-size:0.875rem;color:var(--pa-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--pa-dropdown-item-padding-y) var(--pa-dropdown-item-padding-x);color:var(--pa-dropdown-link-color)}.dropdown-menu-dark{--pa-dropdown-color: #dee2e6;--pa-dropdown-bg: #343a40;--pa-dropdown-border-color: var(--pa-border-color-translucent);--pa-dropdown-box-shadow: ;--pa-dropdown-link-color: #dee2e6;--pa-dropdown-link-hover-color: #fff;--pa-dropdown-divider-bg: var(--pa-border-color-translucent);--pa-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);--pa-dropdown-link-active-color: #fff;--pa-dropdown-link-active-bg: #021a34;--pa-dropdown-link-disabled-color: #adb5bd;--pa-dropdown-header-color: #adb5bd}.nav{--pa-nav-link-padding-x: 1rem;--pa-nav-link-padding-y: 0.5rem;--pa-nav-link-font-weight: ;--pa-nav-link-color: var(--pa-link-color);--pa-nav-link-hover-color: var(--pa-link-hover-color);--pa-nav-link-disabled-color: var(--pa-secondary-color);display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--pa-nav-link-padding-y) var(--pa-nav-link-padding-x);font-size:var(--pa-nav-link-font-size);font-weight:var(--pa-nav-link-font-weight);color:var(--pa-nav-link-color);text-decoration:none;background:none;border:0;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:hover,.nav-link:focus{color:var(--pa-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(2,26,52,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--pa-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--pa-nav-tabs-border-width: var(--pa-border-width);--pa-nav-tabs-border-color: var(--pa-border-color);--pa-nav-tabs-border-radius: var(--pa-border-radius);--pa-nav-tabs-link-hover-border-color: var(--pa-secondary-bg) var(--pa-secondary-bg) var(--pa-border-color);--pa-nav-tabs-link-active-color: var(--pa-emphasis-color);--pa-nav-tabs-link-active-bg: var(--pa-body-bg);--pa-nav-tabs-link-active-border-color: var(--pa-border-color) var(--pa-border-color) var(--pa-body-bg);border-bottom:var(--pa-nav-tabs-border-width) solid var(--pa-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1*var(--pa-nav-tabs-border-width));border:var(--pa-nav-tabs-border-width) solid rgba(0,0,0,0);border-top-left-radius:var(--pa-nav-tabs-border-radius);border-top-right-radius:var(--pa-nav-tabs-border-radius)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--pa-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--pa-nav-tabs-link-active-color);background-color:var(--pa-nav-tabs-link-active-bg);border-color:var(--pa-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1*var(--pa-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--pa-nav-pills-border-radius: var(--pa-border-radius);--pa-nav-pills-link-active-color: #fff;--pa-nav-pills-link-active-bg: #021a34}.nav-pills .nav-link{border-radius:var(--pa-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--pa-nav-pills-link-active-color);background-color:var(--pa-nav-pills-link-active-bg)}.nav-underline{--pa-nav-underline-gap: 1rem;--pa-nav-underline-border-width: 0.125rem;--pa-nav-underline-link-active-color: var(--pa-emphasis-color);gap:var(--pa-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--pa-nav-underline-border-width) solid rgba(0,0,0,0)}.nav-underline .nav-link:hover,.nav-underline .nav-link:focus{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--pa-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{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{--pa-navbar-padding-x: 0;--pa-navbar-padding-y: 0.5rem;--pa-navbar-color: rgba(var(--pa-emphasis-color-rgb), 0.65);--pa-navbar-hover-color: rgba(var(--pa-emphasis-color-rgb), 0.8);--pa-navbar-disabled-color: rgba(var(--pa-emphasis-color-rgb), 0.3);--pa-navbar-active-color: rgba(var(--pa-emphasis-color-rgb), 1);--pa-navbar-brand-padding-y: 0.3125rem;--pa-navbar-brand-margin-end: 1rem;--pa-navbar-brand-font-size: 1.25rem;--pa-navbar-brand-color: rgba(var(--pa-emphasis-color-rgb), 1);--pa-navbar-brand-hover-color: rgba(var(--pa-emphasis-color-rgb), 1);--pa-navbar-nav-link-padding-x: 0.5rem;--pa-navbar-toggler-padding-y: 0.25rem;--pa-navbar-toggler-padding-x: 0.75rem;--pa-navbar-toggler-font-size: 1.25rem;--pa-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%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--pa-navbar-toggler-border-color: rgba(var(--pa-emphasis-color-rgb), 0.15);--pa-navbar-toggler-border-radius: var(--pa-border-radius);--pa-navbar-toggler-focus-width: 0.25rem;--pa-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(--pa-navbar-padding-y) var(--pa-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--pa-navbar-brand-padding-y);padding-bottom:var(--pa-navbar-brand-padding-y);margin-right:var(--pa-navbar-brand-margin-end);font-size:var(--pa-navbar-brand-font-size);color:var(--pa-navbar-brand-color);text-decoration:none;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--pa-navbar-brand-hover-color)}.navbar-nav{--pa-nav-link-padding-x: 0;--pa-nav-link-padding-y: 0.5rem;--pa-nav-link-font-weight: ;--pa-nav-link-color: var(--pa-navbar-color);--pa-nav-link-hover-color: var(--pa-navbar-hover-color);--pa-nav-link-disabled-color: var(--pa-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--pa-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--pa-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--pa-navbar-active-color)}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:var(--pa-navbar-toggler-padding-y) var(--pa-navbar-toggler-padding-x);font-size:var(--pa-navbar-toggler-font-size);line-height:1;color:var(--pa-navbar-color);background-color:rgba(0,0,0,0);border:var(--pa-border-width) solid var(--pa-navbar-toggler-border-color);border-radius:var(--pa-navbar-toggler-border-radius);transition:var(--pa-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(--pa-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--pa-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--pa-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(--pa-navbar-nav-link-padding-x);padding-left:var(--pa-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:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;box-shadow:none;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(--pa-navbar-nav-link-padding-x);padding-left:var(--pa-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:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;box-shadow:none;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(--pa-navbar-nav-link-padding-x);padding-left:var(--pa-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:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;box-shadow:none;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(--pa-navbar-nav-link-padding-x);padding-left:var(--pa-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:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;box-shadow:none;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(--pa-navbar-nav-link-padding-x);padding-left:var(--pa-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:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;box-shadow:none;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(--pa-navbar-nav-link-padding-x);padding-left:var(--pa-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:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;box-shadow:none;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,.navbar[data-bs-theme=dark]{--pa-navbar-color: rgba(255, 255, 255, 0.55);--pa-navbar-hover-color: rgba(255, 255, 255, 0.75);--pa-navbar-disabled-color: rgba(255, 255, 255, 0.25);--pa-navbar-active-color: #fff;--pa-navbar-brand-color: #fff;--pa-navbar-brand-hover-color: #fff;--pa-navbar-toggler-border-color: rgba(255, 255, 255, 0.1);--pa-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")}[data-bs-theme=dark] .navbar-toggler-icon{--pa-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")}.badge{--pa-badge-padding-x: 0.65em;--pa-badge-padding-y: 0.35em;--pa-badge-font-size:0.75em;--pa-badge-font-weight: 700;--pa-badge-color: #fff;--pa-badge-border-radius: var(--pa-border-radius);display:inline-block;padding:var(--pa-badge-padding-y) var(--pa-badge-padding-x);font-size:var(--pa-badge-font-size);font-weight:var(--pa-badge-font-weight);line-height:1;color:var(--pa-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--pa-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--pa-alert-bg: transparent;--pa-alert-padding-x: 1rem;--pa-alert-padding-y: 1rem;--pa-alert-margin-bottom: 1rem;--pa-alert-color: inherit;--pa-alert-border-color: transparent;--pa-alert-border: var(--pa-border-width) solid var(--pa-alert-border-color);--pa-alert-border-radius: var(--pa-border-radius);--pa-alert-link-color: inherit;position:relative;padding:var(--pa-alert-padding-y) var(--pa-alert-padding-x);margin-bottom:var(--pa-alert-margin-bottom);color:var(--pa-alert-color);background-color:var(--pa-alert-bg);border:var(--pa-alert-border);border-radius:var(--pa-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--pa-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{--pa-alert-color: var(--pa-primary-text-emphasis);--pa-alert-bg: var(--pa-primary-bg-subtle);--pa-alert-border-color: var(--pa-primary-border-subtle);--pa-alert-link-color: var(--pa-primary-text-emphasis)}.alert-secondary{--pa-alert-color: var(--pa-secondary-text-emphasis);--pa-alert-bg: var(--pa-secondary-bg-subtle);--pa-alert-border-color: var(--pa-secondary-border-subtle);--pa-alert-link-color: var(--pa-secondary-text-emphasis)}.alert-success{--pa-alert-color: var(--pa-success-text-emphasis);--pa-alert-bg: var(--pa-success-bg-subtle);--pa-alert-border-color: var(--pa-success-border-subtle);--pa-alert-link-color: var(--pa-success-text-emphasis)}.alert-info{--pa-alert-color: var(--pa-info-text-emphasis);--pa-alert-bg: var(--pa-info-bg-subtle);--pa-alert-border-color: var(--pa-info-border-subtle);--pa-alert-link-color: var(--pa-info-text-emphasis)}.alert-warning{--pa-alert-color: var(--pa-warning-text-emphasis);--pa-alert-bg: var(--pa-warning-bg-subtle);--pa-alert-border-color: var(--pa-warning-border-subtle);--pa-alert-link-color: var(--pa-warning-text-emphasis)}.alert-danger{--pa-alert-color: var(--pa-danger-text-emphasis);--pa-alert-bg: var(--pa-danger-bg-subtle);--pa-alert-border-color: var(--pa-danger-border-subtle);--pa-alert-link-color: var(--pa-danger-text-emphasis)}.alert-light{--pa-alert-color: var(--pa-light-text-emphasis);--pa-alert-bg: var(--pa-light-bg-subtle);--pa-alert-border-color: var(--pa-light-border-subtle);--pa-alert-link-color: var(--pa-light-text-emphasis)}.alert-dark{--pa-alert-color: var(--pa-dark-text-emphasis);--pa-alert-bg: var(--pa-dark-bg-subtle);--pa-alert-border-color: var(--pa-dark-border-subtle);--pa-alert-link-color: var(--pa-dark-text-emphasis)}.clearfix::after{display:block;clear:both;content:""}.text-bg-primary{color:#fff !important;background-color:RGBA(var(--pa-primary-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-secondary{color:#fff !important;background-color:RGBA(var(--pa-secondary-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-success{color:#fff !important;background-color:RGBA(var(--pa-success-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-info{color:#000 !important;background-color:RGBA(var(--pa-info-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-warning{color:#000 !important;background-color:RGBA(var(--pa-warning-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-danger{color:#fff !important;background-color:RGBA(var(--pa-danger-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-light{color:#000 !important;background-color:RGBA(var(--pa-light-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-dark{color:#fff !important;background-color:RGBA(var(--pa-dark-rgb), var(--pa-bg-opacity, 1)) !important}.link-primary{color:RGBA(var(--pa-primary-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-primary-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-primary:hover,.link-primary:focus{color:RGBA(2, 21, 42, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(2, 21, 42, var(--pa-link-underline-opacity, 1)) !important}.link-secondary{color:RGBA(var(--pa-secondary-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-secondary-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-secondary:hover,.link-secondary:focus{color:RGBA(6, 76, 118, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(6, 76, 118, var(--pa-link-underline-opacity, 1)) !important}.link-success{color:RGBA(var(--pa-success-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-success-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-success:hover,.link-success:focus{color:RGBA(20, 108, 67, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(20, 108, 67, var(--pa-link-underline-opacity, 1)) !important}.link-info{color:RGBA(var(--pa-info-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-info-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-info:hover,.link-info:focus{color:RGBA(61, 213, 243, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(61, 213, 243, var(--pa-link-underline-opacity, 1)) !important}.link-warning{color:RGBA(var(--pa-warning-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-warning-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-warning:hover,.link-warning:focus{color:RGBA(255, 205, 57, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(255, 205, 57, var(--pa-link-underline-opacity, 1)) !important}.link-danger{color:RGBA(var(--pa-danger-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-danger-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-danger:hover,.link-danger:focus{color:RGBA(176, 42, 55, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(176, 42, 55, var(--pa-link-underline-opacity, 1)) !important}.link-light{color:RGBA(var(--pa-light-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-light-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-light:hover,.link-light:focus{color:RGBA(249, 250, 251, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(249, 250, 251, var(--pa-link-underline-opacity, 1)) !important}.link-dark{color:RGBA(var(--pa-dark-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-dark-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-dark:hover,.link-dark:focus{color:RGBA(26, 30, 33, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(26, 30, 33, var(--pa-link-underline-opacity, 1)) !important}.link-body-emphasis{color:RGBA(var(--pa-emphasis-color-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-emphasis-color-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-body-emphasis:hover,.link-body-emphasis:focus{color:RGBA(var(--pa-emphasis-color-rgb), var(--pa-link-opacity, 0.75)) !important;text-decoration-color:RGBA(var(--pa-emphasis-color-rgb), var(--pa-link-underline-opacity, 0.75)) !important}.focus-ring:focus{outline:0;box-shadow:var(--pa-focus-ring-x, 0) var(--pa-focus-ring-y, 0) var(--pa-focus-ring-blur, 0) var(--pa-focus-ring-width) var(--pa-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;text-decoration-color:rgba(var(--pa-link-color-rgb), var(--pa-link-opacity, 0.5));text-underline-offset:.25em;backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media(prefers-reduced-motion: reduce){.icon-link>.bi{transition:none}}.icon-link-hover:hover>.bi,.icon-link-hover:focus-visible>.bi{transform:var(--pa-icon-link-transform, translate3d(0.25em, 0, 0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--pa-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--pa-aspect-ratio: 100%}.ratio-4x3{--pa-aspect-ratio: 75%}.ratio-16x9{--pa-aspect-ratio: 56.25%}.ratio-21x9{--pa-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:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media(min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{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){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}.visually-hidden:not(caption),.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption){position:absolute !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:var(--pa-border-width);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}.object-fit-contain{object-fit:contain !important}.object-fit-cover{object-fit:cover !important}.object-fit-fill{object-fit:fill !important}.object-fit-scale{object-fit:scale-down !important}.object-fit-none{object-fit: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}.overflow-x-auto{overflow-x:auto !important}.overflow-x-hidden{overflow-x:hidden !important}.overflow-x-visible{overflow-x:visible !important}.overflow-x-scroll{overflow-x:scroll !important}.overflow-y-auto{overflow-y:auto !important}.overflow-y-hidden{overflow-y:hidden !important}.overflow-y-visible{overflow-y:visible !important}.overflow-y-scroll{overflow-y: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-inline-grid{display:inline-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:var(--pa-box-shadow) !important}.shadow-sm{box-shadow:var(--pa-box-shadow-sm) !important}.shadow-lg{box-shadow:var(--pa-box-shadow-lg) !important}.shadow-none{box-shadow:none !important}.focus-ring-primary{--pa-focus-ring-color: rgba(var(--pa-primary-rgb), var(--pa-focus-ring-opacity))}.focus-ring-secondary{--pa-focus-ring-color: rgba(var(--pa-secondary-rgb), var(--pa-focus-ring-opacity))}.focus-ring-success{--pa-focus-ring-color: rgba(var(--pa-success-rgb), var(--pa-focus-ring-opacity))}.focus-ring-info{--pa-focus-ring-color: rgba(var(--pa-info-rgb), var(--pa-focus-ring-opacity))}.focus-ring-warning{--pa-focus-ring-color: rgba(var(--pa-warning-rgb), var(--pa-focus-ring-opacity))}.focus-ring-danger{--pa-focus-ring-color: rgba(var(--pa-danger-rgb), var(--pa-focus-ring-opacity))}.focus-ring-light{--pa-focus-ring-color: rgba(var(--pa-light-rgb), var(--pa-focus-ring-opacity))}.focus-ring-dark{--pa-focus-ring-color: rgba(var(--pa-dark-rgb), var(--pa-focus-ring-opacity))}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{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(--pa-border-width) var(--pa-border-style) var(--pa-border-color) !important}.border-0{border:0 !important}.border-top{border-top:var(--pa-border-width) var(--pa-border-style) var(--pa-border-color) !important}.border-top-0{border-top:0 !important}.border-end{border-right:var(--pa-border-width) var(--pa-border-style) var(--pa-border-color) !important}.border-end-0{border-right:0 !important}.border-bottom{border-bottom:var(--pa-border-width) var(--pa-border-style) var(--pa-border-color) !important}.border-bottom-0{border-bottom:0 !important}.border-start{border-left:var(--pa-border-width) var(--pa-border-style) var(--pa-border-color) !important}.border-start-0{border-left:0 !important}.border-primary{--pa-border-opacity: 1;border-color:rgba(var(--pa-primary-rgb), var(--pa-border-opacity)) !important}.border-secondary{--pa-border-opacity: 1;border-color:rgba(var(--pa-secondary-rgb), var(--pa-border-opacity)) !important}.border-success{--pa-border-opacity: 1;border-color:rgba(var(--pa-success-rgb), var(--pa-border-opacity)) !important}.border-info{--pa-border-opacity: 1;border-color:rgba(var(--pa-info-rgb), var(--pa-border-opacity)) !important}.border-warning{--pa-border-opacity: 1;border-color:rgba(var(--pa-warning-rgb), var(--pa-border-opacity)) !important}.border-danger{--pa-border-opacity: 1;border-color:rgba(var(--pa-danger-rgb), var(--pa-border-opacity)) !important}.border-light{--pa-border-opacity: 1;border-color:rgba(var(--pa-light-rgb), var(--pa-border-opacity)) !important}.border-dark{--pa-border-opacity: 1;border-color:rgba(var(--pa-dark-rgb), var(--pa-border-opacity)) !important}.border-black{--pa-border-opacity: 1;border-color:rgba(var(--pa-black-rgb), var(--pa-border-opacity)) !important}.border-white{--pa-border-opacity: 1;border-color:rgba(var(--pa-white-rgb), var(--pa-border-opacity)) !important}.border-primary-subtle{border-color:var(--pa-primary-border-subtle) !important}.border-secondary-subtle{border-color:var(--pa-secondary-border-subtle) !important}.border-success-subtle{border-color:var(--pa-success-border-subtle) !important}.border-info-subtle{border-color:var(--pa-info-border-subtle) !important}.border-warning-subtle{border-color:var(--pa-warning-border-subtle) !important}.border-danger-subtle{border-color:var(--pa-danger-border-subtle) !important}.border-light-subtle{border-color:var(--pa-light-border-subtle) !important}.border-dark-subtle{border-color:var(--pa-dark-border-subtle) !important}.border-1{border-width:1px !important}.border-2{border-width:2px !important}.border-3{border-width:3px !important}.border-4{border-width:4px !important}.border-5{border-width:5px !important}.border-opacity-10{--pa-border-opacity: 0.1}.border-opacity-25{--pa-border-opacity: 0.25}.border-opacity-50{--pa-border-opacity: 0.5}.border-opacity-75{--pa-border-opacity: 0.75}.border-opacity-100{--pa-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}.row-gap-0{row-gap:0 !important}.row-gap-1{row-gap:.25rem !important}.row-gap-2{row-gap:.5rem !important}.row-gap-3{row-gap:1rem !important}.row-gap-4{row-gap:1.5rem !important}.row-gap-5{row-gap:3rem !important}.column-gap-0{column-gap:0 !important}.column-gap-1{column-gap:.25rem !important}.column-gap-2{column-gap:.5rem !important}.column-gap-3{column-gap:1rem !important}.column-gap-4{column-gap:1.5rem !important}.column-gap-5{column-gap:3rem !important}.font-monospace{font-family:var(--pa-font-monospace) !important}.fs-1{font-size:calc(1.375rem + 1.5vw) !important}.fs-2{font-size:calc(1.325rem + 0.9vw) !important}.fs-3{font-size:calc(1.3rem + 0.6vw) !important}.fs-4{font-size:calc(1.275rem + 0.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-lighter{font-weight:lighter !important}.fw-light{font-weight:300 !important}.fw-normal{font-weight:400 !important}.fw-medium{font-weight:500 !important}.fw-semibold{font-weight:600 !important}.fw-bold{font-weight:700 !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{--pa-text-opacity: 1;color:rgba(var(--pa-primary-rgb), var(--pa-text-opacity)) !important}.text-secondary{--pa-text-opacity: 1;color:rgba(var(--pa-secondary-rgb), var(--pa-text-opacity)) !important}.text-success{--pa-text-opacity: 1;color:rgba(var(--pa-success-rgb), var(--pa-text-opacity)) !important}.text-info{--pa-text-opacity: 1;color:rgba(var(--pa-info-rgb), var(--pa-text-opacity)) !important}.text-warning{--pa-text-opacity: 1;color:rgba(var(--pa-warning-rgb), var(--pa-text-opacity)) !important}.text-danger{--pa-text-opacity: 1;color:rgba(var(--pa-danger-rgb), var(--pa-text-opacity)) !important}.text-light{--pa-text-opacity: 1;color:rgba(var(--pa-light-rgb), var(--pa-text-opacity)) !important}.text-dark{--pa-text-opacity: 1;color:rgba(var(--pa-dark-rgb), var(--pa-text-opacity)) !important}.text-black{--pa-text-opacity: 1;color:rgba(var(--pa-black-rgb), var(--pa-text-opacity)) !important}.text-white{--pa-text-opacity: 1;color:rgba(var(--pa-white-rgb), var(--pa-text-opacity)) !important}.text-body{--pa-text-opacity: 1;color:rgba(var(--pa-body-color-rgb), var(--pa-text-opacity)) !important}.text-muted{--pa-text-opacity: 1;color:var(--pa-secondary-color) !important}.text-black-50{--pa-text-opacity: 1;color:rgba(0,0,0,.5) !important}.text-white-50{--pa-text-opacity: 1;color:rgba(255,255,255,.5) !important}.text-body-secondary{--pa-text-opacity: 1;color:var(--pa-secondary-color) !important}.text-body-tertiary{--pa-text-opacity: 1;color:var(--pa-tertiary-color) !important}.text-body-emphasis{--pa-text-opacity: 1;color:var(--pa-emphasis-color) !important}.text-reset{--pa-text-opacity: 1;color:inherit !important}.text-opacity-25{--pa-text-opacity: 0.25}.text-opacity-50{--pa-text-opacity: 0.5}.text-opacity-75{--pa-text-opacity: 0.75}.text-opacity-100{--pa-text-opacity: 1}.text-primary-emphasis{color:var(--pa-primary-text-emphasis) !important}.text-secondary-emphasis{color:var(--pa-secondary-text-emphasis) !important}.text-success-emphasis{color:var(--pa-success-text-emphasis) !important}.text-info-emphasis{color:var(--pa-info-text-emphasis) !important}.text-warning-emphasis{color:var(--pa-warning-text-emphasis) !important}.text-danger-emphasis{color:var(--pa-danger-text-emphasis) !important}.text-light-emphasis{color:var(--pa-light-text-emphasis) !important}.text-dark-emphasis{color:var(--pa-dark-text-emphasis) !important}.link-opacity-10{--pa-link-opacity: 0.1}.link-opacity-10-hover:hover{--pa-link-opacity: 0.1}.link-opacity-25{--pa-link-opacity: 0.25}.link-opacity-25-hover:hover{--pa-link-opacity: 0.25}.link-opacity-50{--pa-link-opacity: 0.5}.link-opacity-50-hover:hover{--pa-link-opacity: 0.5}.link-opacity-75{--pa-link-opacity: 0.75}.link-opacity-75-hover:hover{--pa-link-opacity: 0.75}.link-opacity-100{--pa-link-opacity: 1}.link-opacity-100-hover:hover{--pa-link-opacity: 1}.link-offset-1{text-underline-offset:.125em !important}.link-offset-1-hover:hover{text-underline-offset:.125em !important}.link-offset-2{text-underline-offset:.25em !important}.link-offset-2-hover:hover{text-underline-offset:.25em !important}.link-offset-3{text-underline-offset:.375em !important}.link-offset-3-hover:hover{text-underline-offset:.375em !important}.link-underline-primary{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-primary-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-secondary{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-secondary-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-success{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-success-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-info{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-info-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-warning{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-warning-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-danger{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-danger-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-light{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-light-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-dark{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-dark-rgb), var(--pa-link-underline-opacity)) !important}.link-underline{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-link-color-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-underline-opacity-0{--pa-link-underline-opacity: 0}.link-underline-opacity-0-hover:hover{--pa-link-underline-opacity: 0}.link-underline-opacity-10{--pa-link-underline-opacity: 0.1}.link-underline-opacity-10-hover:hover{--pa-link-underline-opacity: 0.1}.link-underline-opacity-25{--pa-link-underline-opacity: 0.25}.link-underline-opacity-25-hover:hover{--pa-link-underline-opacity: 0.25}.link-underline-opacity-50{--pa-link-underline-opacity: 0.5}.link-underline-opacity-50-hover:hover{--pa-link-underline-opacity: 0.5}.link-underline-opacity-75{--pa-link-underline-opacity: 0.75}.link-underline-opacity-75-hover:hover{--pa-link-underline-opacity: 0.75}.link-underline-opacity-100{--pa-link-underline-opacity: 1}.link-underline-opacity-100-hover:hover{--pa-link-underline-opacity: 1}.bg-primary{--pa-bg-opacity: 1;background-color:rgba(var(--pa-primary-rgb), var(--pa-bg-opacity)) !important}.bg-secondary{--pa-bg-opacity: 1;background-color:rgba(var(--pa-secondary-rgb), var(--pa-bg-opacity)) !important}.bg-success{--pa-bg-opacity: 1;background-color:rgba(var(--pa-success-rgb), var(--pa-bg-opacity)) !important}.bg-info{--pa-bg-opacity: 1;background-color:rgba(var(--pa-info-rgb), var(--pa-bg-opacity)) !important}.bg-warning{--pa-bg-opacity: 1;background-color:rgba(var(--pa-warning-rgb), var(--pa-bg-opacity)) !important}.bg-danger{--pa-bg-opacity: 1;background-color:rgba(var(--pa-danger-rgb), var(--pa-bg-opacity)) !important}.bg-light{--pa-bg-opacity: 1;background-color:rgba(var(--pa-light-rgb), var(--pa-bg-opacity)) !important}.bg-dark{--pa-bg-opacity: 1;background-color:rgba(var(--pa-dark-rgb), var(--pa-bg-opacity)) !important}.bg-black{--pa-bg-opacity: 1;background-color:rgba(var(--pa-black-rgb), var(--pa-bg-opacity)) !important}.bg-white{--pa-bg-opacity: 1;background-color:rgba(var(--pa-white-rgb), var(--pa-bg-opacity)) !important}.bg-body{--pa-bg-opacity: 1;background-color:rgba(var(--pa-body-bg-rgb), var(--pa-bg-opacity)) !important}.bg-transparent{--pa-bg-opacity: 1;background-color:rgba(0,0,0,0) !important}.bg-body-secondary{--pa-bg-opacity: 1;background-color:rgba(var(--pa-secondary-bg-rgb), var(--pa-bg-opacity)) !important}.bg-body-tertiary{--pa-bg-opacity: 1;background-color:rgba(var(--pa-tertiary-bg-rgb), var(--pa-bg-opacity)) !important}.bg-opacity-10{--pa-bg-opacity: 0.1}.bg-opacity-25{--pa-bg-opacity: 0.25}.bg-opacity-50{--pa-bg-opacity: 0.5}.bg-opacity-75{--pa-bg-opacity: 0.75}.bg-opacity-100{--pa-bg-opacity: 1}.bg-primary-subtle{background-color:var(--pa-primary-bg-subtle) !important}.bg-secondary-subtle{background-color:var(--pa-secondary-bg-subtle) !important}.bg-success-subtle{background-color:var(--pa-success-bg-subtle) !important}.bg-info-subtle{background-color:var(--pa-info-bg-subtle) !important}.bg-warning-subtle{background-color:var(--pa-warning-bg-subtle) !important}.bg-danger-subtle{background-color:var(--pa-danger-bg-subtle) !important}.bg-light-subtle{background-color:var(--pa-light-bg-subtle) !important}.bg-dark-subtle{background-color:var(--pa-dark-bg-subtle) !important}.bg-gradient{background-image:var(--pa-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:var(--pa-border-radius) !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:var(--pa-border-radius-sm) !important}.rounded-2{border-radius:var(--pa-border-radius) !important}.rounded-3{border-radius:var(--pa-border-radius-lg) !important}.rounded-4{border-radius:var(--pa-border-radius-xl) !important}.rounded-5{border-radius:var(--pa-border-radius-xxl) !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:var(--pa-border-radius-pill) !important}.rounded-top{border-top-left-radius:var(--pa-border-radius) !important;border-top-right-radius:var(--pa-border-radius) !important}.rounded-top-0{border-top-left-radius:0 !important;border-top-right-radius:0 !important}.rounded-top-1{border-top-left-radius:var(--pa-border-radius-sm) !important;border-top-right-radius:var(--pa-border-radius-sm) !important}.rounded-top-2{border-top-left-radius:var(--pa-border-radius) !important;border-top-right-radius:var(--pa-border-radius) !important}.rounded-top-3{border-top-left-radius:var(--pa-border-radius-lg) !important;border-top-right-radius:var(--pa-border-radius-lg) !important}.rounded-top-4{border-top-left-radius:var(--pa-border-radius-xl) !important;border-top-right-radius:var(--pa-border-radius-xl) !important}.rounded-top-5{border-top-left-radius:var(--pa-border-radius-xxl) !important;border-top-right-radius:var(--pa-border-radius-xxl) !important}.rounded-top-circle{border-top-left-radius:50% !important;border-top-right-radius:50% !important}.rounded-top-pill{border-top-left-radius:var(--pa-border-radius-pill) !important;border-top-right-radius:var(--pa-border-radius-pill) !important}.rounded-end{border-top-right-radius:var(--pa-border-radius) !important;border-bottom-right-radius:var(--pa-border-radius) !important}.rounded-end-0{border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.rounded-end-1{border-top-right-radius:var(--pa-border-radius-sm) !important;border-bottom-right-radius:var(--pa-border-radius-sm) !important}.rounded-end-2{border-top-right-radius:var(--pa-border-radius) !important;border-bottom-right-radius:var(--pa-border-radius) !important}.rounded-end-3{border-top-right-radius:var(--pa-border-radius-lg) !important;border-bottom-right-radius:var(--pa-border-radius-lg) !important}.rounded-end-4{border-top-right-radius:var(--pa-border-radius-xl) !important;border-bottom-right-radius:var(--pa-border-radius-xl) !important}.rounded-end-5{border-top-right-radius:var(--pa-border-radius-xxl) !important;border-bottom-right-radius:var(--pa-border-radius-xxl) !important}.rounded-end-circle{border-top-right-radius:50% !important;border-bottom-right-radius:50% !important}.rounded-end-pill{border-top-right-radius:var(--pa-border-radius-pill) !important;border-bottom-right-radius:var(--pa-border-radius-pill) !important}.rounded-bottom{border-bottom-right-radius:var(--pa-border-radius) !important;border-bottom-left-radius:var(--pa-border-radius) !important}.rounded-bottom-0{border-bottom-right-radius:0 !important;border-bottom-left-radius:0 !important}.rounded-bottom-1{border-bottom-right-radius:var(--pa-border-radius-sm) !important;border-bottom-left-radius:var(--pa-border-radius-sm) !important}.rounded-bottom-2{border-bottom-right-radius:var(--pa-border-radius) !important;border-bottom-left-radius:var(--pa-border-radius) !important}.rounded-bottom-3{border-bottom-right-radius:var(--pa-border-radius-lg) !important;border-bottom-left-radius:var(--pa-border-radius-lg) !important}.rounded-bottom-4{border-bottom-right-radius:var(--pa-border-radius-xl) !important;border-bottom-left-radius:var(--pa-border-radius-xl) !important}.rounded-bottom-5{border-bottom-right-radius:var(--pa-border-radius-xxl) !important;border-bottom-left-radius:var(--pa-border-radius-xxl) !important}.rounded-bottom-circle{border-bottom-right-radius:50% !important;border-bottom-left-radius:50% !important}.rounded-bottom-pill{border-bottom-right-radius:var(--pa-border-radius-pill) !important;border-bottom-left-radius:var(--pa-border-radius-pill) !important}.rounded-start{border-bottom-left-radius:var(--pa-border-radius) !important;border-top-left-radius:var(--pa-border-radius) !important}.rounded-start-0{border-bottom-left-radius:0 !important;border-top-left-radius:0 !important}.rounded-start-1{border-bottom-left-radius:var(--pa-border-radius-sm) !important;border-top-left-radius:var(--pa-border-radius-sm) !important}.rounded-start-2{border-bottom-left-radius:var(--pa-border-radius) !important;border-top-left-radius:var(--pa-border-radius) !important}.rounded-start-3{border-bottom-left-radius:var(--pa-border-radius-lg) !important;border-top-left-radius:var(--pa-border-radius-lg) !important}.rounded-start-4{border-bottom-left-radius:var(--pa-border-radius-xl) !important;border-top-left-radius:var(--pa-border-radius-xl) !important}.rounded-start-5{border-bottom-left-radius:var(--pa-border-radius-xxl) !important;border-top-left-radius:var(--pa-border-radius-xxl) !important}.rounded-start-circle{border-bottom-left-radius:50% !important;border-top-left-radius:50% !important}.rounded-start-pill{border-bottom-left-radius:var(--pa-border-radius-pill) !important;border-top-left-radius:var(--pa-border-radius-pill) !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}.z-n1{z-index:-1 !important}.z-0{z-index:0 !important}.z-1{z-index:1 !important}.z-2{z-index:2 !important}.z-3{z-index:3 !important}@media(min-width: 576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float:none !important}.object-fit-sm-contain{object-fit:contain !important}.object-fit-sm-cover{object-fit:cover !important}.object-fit-sm-fill{object-fit:fill !important}.object-fit-sm-scale{object-fit:scale-down !important}.object-fit-sm-none{object-fit: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-inline-grid{display:inline-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}.row-gap-sm-0{row-gap:0 !important}.row-gap-sm-1{row-gap:.25rem !important}.row-gap-sm-2{row-gap:.5rem !important}.row-gap-sm-3{row-gap:1rem !important}.row-gap-sm-4{row-gap:1.5rem !important}.row-gap-sm-5{row-gap:3rem !important}.column-gap-sm-0{column-gap:0 !important}.column-gap-sm-1{column-gap:.25rem !important}.column-gap-sm-2{column-gap:.5rem !important}.column-gap-sm-3{column-gap:1rem !important}.column-gap-sm-4{column-gap:1.5rem !important}.column-gap-sm-5{column-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}.object-fit-md-contain{object-fit:contain !important}.object-fit-md-cover{object-fit:cover !important}.object-fit-md-fill{object-fit:fill !important}.object-fit-md-scale{object-fit:scale-down !important}.object-fit-md-none{object-fit: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-inline-grid{display:inline-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}.row-gap-md-0{row-gap:0 !important}.row-gap-md-1{row-gap:.25rem !important}.row-gap-md-2{row-gap:.5rem !important}.row-gap-md-3{row-gap:1rem !important}.row-gap-md-4{row-gap:1.5rem !important}.row-gap-md-5{row-gap:3rem !important}.column-gap-md-0{column-gap:0 !important}.column-gap-md-1{column-gap:.25rem !important}.column-gap-md-2{column-gap:.5rem !important}.column-gap-md-3{column-gap:1rem !important}.column-gap-md-4{column-gap:1.5rem !important}.column-gap-md-5{column-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}.object-fit-lg-contain{object-fit:contain !important}.object-fit-lg-cover{object-fit:cover !important}.object-fit-lg-fill{object-fit:fill !important}.object-fit-lg-scale{object-fit:scale-down !important}.object-fit-lg-none{object-fit: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-inline-grid{display:inline-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}.row-gap-lg-0{row-gap:0 !important}.row-gap-lg-1{row-gap:.25rem !important}.row-gap-lg-2{row-gap:.5rem !important}.row-gap-lg-3{row-gap:1rem !important}.row-gap-lg-4{row-gap:1.5rem !important}.row-gap-lg-5{row-gap:3rem !important}.column-gap-lg-0{column-gap:0 !important}.column-gap-lg-1{column-gap:.25rem !important}.column-gap-lg-2{column-gap:.5rem !important}.column-gap-lg-3{column-gap:1rem !important}.column-gap-lg-4{column-gap:1.5rem !important}.column-gap-lg-5{column-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}.object-fit-xl-contain{object-fit:contain !important}.object-fit-xl-cover{object-fit:cover !important}.object-fit-xl-fill{object-fit:fill !important}.object-fit-xl-scale{object-fit:scale-down !important}.object-fit-xl-none{object-fit: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-inline-grid{display:inline-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}.row-gap-xl-0{row-gap:0 !important}.row-gap-xl-1{row-gap:.25rem !important}.row-gap-xl-2{row-gap:.5rem !important}.row-gap-xl-3{row-gap:1rem !important}.row-gap-xl-4{row-gap:1.5rem !important}.row-gap-xl-5{row-gap:3rem !important}.column-gap-xl-0{column-gap:0 !important}.column-gap-xl-1{column-gap:.25rem !important}.column-gap-xl-2{column-gap:.5rem !important}.column-gap-xl-3{column-gap:1rem !important}.column-gap-xl-4{column-gap:1.5rem !important}.column-gap-xl-5{column-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}.object-fit-xxl-contain{object-fit:contain !important}.object-fit-xxl-cover{object-fit:cover !important}.object-fit-xxl-fill{object-fit:fill !important}.object-fit-xxl-scale{object-fit:scale-down !important}.object-fit-xxl-none{object-fit: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-inline-grid{display:inline-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}.row-gap-xxl-0{row-gap:0 !important}.row-gap-xxl-1{row-gap:.25rem !important}.row-gap-xxl-2{row-gap:.5rem !important}.row-gap-xxl-3{row-gap:1rem !important}.row-gap-xxl-4{row-gap:1.5rem !important}.row-gap-xxl-5{row-gap:3rem !important}.column-gap-xxl-0{column-gap:0 !important}.column-gap-xxl-1{column-gap:.25rem !important}.column-gap-xxl-2{column-gap:.5rem !important}.column-gap-xxl-3{column-gap:1rem !important}.column-gap-xxl-4{column-gap:1.5rem !important}.column-gap-xxl-5{column-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-inline-grid{display:inline-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}}body{font-family:"Open Sans",sans-serif;font-weight:400;color:var(--text-color);background-color:var(--bg-color);max-width:1200px;margin:0 auto}.btn-primary{color:var(--text-color-reverse);background-color:var(--primary-color);border-color:var(--primary-color)}.btn-outline-primary{color:var(--primary-color);background:none;border-color:var(--primary-color)}.btn-outline-primary:hover{background-color:var(--primary-color);color:var(--text-color-reverse)}.btn-secondary{color:#fff;background-color:var(--secondary-color);border-color:var(--secondary-color)}.navbar .nav-top{height:86px}.navbar .fixed-menu{width:220px}.navbar .logo img{width:200px}a{text-decoration:underline;color:var(--link-color)}a:hover{color:var(--link-hover-color)}a:active{color:var(--link-color)}h1,.h1,h2,.h2{font-weight:500;line-height:1.25;padding-bottom:12px;padding-top:14px}h1,.h1{font-weight:600}h3,.h3{padding-top:16px}.motto .title{font-weight:600;font-size:32px;padding-top:36px}.motto .motto{font-weight:500;font-size:20px}.btn-fixed{border-width:2px;border-style:solid;width:220px;height:46px;text-transform:uppercase;font-weight:700;border-radius:5px 5px 5px 5px;vertical-align:middle;line-height:42px;padding:0;margin:16px;box-shadow:0 .125rem .25rem rgba(0,0,0,.075)}.pactus-video video{max-width:100%;width:100%;margin-left:auto;margin-right:auto;display:block}.highlighter-rouge .highlight pre{background-color:#0d1117;padding:32px 12px 12px 12px;color:#ccc;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:#0d1117 !important}.nav-tabs .nav-link{border-width:0 !important}.nav-tabs .nav-link:not(.active):hover{color:#fff !important;background-color:gray !important}.nav-tabs .active{color:#fff !important;background-color:#0d1117 !important}table thead tr th{font-weight:700;background-color:var(--bg-color) !important}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:var(--primary-color);color:var(--text-color-reverse)}.footer .section{font-size:1.75rem;font-weight:500;line-height:1.25;padding-bottom:20px}.footer li{padding-bottom:8px}.footer.anchor a{color:var(--text-color-reverse)}.footer.anchor a:link{color:var(--text-color-reverse);background-color:rgba(0,0,0,0);text-decoration:none}.footer.anchor a:hover{color:var(--text-color-reverse)}.footer .legal{color:var(--text-color-reverse);font-size:12px}.community img{margin:4px}.community_ran img{margin:4px}#btn-back-to-top{background-color:var(--primary-color);color:var(--bg-color);position:fixed;bottom:20px;right:20px;display:none}.edit-bar{padding-top:30px}.edit-bar .edit-btn,.edit-bar .edit-btn>a:hover{color:var(--text-color);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}:root{--primary-color-light: #021a34;--secondary-color-light: #075f94;--bg-color-light: #edeef0;--bg-color-reverse-light: #021a34;--bg-color-tinted-light: #b0b2b4;--text-color-light: #4c4c4c;--text-color-reverse-light: #edeef0;--text-muted-color-light: #4c4c4c;--link-color-light: #4c4c4c;--link-hover-color-light: #6c6c6c;--primary-color-dark: #edeef0;--secondary-color-dark: #075f94;--bg-color-dark: #14171c;--bg-color-reverse-dark: #edeef0;--bg-color-tinted-dark: #627191;--text-color-dark: #edeef0;--text-color-reverse-dark: #14171c;--text-muted-color-dark: #edeef0;--link-color-dark: #edeef0;--link-hover-color-dark: #ffffff}[data-bs-theme=light]{--primary-color: var(--primary-color-light);--secondary-color: var(--secondary-color-light);--bg-color-tinted: var(--bg-color-tinted-light);--bg-color: var(--bg-color-light);--bg-color-reverse: var(--bg-color-reverse-light);--text-color: var(--text-color-light);--text-color-reverse: var(--text-color-reverse-light);--text-muted-color: var(--text-muted-color-light);--link-color: var(--link-color-light);--link-hover-color: var(--link-hover-color-light)}[data-bs-theme=dark]{--primary-color: var(--primary-color-dark);--secondary-color: var(--secondary-color-dark);--bg-color: var(--bg-color-dark);--bg-color-reverse: var(--bg-color-reverse-dark);--bg-color-tinted: var(--bg-color-tinted-dark);--text-color: var(--text-color-dark);--text-color-reverse: var(--text-color-reverse-dark);--text-muted-color: var(--text-muted-color-dark);--link-color: var(--link-color-dark);--link-hover-color: var(--link-hover-color-dark)}.faq h3,.faq .h3{margin-top:20px;padding-top:16px;border-top:1px solid var(--primary-color)}.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}.faq .read_more{padding-top:12px}:root{--primary-color-light: #021a34;--secondary-color-light: #075f94;--bg-color-light: #edeef0;--bg-color-reverse-light: #021a34;--bg-color-tinted-light: #b0b2b4;--text-color-light: #4c4c4c;--text-color-reverse-light: #edeef0;--text-muted-color-light: #4c4c4c;--link-color-light: #4c4c4c;--link-hover-color-light: #6c6c6c;--primary-color-dark: #edeef0;--secondary-color-dark: #075f94;--bg-color-dark: #14171c;--bg-color-reverse-dark: #edeef0;--bg-color-tinted-dark: #627191;--text-color-dark: #edeef0;--text-color-reverse-dark: #14171c;--text-muted-color-dark: #edeef0;--link-color-dark: #edeef0;--link-hover-color-dark: #ffffff}[data-bs-theme=light]{--primary-color: var(--primary-color-light);--secondary-color: var(--secondary-color-light);--bg-color-tinted: var(--bg-color-tinted-light);--bg-color: var(--bg-color-light);--bg-color-reverse: var(--bg-color-reverse-light);--text-color: var(--text-color-light);--text-color-reverse: var(--text-color-reverse-light);--text-muted-color: var(--text-muted-color-light);--link-color: var(--link-color-light);--link-hover-color: var(--link-hover-color-light)}[data-bs-theme=dark]{--primary-color: var(--primary-color-dark);--secondary-color: var(--secondary-color-dark);--bg-color: var(--bg-color-dark);--bg-color-reverse: var(--bg-color-reverse-dark);--bg-color-tinted: var(--bg-color-tinted-dark);--text-color: var(--text-color-dark);--text-color-reverse: var(--text-color-reverse-dark);--text-muted-color: var(--text-muted-color-dark);--link-color: var(--link-color-dark);--link-hover-color: var(--link-hover-color-dark)}.toc .btn,.toc a{color:var(--text-color)}.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:var(--bg-color)}.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:var(--bg-color)}.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;width:50%}.timeline-card .card{border:1px solid rgba(0,0,0,.175);border-radius:5px;background-color:#eee;color:#4c4c4c}.timeline-card .card a{color:#4c4c4c}.timeline-card .card .text-muted{color:#898b8d !important}.timeline-card .card-title{padding-bottom:12px;font-size:1.1rem;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-color:#eee;box-sizing:border-box;transform:rotate(45deg) translate(-50%);top:34px;z-index:0;right:33px;border-right:1px solid rgba(0,0,0,.175);border-top:1px solid rgba(0,0,0,.175)}.timeline-card.right::before{content:"";position:absolute;height:20px;width:20px;background-color:#eee !important;box-sizing:border-box;transform:rotate(45deg) translate(-50%);top:33px;z-index:0;left:48px;border-left:1px solid rgba(0,0,0,.175);border-bottom: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:77px !important}.timeline-card.left::after,.timeline-card.right::after{left:8px !important}.timeline-card.left::before{border-right:none;border-top:none;border-left:1px solid rgba(0,0,0,.175);border-bottom:1px solid rgba(0,0,0,.175)}.timeline-card.right::before{right:auto}.timeline-card.right{left:0%}}:root{--primary-color-light: #021a34;--secondary-color-light: #075f94;--bg-color-light: #edeef0;--bg-color-reverse-light: #021a34;--bg-color-tinted-light: #b0b2b4;--text-color-light: #4c4c4c;--text-color-reverse-light: #edeef0;--text-muted-color-light: #4c4c4c;--link-color-light: #4c4c4c;--link-hover-color-light: #6c6c6c;--primary-color-dark: #edeef0;--secondary-color-dark: #075f94;--bg-color-dark: #14171c;--bg-color-reverse-dark: #edeef0;--bg-color-tinted-dark: #627191;--text-color-dark: #edeef0;--text-color-reverse-dark: #14171c;--text-muted-color-dark: #edeef0;--link-color-dark: #edeef0;--link-hover-color-dark: #ffffff}[data-bs-theme=light]{--primary-color: var(--primary-color-light);--secondary-color: var(--secondary-color-light);--bg-color-tinted: var(--bg-color-tinted-light);--bg-color: var(--bg-color-light);--bg-color-reverse: var(--bg-color-reverse-light);--text-color: var(--text-color-light);--text-color-reverse: var(--text-color-reverse-light);--text-muted-color: var(--text-muted-color-light);--link-color: var(--link-color-light);--link-hover-color: var(--link-hover-color-light)}[data-bs-theme=dark]{--primary-color: var(--primary-color-dark);--secondary-color: var(--secondary-color-dark);--bg-color: var(--bg-color-dark);--bg-color-reverse: var(--bg-color-reverse-dark);--bg-color-tinted: var(--bg-color-tinted-dark);--text-color: var(--text-color-dark);--text-color-reverse: var(--text-color-reverse-dark);--text-muted-color: var(--text-muted-color-dark);--link-color: var(--link-color-dark);--link-hover-color: var(--link-hover-color-dark)}.learn h2,.learn .h2{border-top:1px solid var(--primary-color)}[data-bs-theme=dark] blockquote{background:#14171c}[data-bs-theme=dark] .toc .btn-section::before{--svg-color: var(--text)}[data-bs-theme=dark] .fa-linux{color:#fff}/*# 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..a7da8066e --- /dev/null +++ b/assets/css/custom.css.map @@ -0,0 +1 @@ +{"version":3,"sourceRoot":"","sources":["../../_sass/_vars.scss","../../../node_modules/bootstrap/scss/_root.scss","../../../node_modules/bootstrap/scss/vendor/_rfs.scss","../../../node_modules/bootstrap/scss/mixins/_color-mode.scss","../../../node_modules/bootstrap/scss/_reboot.scss","../../../node_modules/bootstrap/scss/_variables.scss","../../../node_modules/bootstrap/scss/mixins/_border-radius.scss","../../../node_modules/bootstrap/scss/_type.scss","../../../node_modules/bootstrap/scss/mixins/_lists.scss","../../../node_modules/bootstrap/scss/_images.scss","../../../node_modules/bootstrap/scss/mixins/_image.scss","../../../node_modules/bootstrap/scss/mixins/_box-shadow.scss","../../../node_modules/bootstrap/scss/_containers.scss","../../../node_modules/bootstrap/scss/mixins/_container.scss","../../../node_modules/bootstrap/scss/mixins/_breakpoints.scss","../../../node_modules/bootstrap/scss/_grid.scss","../../../node_modules/bootstrap/scss/mixins/_grid.scss","../../../node_modules/bootstrap/scss/_tables.scss","../../../node_modules/bootstrap/scss/mixins/_table-variants.scss","../../../node_modules/bootstrap/scss/_buttons.scss","../../../node_modules/bootstrap/scss/mixins/_gradients.scss","../../../node_modules/bootstrap/scss/mixins/_transition.scss","../../../node_modules/bootstrap/scss/mixins/_buttons.scss","../../../node_modules/bootstrap/scss/_transitions.scss","../../../node_modules/bootstrap/scss/_dropdown.scss","../../../node_modules/bootstrap/scss/mixins/_caret.scss","../../../node_modules/bootstrap/scss/_nav.scss","../../../node_modules/bootstrap/scss/_navbar.scss","../../../node_modules/bootstrap/scss/_badge.scss","../../../node_modules/bootstrap/scss/_alert.scss","../../../node_modules/bootstrap/scss/mixins/_clearfix.scss","../../../node_modules/bootstrap/scss/helpers/_color-bg.scss","../../../node_modules/bootstrap/scss/helpers/_colored-links.scss","../../../node_modules/bootstrap/scss/helpers/_focus-ring.scss","../../../node_modules/bootstrap/scss/helpers/_icon-link.scss","../../../node_modules/bootstrap/scss/helpers/_ratio.scss","../../../node_modules/bootstrap/scss/helpers/_position.scss","../../../node_modules/bootstrap/scss/helpers/_stacks.scss","../../../node_modules/bootstrap/scss/helpers/_visually-hidden.scss","../../../node_modules/bootstrap/scss/mixins/_visually-hidden.scss","../../../node_modules/bootstrap/scss/helpers/_stretched-link.scss","../../../node_modules/bootstrap/scss/helpers/_text-truncation.scss","../../../node_modules/bootstrap/scss/mixins/_text-truncate.scss","../../../node_modules/bootstrap/scss/helpers/_vr.scss","../../../node_modules/bootstrap/scss/mixins/_utilities.scss","../../../node_modules/bootstrap/scss/utilities/_api.scss","../../_sass/_styles.scss","../../_sass/_hexdump.scss","../../_sass/_faq.scss","../../_sass/_toc.scss","../../_sass/_roadmap.scss","../../_sass/_learn.scss","../../_sass/dark_mode.scss"],"names":[],"mappings":"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,WLuQM,gBKvQN,WLgQM,iCK5PJ,YFynBkB,IExnBlB,YFwmB0B,IHzgB1B,0BKpGF,WLuQM,kBKvQN,WLgQM,iCK5PJ,YFynBkB,IExnBlB,YFwmB0B,IHzgB1B,0BKpGF,WLuQM,gBKvQN,WLgQM,iCK5PJ,YFynBkB,IExnBlB,YFwmB0B,IHzgB1B,0BKpGF,WLuQM,kBKvQN,WLgQM,iCK5PJ,YFynBkB,IExnBlB,YFwmB0B,IHzgB1B,0BKpGF,WLuQM,gBKvQN,WLgQM,iCK5PJ,YFynBkB,IExnBlB,YFwmB0B,IHzgB1B,0BKpGF,WLuQM,kBK/OR,eCvDE,eACA,gBD2DF,aC5DE,eACA,gBD8DF,kBACE,qBAEA,mCACE,aFsoB0B,ME5nB9B,YL8MM,UALI,QKvMR,yBAIF,YACE,cFiUO,KH1HH,UALI,QK/LR,wBACE,gBAIJ,mBACE,iBACA,cFuTO,KH1HH,UALI,QKtLR,MFtFS,QEwFT,2BACE,aEhGJ,WCIE,eAGA,YDDF,eACE,QJ6jDkC,OI5jDlC,iBJ6jDkC,kBI5jDlC,2DHGE,sCKLE,WARW,wBDKf,eAGA,YDcF,QAEE,qBAGF,YACE,oBACA,cAGF,gBPyPM,UALI,QOlPR,MJgjDkC,0BOllDlC,mGCHA,sBACA,iBACA,WACA,0CACA,yCACA,kBACA,iBCsDE,yBF5CE,yBACE,UPkee,OSvbnB,yBF5CE,uCACE,UPkee,OSvbnB,yBF5CE,qDACE,UPkee,OSvbnB,0BF5CE,mEACE,UPkee,QSvbnB,0BF5CE,kFACE,UPkee,QUlfvB,MAEI,2JAKF,KCNA,sBACA,iBACA,aACA,eAEA,uCACA,2CACA,0CDEE,OCOF,cACA,WACA,eACA,0CACA,yCACA,8BA+CI,KACE,YAGF,iBApCJ,cACA,WAcA,cACE,cACA,WAFF,cACE,cACA,UAFF,cACE,cACA,mBAFF,cACE,cACA,UAFF,cACE,cACA,UAFF,cACE,cACA,mBA+BE,UAhDJ,cACA,WAqDQ,OAhEN,cACA,kBA+DM,OAhEN,cACA,mBA+DM,OAhEN,cACA,UA+DM,OAhEN,cACA,mBA+DM,OAhEN,cACA,mBA+DM,OAhEN,cACA,UA+DM,OAhE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AEE,sBAPF,mBAEE,oBAGF,mBAEE,oBAPF,mBAEE,sBAGF,mBAEE,sBAPF,mBAEE,oBAGF,mBAEE,qBCrHV,OAEE,+BACA,4BACA,gCACA,6BAEA,2CACA,iCACA,gDACA,kCACA,mDACA,gEACA,kDACA,8DACA,iDACA,+DAEA,WACA,cZkYO,KYjYP,eZusB4B,IYtsB5B,0CAOA,yBACE,oBAEA,qFACA,oCACA,oBZ+sB0B,uBY9sB1B,2GAGF,aACE,uBAGF,aACE,sBAIJ,qBACE,+DAOF,aACE,iBAUA,4BACE,sBAeF,gCACE,sCAGA,kCACE,sCAOJ,oCACE,sBAGF,qCACE,mBAUF,2CACE,qDACA,+CAMF,yDACE,qDACA,+CAQJ,cACE,qDACA,+CAQA,8BACE,oDACA,8CC5IF,eAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,iBAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,eAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,YAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,eAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,cAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,aAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,YAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CDiJA,kBACE,gBACA,iCH3FF,4BGyFA,qBACE,gBACA,kCH3FF,4BGyFA,qBACE,gBACA,kCH3FF,4BGyFA,qBACE,gBACA,kCH3FF,6BGyFA,qBACE,gBACA,kCH3FF,6BGyFA,sBACE,gBACA,kCEnKN,KAEE,4BACA,6BACA,uBjBuRI,mBALI,KiBhRR,0BACA,0BACA,qCACA,yBACA,8CACA,mCACA,gDACA,yCACA,6FACA,gCACA,kFAGA,qBACA,wDACA,sCjBsQI,UALI,wBiB/PR,sCACA,sCACA,0BACA,kBACA,qBAEA,sBACA,eACA,iBACA,mEbjBE,0CcfF,iBDkCqB,iBRxBjB,WARW,yBUUX,WFwBJ,mHEpBI,uCFhBN,KEiBQ,iBFqBN,WACE,gCAEA,wCACA,8CAGF,sBAEE,0BACA,kCACA,wCAGF,mBACE,gCCrDF,iBDsDuB,uBACrB,8CACA,UAGE,mEAMJ,8BACE,8CACA,UAGE,mEAMJ,mGAKE,iCACA,yCAGA,+CR3EE,WARW,4BQsFb,yKAGI,sEAON,mDAGE,mCACA,oBACA,2CAEA,iDACA,uCRhGE,WARW,KQoHf,aGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,sCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,eGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,wCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,aGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,wCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,UGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,wCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,aGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,uCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,YGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,uCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,WGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,yCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,UGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,sCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHmHA,qBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,qCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,uBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,sCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,qBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,uCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,kBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,wCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,qBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,uCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,oBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,uCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,mBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,yCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,kBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,sCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBHsGF,UACE,0BACA,qCACA,yBACA,mCACA,iDACA,yCACA,kDACA,0CACA,iCACA,4CACA,gCACA,sCAEA,gBduRwC,Uc7QxC,wBACE,0BAGF,gBACE,gCAWJ,QGxIE,2BACA,yBpB8NI,mBALI,QoBvNR,mDHyIF,QG5IE,4BACA,2BpB8NI,mBALI,SoBvNR,mDCnEF,MFgBM,WEfJ,oBFmBI,uCEpBN,MFqBQ,iBElBN,iBACE,UAMF,qBACE,aAIJ,YACE,SACA,gBFDI,WEEJ,iBFEI,uCELN,YFMQ,iBEDN,gCACE,QACA,YFNE,WEOF,gBFHE,uEACE,iBGpBR,sEAME,kBAGF,iBACE,mBCwBE,wBACE,qBACA,YpB6hBwB,OoB5hBxB,epB2hBwB,OoB1hBxB,WArCJ,sBACA,sCACA,gBACA,qCA0DE,8BACE,cD9CN,eAEE,2BACA,+BACA,2BACA,gCACA,+BtBuQI,wBALI,KsBhQR,0CACA,oCACA,+DACA,qDACA,mDACA,0FACA,6DACA,uCACA,+CACA,+CACA,qDACA,mDACA,sCACA,sCACA,4DACA,mCACA,sCACA,oCACA,qCACA,uCAGA,kBACA,kCACA,aACA,uCACA,kEACA,StB0OI,UALI,6BsBnOR,+BACA,gBACA,gBACA,uCACA,4BACA,6ElBzCE,+CKLE,WARW,8Ba0Df,+BACE,SACA,OACA,qCAwBA,qBACE,qBAEA,qCACE,WACA,OAIJ,mBACE,mBAEA,mCACE,QACA,UV1CJ,yBU4BA,wBACE,qBAEA,wCACE,WACA,OAIJ,sBACE,mBAEA,sCACE,QACA,WV1CJ,yBU4BA,wBACE,qBAEA,wCACE,WACA,OAIJ,sBACE,mBAEA,sCACE,QACA,WV1CJ,yBU4BA,wBACE,qBAEA,wCACE,WACA,OAIJ,sBACE,mBAEA,sCACE,QACA,WV1CJ,0BU4BA,wBACE,qBAEA,wCACE,WACA,OAIJ,sBACE,mBAEA,sCACE,QACA,WV1CJ,0BU4BA,yBACE,qBAEA,yCACE,WACA,OAIJ,uBACE,mBAEA,uCACE,QACA,WAUN,uCACE,SACA,YACA,aACA,wCCpFA,gCACE,qBACA,YpB6hBwB,OoB5hBxB,epB2hBwB,OoB1hBxB,WA9BJ,aACA,sCACA,yBACA,qCAmDE,sCACE,cDgEJ,wCACE,MACA,WACA,UACA,aACA,sCClGA,iCACE,qBACA,YpB6hBwB,OoB5hBxB,epB2hBwB,OoB1hBxB,WAvBJ,oCACA,eACA,uCACA,uBA4CE,uCACE,cD0EF,iCACE,iBAMJ,0CACE,MACA,WACA,UACA,aACA,uCCnHA,mCACE,qBACA,YpB6hBwB,OoB5hBxB,epB2hBwB,OoB1hBxB,WAWA,mCACE,aAGF,oCACE,qBACA,apB0gBsB,OoBzgBtB,epBwgBsB,OoBvgBtB,WAnCN,oCACA,wBACA,uCAsCE,yCACE,cD2FF,oCACE,iBAON,kBACE,SACA,6CACA,gBACA,mDACA,UAMF,eACE,cACA,WACA,4EACA,WACA,YnByb4B,ImBxb5B,oCACA,mBACA,qBACA,mBACA,+BACA,SlBtKE,uDkByKF,0CAEE,0CJ1LF,iBI4LuB,iCAGvB,4CAEE,2CACA,qBJlMF,iBImMuB,kCAGvB,gDAEE,6CACA,oBACA,+BAMJ,oBACE,cAIF,iBACE,cACA,gFACA,gBtBmEI,UALI,SsB5DR,sCACA,mBAIF,oBACE,cACA,4EACA,oCAIF,oBAEE,6BACA,0BACA,+DACA,2BACA,kCACA,qCACA,6DACA,uDACA,sCACA,sCACA,2CACA,oCElPF,KAEE,8BACA,gCAEA,4BACA,0CACA,sDACA,wDAGA,aACA,eACA,eACA,gBACA,gBAGF,UACE,cACA,kExBsQI,UALI,6BwB/PR,2CACA,+BACA,qBACA,gBACA,SLfI,WKgBJ,uFLZI,uCKGN,ULFQ,iBKaN,gCAEE,qCAIF,wBACE,UACA,WrBkhBoB,+BqB9gBtB,sCAEE,wCACA,oBACA,eAQJ,UAEE,mDACA,mDACA,qDACA,4GACA,0DACA,gDACA,wGAGA,oFAEA,oBACE,uDACA,2DpB7CA,wDACA,yDoB+CA,oDAGE,kBACA,wDAIJ,8DAEE,2CACA,mDACA,yDAGF,yBAEE,oDpBjEA,yBACA,0BoB2EJ,WAEE,sDACA,uCACA,uCAGA,qBpB5FE,gDoBgGF,uDAEE,4CNjHF,iBMkHuB,mCASzB,eAEE,6BACA,0CACA,+DAGA,gCAEA,yBACE,gBACA,eACA,uEAEA,8DAEE,iCAIJ,+DAEE,YrB0d0B,IqBzd1B,gDACA,iCAUF,wCAEE,cACA,kBAKF,kDAEE,aACA,YACA,kBAMF,iEACE,WAUF,uBACE,aAEF,qBACE,cC7LJ,QAEE,yBACA,8BACA,4DACA,iEACA,oEACA,gEACA,uCACA,mCACA,qCACA,+DACA,qEACA,uCACA,uCACA,uCACA,uCACA,4QACA,2EACA,2DACA,yCACA,6DAGA,kBACA,aACA,eACA,mBACA,8BACA,8DAMA,2JACE,aACA,kBACA,mBACA,8BAoBJ,cACE,6CACA,gDACA,+CzB4NI,UALI,iCyBrNR,mCACA,qBACA,mBAEA,wCAEE,yCAUJ,YAEE,2BACA,gCAEA,4BACA,4CACA,wDACA,8DAGA,aACA,sBACA,eACA,gBACA,gBAGE,wDAEE,oCAIJ,2BACE,gBASJ,aACE,YtB8gCkC,MsB7gClC,etB6gCkC,MsB5gClC,6BAEA,yDAGE,oCAaJ,iBACE,gBACA,YAGA,mBAIF,gBACE,8EzByII,UALI,mCyBlIR,cACA,6BACA,+BACA,0ErBxIE,qDeHE,WM6IJ,oCNzII,uCMiIN,gBNhIQ,iBM0IN,sBACE,qBAGF,sBACE,qBACA,UACA,sDAMJ,qBACE,qBACA,YACA,aACA,sBACA,kDACA,4BACA,2BACA,qBAGF,mBACE,yCACA,gBb1HE,yBasIA,kBAEI,iBACA,2BAEA,8BACE,mBAEA,6CACE,kBAGF,wCACE,kDACA,iDAIJ,qCACE,iBAGF,mCACE,wBACA,gBAGF,kCACE,aAGF,6BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0BhBhOJ,WARW,KUUX,WMgOI,KAGA,+CACE,aAGF,6CACE,aACA,YACA,UACA,oBb5LR,yBasIA,kBAEI,iBACA,2BAEA,8BACE,mBAEA,6CACE,kBAGF,wCACE,kDACA,iDAIJ,qCACE,iBAGF,mCACE,wBACA,gBAGF,kCACE,aAGF,6BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0BhBhOJ,WARW,KUUX,WMgOI,KAGA,+CACE,aAGF,6CACE,aACA,YACA,UACA,oBb5LR,yBasIA,kBAEI,iBACA,2BAEA,8BACE,mBAEA,6CACE,kBAGF,wCACE,kDACA,iDAIJ,qCACE,iBAGF,mCACE,wBACA,gBAGF,kCACE,aAGF,6BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0BhBhOJ,WARW,KUUX,WMgOI,KAGA,+CACE,aAGF,6CACE,aACA,YACA,UACA,oBb5LR,0BasIA,kBAEI,iBACA,2BAEA,8BACE,mBAEA,6CACE,kBAGF,wCACE,kDACA,iDAIJ,qCACE,iBAGF,mCACE,wBACA,gBAGF,kCACE,aAGF,6BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0BhBhOJ,WARW,KUUX,WMgOI,KAGA,+CACE,aAGF,6CACE,aACA,YACA,UACA,oBb5LR,0BasIA,mBAEI,iBACA,2BAEA,+BACE,mBAEA,8CACE,kBAGF,yCACE,kDACA,iDAIJ,sCACE,iBAGF,oCACE,wBACA,gBAGF,mCACE,aAGF,8BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0BhBhOJ,WARW,KUUX,WMgOI,KAGA,gDACE,aAGF,8CACE,aACA,YACA,UACA,oBAtDR,eAEI,iBACA,2BAEA,2BACE,mBAEA,0CACE,kBAGF,qCACE,kDACA,iDAIJ,kCACE,iBAGF,gCACE,wBACA,gBAGF,+BACE,aAGF,0BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0BhBhOJ,WARW,KUUX,WMgOI,KAGA,4CACE,aAGF,0CACE,aACA,YACA,UACA,mBAiBZ,yCAGE,6CACA,mDACA,sDACA,+BACA,8BACA,oCACA,2DACA,+QAME,0CACE,+QCxRN,OAEE,6BACA,6B1BuRI,qBALI,O0BhRR,4BACA,uBACA,kDAGA,qBACA,4D1B+QI,UALI,0B0BxQR,wCACA,cACA,4BACA,kBACA,mBACA,wBtBJE,4CsBSF,aACE,aAKJ,YACE,kBACA,SChCF,OAEE,2BACA,2BACA,2BACA,+BACA,0BACA,qCACA,6EACA,kDACA,+BAGA,kBACA,4DACA,4CACA,4BACA,oCACA,8BvBHE,4CuBQJ,eAEE,cAIF,YACE,YxB6kB4B,IwB5kB5B,iCAQF,mBACE,cxBo+C8B,KwBj+C9B,8BACE,kBACA,MACA,QACA,UACA,qBAQF,eACE,kDACA,2CACA,yDACA,uDAJF,iBACE,oDACA,6CACA,2DACA,yDAJF,eACE,kDACA,2CACA,yDACA,uDAJF,YACE,+CACA,wCACA,sDACA,oDAJF,eACE,kDACA,2CACA,yDACA,uDAJF,cACE,iDACA,0CACA,wDACA,sDAJF,aACE,gDACA,yCACA,uDACA,qDAJF,YACE,+CACA,wCACA,sDACA,oDC9DF,iBACE,cACA,WACA,WCHF,iBACE,sBACA,iFAFF,mBACE,sBACA,mFAFF,iBACE,sBACA,iFAFF,cACE,sBACA,8EAFF,iBACE,sBACA,i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ACA,WAGF,oBACE,iBACA,iBAKF,cACE,iBCjVJ,SACE,sBACA,eACA,oBAGF,iBACE,+BACA,WAEF,gBACE,c/CRF,MAEE,+BACA,iCAEA,0BACA,kCACA,iCAEA,4BACA,oCACA,kCAEA,4BACA,kCAGA,8BACA,gCAEA,yBACA,iCACA,gCAEA,2BACA,mCACA,iCAEA,2BACA,iCAGF,sBACE,4CACA,gDACA,gDAEA,kCACA,kDACA,sCAEA,sDACA,kDAEA,sCACA,kDAGF,qBACE,2CACA,+CAEA,iCACA,iDACA,+CAEA,qCACA,qDACA,iDAEA,qCACA,iDgD7DA,iBACE,gBACA,iBACA,0CAGF,OACE,qBAGF,YACE,iBAEA,iBACE,gBACA,oBAIJ,gBACE,iBACA,oBAGF,gBACE,iBhDzBJ,MAEE,+BACA,iCAEA,0BACA,kCACA,iCAEA,4BACA,oCACA,kCAEA,4BACA,kCAGA,8BACA,gCAEA,yBACA,iCACA,gCAEA,2BACA,mCACA,iCAEA,2BACA,iCAGF,sBACE,4CACA,gDACA,gDAEA,kCACA,kDACA,sCAEA,sDACA,kDAEA,sCACA,kDAGF,qBACE,2CACA,+CAEA,iCACA,iDACA,+CAEA,qCACA,qDACA,iDAEA,qCACA,iDiD5DA,iBAEE,wBAGF,kBACE,qBACA,gBACA,+BAGF,gDAEE,iCAGF,iBACE,uBACA,mBACA,oBAGF,uEAGE,iCC1BJ,UACE,kBAGA,iBACE,WACA,kBACA,UACA,iBAXS,QAYT,MACA,SACA,SACA,iBAKJ,eACE,kBACA,UAEA,qBACE,kCACA,kBACA,sBACA,cAEA,uBACE,cAGF,iCACE,yBAIJ,2BACE,oBACA,iBACA,gBAIF,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,sBACA,sBACA,wCACA,SACA,UACA,WACA,wCACA,sCAIF,6BACE,WACA,kBACA,YACA,WACA,iCACA,sBACA,wCACA,SACA,UACA,UACA,uCACA,yCAIF,4BACE,WAKJ,qCAGE,iBACE,UAIF,eACE,WACA,6BACA,8BAGA,uBACE,qBAIF,uDAEE,oBAGF,4BACE,kBACA,gBACA,uCACA,yCAGF,6BACE,WAIF,qBACE,SlDlKN,MAEE,+BACA,iCAEA,0BACA,kCACA,iCAEA,4BACA,oCACA,kCAEA,4BACA,kCAGA,8BACA,gCAEA,yBACA,iCACA,gCAEA,2BACA,mCACA,iCAEA,2BACA,iCAGF,sBACE,4CACA,gDACA,gDAEA,kCACA,kDACA,sCAEA,sDACA,kDAEA,sCACA,kDAGF,qBACE,2CACA,+CAEA,iCACA,iDACA,+CAEA,qCACA,qDACA,iDAEA,qCACA,iDmD7DA,qBACE,0CCHF,gCACE,mBAKA,+CACE,yBAIJ,+BACE","sourcesContent":["$primary-color: #021a34;\n$secondary-color: #075f94;\n\n:root {\n // -- Light\n --primary-color-light: #021a34;\n --secondary-color-light: #075f94;\n\n --bg-color-light: #edeef0;\n --bg-color-reverse-light: #021a34;\n --bg-color-tinted-light: #b0b2b4;\n\n --text-color-light: #4c4c4c;\n --text-color-reverse-light: #edeef0;\n --text-muted-color-light: #4c4c4c;\n\n --link-color-light: #4c4c4c;\n --link-hover-color-light: #6c6c6c;\n\n // -- Dark\n --primary-color-dark: #edeef0;\n --secondary-color-dark: #075f94;\n\n --bg-color-dark: #14171c;\n --bg-color-reverse-dark: #edeef0;\n --bg-color-tinted-dark: #627191;\n\n --text-color-dark: #edeef0;\n --text-color-reverse-dark: #14171c;\n --text-muted-color-dark: #edeef0;\n\n --link-color-dark: #edeef0;\n --link-hover-color-dark: #ffffff;\n}\n\n[data-bs-theme=\"light\"] {\n --primary-color: var(--primary-color-light);\n --secondary-color: var(--secondary-color-light);\n --bg-color-tinted: var(--bg-color-tinted-light);\n\n --bg-color: var(--bg-color-light);\n --bg-color-reverse: var(--bg-color-reverse-light);\n --text-color: var(--text-color-light);\n\n --text-color-reverse: var(--text-color-reverse-light);\n --text-muted-color: var(--text-muted-color-light);\n\n --link-color: var(--link-color-light);\n --link-hover-color: var(--link-hover-color-light);\n}\n\n[data-bs-theme=\"dark\"] {\n --primary-color: var(--primary-color-dark);\n --secondary-color: var(--secondary-color-dark);\n\n --bg-color: var(--bg-color-dark);\n --bg-color-reverse: var(--bg-color-reverse-dark);\n --bg-color-tinted: var(--bg-color-tinted-dark);\n\n --text-color: var(--text-color-dark);\n --text-color-reverse: var(--text-color-reverse-dark);\n --text-muted-color: var(--text-muted-color-dark);\n\n --link-color: var(--link-color-dark);\n --link-hover-color: var(--link-hover-color-dark);\n}\n",":root,\n[data-bs-theme=\"light\"] {\n // Note: Custom variable values only support SassScript inside `#{}`.\n\n // Colors\n //\n // Generate palettes for full colors, grays, and theme colors.\n\n @each $color, $value in $colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $grays {\n --#{$prefix}gray-#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors-rgb {\n --#{$prefix}#{$color}-rgb: #{$value};\n }\n\n @each $color, $value in $theme-colors-text {\n --#{$prefix}#{$color}-text-emphasis: #{$value};\n }\n\n @each $color, $value in $theme-colors-bg-subtle {\n --#{$prefix}#{$color}-bg-subtle: #{$value};\n }\n\n @each $color, $value in $theme-colors-border-subtle {\n --#{$prefix}#{$color}-border-subtle: #{$value};\n }\n\n --#{$prefix}white-rgb: #{to-rgb($white)};\n --#{$prefix}black-rgb: #{to-rgb($black)};\n\n // Fonts\n\n // Note: Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$prefix}gradient: #{$gradient};\n\n // Root and body\n // scss-docs-start root-body-variables\n @if $font-size-root != null {\n --#{$prefix}root-font-size: #{$font-size-root};\n }\n --#{$prefix}body-font-family: #{inspect($font-family-base)};\n @include rfs($font-size-base, --#{$prefix}body-font-size);\n --#{$prefix}body-font-weight: #{$font-weight-base};\n --#{$prefix}body-line-height: #{$line-height-base};\n @if $body-text-align != null {\n --#{$prefix}body-text-align: #{$body-text-align};\n }\n\n --#{$prefix}body-color: #{$body-color};\n --#{$prefix}body-color-rgb: #{to-rgb($body-color)};\n --#{$prefix}body-bg: #{$body-bg};\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg)};\n\n --#{$prefix}emphasis-color: #{$body-emphasis-color};\n --#{$prefix}emphasis-color-rgb: #{to-rgb($body-emphasis-color)};\n\n --#{$prefix}secondary-color: #{$body-secondary-color};\n --#{$prefix}secondary-color-rgb: #{to-rgb($body-secondary-color)};\n --#{$prefix}secondary-bg: #{$body-secondary-bg};\n --#{$prefix}secondary-bg-rgb: #{to-rgb($body-secondary-bg)};\n\n --#{$prefix}tertiary-color: #{$body-tertiary-color};\n --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color)};\n --#{$prefix}tertiary-bg: #{$body-tertiary-bg};\n --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg)};\n // scss-docs-end root-body-variables\n\n --#{$prefix}heading-color: #{$headings-color};\n\n --#{$prefix}link-color: #{$link-color};\n --#{$prefix}link-color-rgb: #{to-rgb($link-color)};\n --#{$prefix}link-decoration: #{$link-decoration};\n\n --#{$prefix}link-hover-color: #{$link-hover-color};\n --#{$prefix}link-hover-color-rgb: #{to-rgb($link-hover-color)};\n\n @if $link-hover-decoration != null {\n --#{$prefix}link-hover-decoration: #{$link-hover-decoration};\n }\n\n --#{$prefix}code-color: #{$code-color};\n --#{$prefix}highlight-color: #{$mark-color};\n --#{$prefix}highlight-bg: #{$mark-bg};\n\n // scss-docs-start root-border-var\n --#{$prefix}border-width: #{$border-width};\n --#{$prefix}border-style: #{$border-style};\n --#{$prefix}border-color: #{$border-color};\n --#{$prefix}border-color-translucent: #{$border-color-translucent};\n\n --#{$prefix}border-radius: #{$border-radius};\n --#{$prefix}border-radius-sm: #{$border-radius-sm};\n --#{$prefix}border-radius-lg: #{$border-radius-lg};\n --#{$prefix}border-radius-xl: #{$border-radius-xl};\n --#{$prefix}border-radius-xxl: #{$border-radius-xxl};\n --#{$prefix}border-radius-2xl: var(--#{$prefix}border-radius-xxl); // Deprecated in v5.3.0 for consistency\n --#{$prefix}border-radius-pill: #{$border-radius-pill};\n // scss-docs-end root-border-var\n\n --#{$prefix}box-shadow: #{$box-shadow};\n --#{$prefix}box-shadow-sm: #{$box-shadow-sm};\n --#{$prefix}box-shadow-lg: #{$box-shadow-lg};\n --#{$prefix}box-shadow-inset: #{$box-shadow-inset};\n\n // Focus styles\n // scss-docs-start root-focus-variables\n --#{$prefix}focus-ring-width: #{$focus-ring-width};\n --#{$prefix}focus-ring-opacity: #{$focus-ring-opacity};\n --#{$prefix}focus-ring-color: #{$focus-ring-color};\n // scss-docs-end root-focus-variables\n\n // scss-docs-start root-form-validation-variables\n --#{$prefix}form-valid-color: #{$form-valid-color};\n --#{$prefix}form-valid-border-color: #{$form-valid-border-color};\n --#{$prefix}form-invalid-color: #{$form-invalid-color};\n --#{$prefix}form-invalid-border-color: #{$form-invalid-border-color};\n // scss-docs-end root-form-validation-variables\n}\n\n@if $enable-dark-mode {\n @include color-mode(dark, true) {\n color-scheme: dark;\n\n // scss-docs-start root-dark-mode-vars\n --#{$prefix}body-color: #{$body-color-dark};\n --#{$prefix}body-color-rgb: #{to-rgb($body-color-dark)};\n --#{$prefix}body-bg: #{$body-bg-dark};\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg-dark)};\n\n --#{$prefix}emphasis-color: #{$body-emphasis-color-dark};\n --#{$prefix}emphasis-color-rgb: #{to-rgb($body-emphasis-color-dark)};\n\n --#{$prefix}secondary-color: #{$body-secondary-color-dark};\n --#{$prefix}secondary-color-rgb: #{to-rgb($body-secondary-color-dark)};\n --#{$prefix}secondary-bg: #{$body-secondary-bg-dark};\n --#{$prefix}secondary-bg-rgb: #{to-rgb($body-secondary-bg-dark)};\n\n --#{$prefix}tertiary-color: #{$body-tertiary-color-dark};\n --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color-dark)};\n --#{$prefix}tertiary-bg: #{$body-tertiary-bg-dark};\n --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg-dark)};\n\n @each $color, $value in $theme-colors-text-dark {\n --#{$prefix}#{$color}-text-emphasis: #{$value};\n }\n\n @each $color, $value in $theme-colors-bg-subtle-dark {\n --#{$prefix}#{$color}-bg-subtle: #{$value};\n }\n\n @each $color, $value in $theme-colors-border-subtle-dark {\n --#{$prefix}#{$color}-border-subtle: #{$value};\n }\n\n --#{$prefix}heading-color: #{$headings-color-dark};\n\n --#{$prefix}link-color: #{$link-color-dark};\n --#{$prefix}link-hover-color: #{$link-hover-color-dark};\n --#{$prefix}link-color-rgb: #{to-rgb($link-color-dark)};\n --#{$prefix}link-hover-color-rgb: #{to-rgb($link-hover-color-dark)};\n\n --#{$prefix}code-color: #{$code-color-dark};\n --#{$prefix}highlight-color: #{$mark-color-dark};\n --#{$prefix}highlight-bg: #{$mark-bg-dark};\n\n --#{$prefix}border-color: #{$border-color-dark};\n --#{$prefix}border-color-translucent: #{$border-color-translucent-dark};\n\n --#{$prefix}form-valid-color: #{$form-valid-color-dark};\n --#{$prefix}form-valid-border-color: #{$form-valid-border-color-dark};\n --#{$prefix}form-invalid-color: #{$form-invalid-color-dark};\n --#{$prefix}form-invalid-border-color: #{$form-invalid-border-color-dark};\n // scss-docs-end root-dark-mode-vars\n }\n}\n","// stylelint-disable scss/dimension-no-non-numeric-values\n\n// SCSS RFS mixin\n//\n// Automated responsive values for font sizes, paddings, margins and much more\n//\n// Licensed under MIT (https://github.com/twbs/rfs/blob/main/LICENSE)\n\n// Configuration\n\n// Base value\n$rfs-base-value: 1.25rem !default;\n$rfs-unit: rem !default;\n\n@if $rfs-unit != rem and $rfs-unit != px {\n @error \"`#{$rfs-unit}` is not a valid unit for $rfs-unit. Use `px` or `rem`.\";\n}\n\n// Breakpoint at where values start decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n@if $rfs-breakpoint-unit != px and $rfs-breakpoint-unit != em and $rfs-breakpoint-unit != rem {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n}\n\n// Resize values based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != number or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Mode. Possibilities: \"min-media-query\", \"max-media-query\"\n$rfs-mode: min-media-query !default;\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-rfs to false\n$enable-rfs: true !default;\n\n// Cache $rfs-base-value unit\n$rfs-base-value-unit: unit($rfs-base-value);\n\n@function divide($dividend, $divisor, $precision: 10) {\n $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);\n $dividend: abs($dividend);\n $divisor: abs($divisor);\n @if $dividend == 0 {\n @return 0;\n }\n @if $divisor == 0 {\n @error \"Cannot divide by 0\";\n }\n $remainder: $dividend;\n $result: 0;\n $factor: 10;\n @while ($remainder > 0 and $precision >= 0) {\n $quotient: 0;\n @while ($remainder >= $divisor) {\n $remainder: $remainder - $divisor;\n $quotient: $quotient + 1;\n }\n $result: $result * 10 + $quotient;\n $factor: $factor * .1;\n $remainder: $remainder * 10;\n $precision: $precision - 1;\n @if ($precision < 0 and $remainder >= $divisor * 5) {\n $result: $result + 1;\n }\n }\n $result: $result * $factor * $sign;\n $dividend-unit: unit($dividend);\n $divisor-unit: unit($divisor);\n $unit-map: (\n \"px\": 1px,\n \"rem\": 1rem,\n \"em\": 1em,\n \"%\": 1%\n );\n @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {\n $result: $result * map-get($unit-map, $dividend-unit);\n }\n @return $result;\n}\n\n// Remove px-unit from $rfs-base-value for calculations\n@if $rfs-base-value-unit == px {\n $rfs-base-value: divide($rfs-base-value, $rfs-base-value * 0 + 1);\n}\n@else if $rfs-base-value-unit == rem {\n $rfs-base-value: divide($rfs-base-value, divide($rfs-base-value * 0 + 1, $rfs-rem-value));\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == px {\n $rfs-breakpoint: divide($rfs-breakpoint, $rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == rem or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: divide($rfs-breakpoint, divide($rfs-breakpoint * 0 + 1, $rfs-rem-value));\n}\n\n// Calculate the media query value\n$rfs-mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{divide($rfs-breakpoint, $rfs-rem-value)}#{$rfs-breakpoint-unit});\n$rfs-mq-property-width: if($rfs-mode == max-media-query, max-width, min-width);\n$rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height);\n\n// Internal mixin used to determine which media query needs to be used\n@mixin _rfs-media-query {\n @if $rfs-two-dimensional {\n @if $rfs-mode == max-media-query {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}), (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) and (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) {\n @content;\n }\n }\n}\n\n// Internal mixin that adds disable classes to the selector if needed.\n@mixin _rfs-rule {\n @if $rfs-class == disable and $rfs-mode == max-media-query {\n // Adding an extra class increases specificity, which prevents the media query to override the property\n &,\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @else if $rfs-class == enable and $rfs-mode == min-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Internal mixin that adds enable classes to the selector if needed.\n@mixin _rfs-media-query-rule {\n\n @if $rfs-class == enable {\n @if $rfs-mode == min-media-query {\n @content;\n }\n\n @include _rfs-media-query () {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n }\n @else {\n @if $rfs-class == disable and $rfs-mode == min-media-query {\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @include _rfs-media-query () {\n @content;\n }\n }\n}\n\n// Helper function to get the formatted non-responsive value\n@function rfs-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: \"\";\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + \" 0\";\n }\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n @if $unit == px {\n // Convert to rem if needed\n $val: $val + \" \" + if($rfs-unit == rem, #{divide($value, $value * 0 + $rfs-rem-value)}rem, $value);\n }\n @else if $unit == rem {\n // Convert to px if needed\n $val: $val + \" \" + if($rfs-unit == px, #{divide($value, $value * 0 + 1) * $rfs-rem-value}px, $value);\n } @else {\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n $val: $val + \" \" + $value;\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// Helper function to get the responsive value calculated by RFS\n@function rfs-fluid-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: \"\";\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + \" 0\";\n } @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $unit or $unit != px and $unit != rem {\n $val: $val + \" \" + $value;\n } @else {\n // Remove unit from $value for calculations\n $value: divide($value, $value * 0 + if($unit == px, 1, divide(1, $rfs-rem-value)));\n\n // Only add the media query if the value is greater than the minimum value\n @if abs($value) <= $rfs-base-value or not $enable-rfs {\n $val: $val + \" \" + if($rfs-unit == rem, #{divide($value, $rfs-rem-value)}rem, #{$value}px);\n }\n @else {\n // Calculate the minimum value\n $value-min: $rfs-base-value + divide(abs($value) - $rfs-base-value, $rfs-factor);\n\n // Calculate difference between $value and the minimum value\n $value-diff: abs($value) - $value-min;\n\n // Base value formatting\n $min-width: if($rfs-unit == rem, #{divide($value-min, $rfs-rem-value)}rem, #{$value-min}px);\n\n // Use negative value if needed\n $min-width: if($value < 0, -$min-width, $min-width);\n\n // Use `vmin` if two-dimensional is enabled\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{divide($value-diff * 100, $rfs-breakpoint)}#{$variable-unit};\n\n // Return the calculated value\n $val: $val + \" calc(\" + $min-width + if($value < 0, \" - \", \" + \") + $variable-width + \")\";\n }\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// RFS mixin\n@mixin rfs($values, $property: font-size) {\n @if $values != null {\n $val: rfs-value($values);\n $fluid-val: rfs-fluid-value($values);\n\n // Do not print the media query if responsive & non-responsive values are the same\n @if $val == $fluid-val {\n #{$property}: $val;\n }\n @else {\n @include _rfs-rule () {\n #{$property}: if($rfs-mode == max-media-query, $val, $fluid-val);\n\n // Include safari iframe resize fix if needed\n min-width: if($rfs-safari-iframe-resize-bug-fix, (0 * 1vw), null);\n }\n\n @include _rfs-media-query-rule () {\n #{$property}: if($rfs-mode == max-media-query, $fluid-val, $val);\n }\n }\n }\n}\n\n// Shorthand helper mixins\n@mixin font-size($value) {\n @include rfs($value);\n}\n\n@mixin padding($value) {\n @include rfs($value, padding);\n}\n\n@mixin padding-top($value) {\n @include rfs($value, padding-top);\n}\n\n@mixin padding-right($value) {\n @include rfs($value, padding-right);\n}\n\n@mixin padding-bottom($value) {\n @include rfs($value, padding-bottom);\n}\n\n@mixin padding-left($value) {\n @include rfs($value, padding-left);\n}\n\n@mixin margin($value) {\n @include rfs($value, margin);\n}\n\n@mixin margin-top($value) {\n @include rfs($value, margin-top);\n}\n\n@mixin margin-right($value) {\n @include rfs($value, margin-right);\n}\n\n@mixin margin-bottom($value) {\n @include rfs($value, margin-bottom);\n}\n\n@mixin margin-left($value) {\n @include rfs($value, margin-left);\n}\n","// scss-docs-start color-mode-mixin\n@mixin color-mode($mode: light, $root: false) {\n @if $color-mode-type == \"media-query\" {\n @if $root == true {\n @media (prefers-color-scheme: $mode) {\n :root {\n @content;\n }\n }\n } @else {\n @media (prefers-color-scheme: $mode) {\n @content;\n }\n }\n } @else {\n [data-bs-theme=\"#{$mode}\"] {\n @content;\n }\n }\n}\n// scss-docs-end color-mode-mixin\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n\n// Root\n//\n// Ability to the value of the root font sizes, affecting the value of `rem`.\n// null by default, thus nothing is generated.\n\n:root {\n @if $font-size-root != null {\n @include font-size(var(--#{$prefix}root-font-size));\n }\n\n @if $enable-smooth-scroll {\n @media (prefers-reduced-motion: no-preference) {\n scroll-behavior: smooth;\n }\n }\n}\n\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Prevent adjustments of font size after orientation changes in iOS.\n// 4. Change the default tap highlight to be completely transparent in iOS.\n\n// scss-docs-start reboot-body-rules\nbody {\n margin: 0; // 1\n font-family: var(--#{$prefix}body-font-family);\n @include font-size(var(--#{$prefix}body-font-size));\n font-weight: var(--#{$prefix}body-font-weight);\n line-height: var(--#{$prefix}body-line-height);\n color: var(--#{$prefix}body-color);\n text-align: var(--#{$prefix}body-text-align);\n background-color: var(--#{$prefix}body-bg); // 2\n -webkit-text-size-adjust: 100%; // 3\n -webkit-tap-highlight-color: rgba($black, 0); // 4\n}\n// scss-docs-end reboot-body-rules\n\n\n// Content grouping\n//\n// 1. Reset Firefox's gray color\n\nhr {\n margin: $hr-margin-y 0;\n color: $hr-color; // 1\n border: 0;\n border-top: $hr-border-width solid $hr-border-color;\n opacity: $hr-opacity;\n}\n\n\n// Typography\n//\n// 1. Remove top margins from headings\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n\n%heading {\n margin-top: 0; // 1\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-style: $headings-font-style;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: var(--#{$prefix}heading-color);\n}\n\nh1 {\n @extend %heading;\n @include font-size($h1-font-size);\n}\n\nh2 {\n @extend %heading;\n @include font-size($h2-font-size);\n}\n\nh3 {\n @extend %heading;\n @include font-size($h3-font-size);\n}\n\nh4 {\n @extend %heading;\n @include font-size($h4-font-size);\n}\n\nh5 {\n @extend %heading;\n @include font-size($h5-font-size);\n}\n\nh6 {\n @extend %heading;\n @include font-size($h6-font-size);\n}\n\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\n\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n\n// Abbreviations\n//\n// 1. Add the correct text decoration in Chrome, Edge, Opera, and Safari.\n// 2. Add explicit cursor to indicate changed behavior.\n// 3. Prevent the text-decoration to be skipped.\n\nabbr[title] {\n text-decoration: underline dotted; // 1\n cursor: help; // 2\n text-decoration-skip-ink: none; // 3\n}\n\n\n// Address\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\n\n// Lists\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\n// 1. Undo browser default\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // 1\n}\n\n\n// Blockquote\n\nblockquote {\n margin: 0 0 1rem;\n}\n\n\n// Strong\n//\n// Add the correct font weight in Chrome, Edge, and Safari\n\nb,\nstrong {\n font-weight: $font-weight-bolder;\n}\n\n\n// Small\n//\n// Add the correct font size in all browsers\n\nsmall {\n @include font-size($small-font-size);\n}\n\n\n// Mark\n\nmark {\n padding: $mark-padding;\n color: var(--#{$prefix}highlight-color);\n background-color: var(--#{$prefix}highlight-bg);\n}\n\n\n// Sub and Sup\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n\nsub,\nsup {\n position: relative;\n @include font-size($sub-sup-font-size);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n// Links\n\na {\n color: rgba(var(--#{$prefix}link-color-rgb), var(--#{$prefix}link-opacity, 1));\n text-decoration: $link-decoration;\n\n &:hover {\n --#{$prefix}link-color-rgb: var(--#{$prefix}link-hover-color-rgb);\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n &,\n &:hover {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n// Code\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-code;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\n// 1. Remove browser default top margin\n// 2. Reset browser default of `1em` to use `rem`s\n// 3. Don't allow content to break outside\n\npre {\n display: block;\n margin-top: 0; // 1\n margin-bottom: 1rem; // 2\n overflow: auto; // 3\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\ncode {\n @include font-size($code-font-size);\n color: var(--#{$prefix}code-color);\n word-wrap: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n\n kbd {\n padding: 0;\n @include font-size(1em);\n font-weight: $nested-kbd-font-weight;\n }\n}\n\n\n// Figures\n//\n// Apply a consistent margin strategy (matches our type styles).\n\nfigure {\n margin: 0 0 1rem;\n}\n\n\n// Images and content\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\n\n// Tables\n//\n// Prevent double borders\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: $table-cell-padding-y;\n padding-bottom: $table-cell-padding-y;\n color: $table-caption-color;\n text-align: left;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // 1\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n text-transform: none;\n}\n// Set the cursor for non-` +

+ + + + + +
+
+
+
+

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..00b1604bb --- /dev/null +++ b/community/index.html @@ -0,0 +1,446 @@ + + + + + + + + + + + + + Community | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+

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!

+ + + +

To explore the communities managed by members of the community, you can follow the links below.

+ + + +
+
+
+
+ + + + + diff --git a/contributing/index.html b/contributing/index.html new file mode 100644 index 000000000..bd7bcbd8c --- /dev/null +++ b/contributing/index.html @@ -0,0 +1,434 @@ + + + + + + + + + + + + + Contributing | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+

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..976670f98 --- /dev/null +++ b/download/index.html @@ -0,0 +1,545 @@ + + + + + + + + + + + + + Download | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+

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_1.0.2_darwin_amd64.tar.gzArchive macOS64-bit
pactus-gui_1.0.2_darwin_amd64.dmgDMG macOS64-bit
pactus-gui_1.0.2_darwin_arm64.tar.gzArchive macOSARM64
pactus-gui_1.0.2_darwin_arm64.dmgDMG macOSARM64
pactus-gui_1.0.2_linux_amd64.tar.gzArchive Linux64-bit
pactus-gui_1.0.2_windows_amd64.zipArchive Windows64-bit
pactus-gui_1.0.2_windows_amd64_installer.exeInstaller Windows64-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_1.0.2_android_arm64.tar.gz AndroidARM64
pactus-cli_1.0.2_darwin_amd64.tar.gz macOS64-bit
pactus-cli_1.0.2_darwin_arm64.tar.gz macOSARM64
pactus-cli_1.0.2_freebsd_amd64.tar.gz FreeBSD64-bit
pactus-cli_1.0.2_freebsd_arm.tar.gz FreeBSDARM
pactus-cli_1.0.2_linux_amd64.tar.gz Linux64-bit
pactus-cli_1.0.2_linux_arm64.tar.gz LinuxARM64
pactus-cli_1.0.2_windows_386.zip Windows32-bit
pactus-cli_1.0.2_windows_amd64.zip Windows64-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?

+ +

Downloader script

+ +

For Unix-like systems (e.g., Linux, macOS, or MSYS2 on Windows), there is a downloader script available. This script can download the archived file, verify it, and extract it for you. To use it, simply run the following command in your terminal:

+ +
curl --proto '=https' --tlsv1.2 -sSL https://github.com/pactus-project/pactus/releases/download/v1.0.2/pactus_downloader.sh | sh
+
+ +
+ +

🐳 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..91d3235f6 --- /dev/null +++ b/feed.xml @@ -0,0 +1,1223 @@ +Jekyll2024-03-10T09:34:30+00:00https://pactus.org/feed.xmlPactus blockchainPactus 1.0.2 (Istanbul) Released2024-02-18T00:00:00+00:002024-02-18T00:00:00+00:00https://pactus.org/2024/02/18/release-1-0-2Overview
+ +

Pactus Blockchain Version 1.0.2 (Istanbul) +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.

+ +

This release is named after the city of Istanbul and it +was unanimously selected by Pactus community.

+ +

Pactus Version 1.0.2 (Istanbul)

+ +

Highlights

+ +

This update fixes a major issue that decreases the number of inbound connections of the nodes over time. +We highly recommend all users to upgrade to the new version for better connectivity.

+ +

Download

+ +

To start using Pactus blockchain, download the latest version from the download +page and join the Mainnet.

+ +

How to Upgrade

+ +

If you are running an older version, close it first. +Then uninstall the previous version and install the newer version. +If you are using the archived version, simply replace it with the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Fix

+ +
    +
  • sync: fix concurrent map read-write crash (#1112)
  • +
  • network: remove disconnected peers from peerMgr (#1110)
  • +
+ +

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

]]>Pactus 1.0.1 (Beijing) Released2024-02-10T00:00:00+00:002024-02-10T00:00:00+00:00https://pactus.org/2024/02/10/release-1-0-1Overview + +

Pactus Blockchain Version 1.0.1 (Beijing) +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.

+ +

This release is named after the city of Beijing and it +was unanimously selected by Pactus community.

+ +

Pactus Version 1.0.1 (Beijing)

+ +

Highlights

+ +

This update fixes several issues identified after the release of +1.0.0 (Beijing). +Specifically, it fixes the missed log file on the Windows GUI application and improves the node connectivity.

+ +

Download

+ +

To start using Pactus blockchain, download the latest version from the download +page and join the Mainnet.

+ +

How to Upgrade

+ +

If you are running an older version, close it first. +Then uninstall the previous version and install the newer version. +If you are using the archived version, simply replace it with the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • gui: add connections and moniker fields to main windows (#1090)
  • +
+ +

Fix

+ +
    +
  • network: set dial and accept limit in connection gater (#1089)
  • +
  • gui stderr logger in windows os (#1081)
  • +
  • sync: improve syncing process (#1087)
  • +
  • network: redefine resource limits (#1086)
  • +
+ +

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

]]>
Pactus 1.0.0 (Beijing) Released2024-01-31T00:00:00+00:002024-01-31T00:00:00+00:00https://pactus.org/2024/01/31/release-1-0-0Overview + +

Pactus Blockchain Version 1.0.0 (Beijing) +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.

+ +

Pactus Version 1.0.0 (Beijing)

+ +

Highlights

+ +

Mainnet Official Release v1.0.0 (Beijing)

+ +

The much-anticipated official software release of Pactus v1.0.0 (Beijing) marks a significant milestone +for our community. +This impressive mainnet release represents the culmination of extensive development efforts. +Pactus v1.0.0 (Beijing) offers a pioneering solution for streamlining the validation of Pactus blockchain, +enhancing security, and providing a user-friendly experience. We’re excited to unveil the official software +and welcome users to experience the power of Pactus in revolutionizing the future of blockchain. Join us on +this exciting journey.

+ +

Onboarding validators

+ +

On February 1st, a total of 53,494 PAC coins will be distributed among 1,311 validators who participated in +Testnet-0, +Testnet-1, and +Testnet-2. +This marks the beginning of a new chapter in the decentralized world.

+ +

Download

+ +

This version has been implemented for Mainnet +To start using Pactus Mainnet, download the latest version from the download +page and join the Mainnet.

+ +

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

+ + + +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • implement get validator address for grpc (#975)
  • +
  • add bootstrap.json and load in config on build (#964)
  • +
  • add mainnet config and genesis files (#951)
  • +
  • add Consensus-address to network info (#952)
  • +
  • grpc: sign transaction using wallet client (#945)
  • +
  • pactus gui lock support (#947)
  • +
  • consensus: turning consensus to a zero-config module (#942)
  • +
+ +

Fix

+ +
    +
  • localnet wallet issue (#970)
  • +
  • sync: remove ReachabilityStatus from agent info (#956)
  • +
  • daemon: keeping previous behavior for password flag, linting CLI messages (#950)
  • +
  • consensus: detect if the system time is behind the network (#939)
  • +
+ +

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

]]>
Mainnet launched 🚀2024-01-24T20:24:00+00:002024-01-24T20:24:00+00:00https://pactus.org/2024/01/24/mainnet-launchedYears to Launch + +

Pactus Mainnet started creating the first block on 24 January 2024 at 20:24:10 UTC time. +Pactus Mainnet is the result of years of hard work, research, and innovation. +It started from one idea:

+ +

A low-cost, truly decentralized blockchain, built by the people for the people, +where anyone could run and be their own validator.

+ +

We faced many challenges and obstacles along the way, but we never gave up.
+We overcame them with our determination and perseverance.
+We learned from our mistakes and improved our solutions.
+We grew from a small team to a large community.
+We achieved many milestones and breakthroughs. And we did it.
+We created Pactus, the platform that empowers you.

+ +

Thanks to Community

+ +

We want to thank Pactus community for helping us on the Testnet.

+ +

You have been instrumental in testing and improving the Testnet.
+You have given us your honest feedback and constructive suggestions.
+You have reported and help fixed bugs and errors.
+You have challenged and pushed us to do better.
+You have been our partners and friends in this journey.

+ +

On the Road

+ +

The true journey has just started.
+The Mainnet is not the end, but the beginning.
+The beginning of a new era of blockchain innovation.
+The beginning of a new challenge and opportunity.
+The beginning of a new revolution and evolution!

+ +

We welcome you more than ever.
+We need you to join us in this exciting adventure.
+We need you to support us in this ambitious endeavor.
+We need you to be part of Pactus, the platform that empowers you!

+ +

We Have a Dream

+ +

We have a dream.
+A dream of a world where blockchain technology is not a privilege, but a right for everyone.
+A dream of a world where smart contracts and decentralized applications are fast, secure, and scalable.
+A dream of a world where Pactus is the platform that empowers you.

+ +

This dream is not just ours. It is yours too.
+You share our vision and passion for blockchain innovation.
+You believe in our potential and impact.
+You support our goals and values.
+You are part of our dream.

+ +

And this dream is not just a fantasy. It is a reality.
+A reality that we have created together.
+A reality that we have launched today. A reality that we can explore and enjoy together.
+A reality that we can shape and improve together.
+A reality that we can make better and brighter together!

]]>
Story of Testnet-22024-01-22T00:00:00+00:002024-01-22T00:00:00+00:00https://pactus.org/2024/01/22/testnet-2-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

+ +

In October 2023, we launched Testnet-2. +The main purpose of this Testnet was to closely monitor the new consensus mechanism and the stability of the P2P network.

+ +

The committee for Testnet-2 was set to 51 validators, +and 2084 validators joined during the Testnet period. +More than 1500 computers and servers joined the network, and we experienced a high volume of data transmission in the network. +More than 800,000 blocks were created, and about 2 million transactions were processed during this time. +The size of the blockchain is about 450 megabytes.

+ +

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

+ +

Stability of Consensus

+ +

In Testnet-1, we had one consensus failure that caused us to +conclude the Testnet-1. +During Testnet-2, there were no issues with the consensus mechanism, and +we had no case of failure during the testing period, +although the number of validators and nodes significantly increased on Testnet-2 compared to its predecessor. +It proved that the consensus mechanism is in a stable situation.

+ +

Networking issues

+ +

In Testnet-2, the blockchain stopped twice, and each time it took more than 24 hours to fix the problem. +In the second blockage, we had no choice but to ask active validators inside the committee to +update their nodes to overcome the networking issue. +The development team faced a difficult situation and had to make the proper decision to fix the networking issues. +On one hand, the networking traffic increased significantly, and on the other hand, we had to +make sure normal users with limited internet bandwidth could still participate in the consensus mechanism without any problems. +After examining different scenarios, the networking issues were resolved, and +no major problems were reported till the end of Testnet.

+ +

Major updates

+ +

During Testnet-2, we introduced several updates, including versions +0.15.0, +0.16.0, +0.17.0, +0.18.0, +0.19.0, and +0.20.0. +The update process went smoothly, and with the stability of Version 0.20.0 confirmed, +the development team shifted its focus to the Mainnet launch.

+ +

Special 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 PAC coins to set up their validators.

+ +

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

]]>
Pactus 0.20.0 Released2024-01-11T00:00:00+00:002024-01-11T00:00:00+00:00https://pactus.org/2024/01/11/release-0-20-0Overview + +

Pactus Blockchain Version 0.20.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

+ +

Validator Stake Management

+ +

The new GUI application enables users to easily Unbond and Withdraw their validator’s stake.

+ +

Withdraw dialog

+ +

Improving Network Connectivity

+ +

Some users have reported that UDP packets are being dropped by their Internet Service Providers. +Therefore, the UDP protocol is disabled by default. +Users can still activate the UDP protocol by configuring the settings in the file if necessary.

+ +

Also, the experimental Node Gossip feature has been removed in this version. +Node gossip could cause some validators to become isolated from the rest of the network.

+ +

Relay service

+ +

This version enables users to turn their node into a relay service. +A relay service node can help users behind NAT to communicate with each other. +It is disabled by default and can be enabled inside the config file. +Please note that it is still in an experimental state.

+ +

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

+ +
    +
  • implement relay service (#931)
  • +
  • HTTP: Integrate AddRowDouble and update tests (#926)
  • +
  • network: making listen address private in config (#921)
  • +
  • http: adding AvailabilityScore to http module (#917)
  • +
  • network: adding ‘enable_udp’ config (#918)
  • +
  • network: removing gossip node service (#916)
  • +
  • gRPC: adding AvailabilityScore to gRPC (#910)
  • +
  • GUI: unbond and withdraw transaction dialogs (#908)
  • +
+ +

Fix

+ +
    +
  • gRPC: adding missing get raw transaction APIs to gRPC gateway (#925)
  • +
  • network: preventing self dial (#924)
  • +
  • fixing time lag on starting node (#923)
  • +
  • network: fixing network deadlock on linux arm64 (#922)
  • +
  • GUI: updating unbond and withdraw dialogs (#911)
  • +
  • fixing gRPC node info issue (#906)
  • +
+ +

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

]]>
Pactus records its IPs in IPMINTER2024-01-10T00:00:00+00:002024-01-10T00:00:00+00:00https://pactus.org/2024/01/10/pactus-records-its-ips-in-ipminterIPMINTER

+ +

In our continuous pursuit of innovation, the recording of our intellectual property is the +cornerstone philosophy of Pactus. Yet, we found traditional patenting methods to be a +slow and expensive hurdle. That is… until we discovered IPMINTER!

+ +

Pactus profile in IPMINTER

+ +

We are ecstatic to announce that the blockchain-based platform by IPMINTER has +revolutionized the way we secure our creations.

+ +

Gone are the days of lengthy processes and hefty fees. With IPMINTER, registering our +intellectual property on the blockchain was a cakewalk – accomplished in a mere 10 minutes! +Plus, the moment we received our exquisite certificate, complete with a QR code directly linking +to our secure blockchain entry, our confidence in this platform soared.

+ +

Our journey with IPMINTER didn’t end there, it became our trusted ally in the ongoing mission +to protect our inventive proposals. The assurance we’ve experienced using their platform has +been unparalleled.

+ +

We’re proud to share our story and to recommend IPMINTER to those on a quest for a straightforward, +economical, and robust IP recording solution. They have our heartfelt endorsement!

+ +

Join us in embracing the future of IP management with IPMINTER. Record what’s yours, the smart way!

]]>
Mainnet announcement2024-01-08T00:00:00+00:002024-01-08T00:00:00+00:00https://pactus.org/2024/01/08/mainnet-announcementThe much-awaited Mainnet Launch of The Pactus Blockchain is finally here! +On January 24, 2024, at 20:24:00 UTC, the first block, known as the Genesis block, +will be minted by four Bootstrap validators. +After that, every 10 seconds, a new block will be added to the blockchain. +Each block contains the committed transactions in the network. +The block finality in the Pactus blockchain is immediate. +It means that there is no need to wait for block confirmation to ensure a transaction is committed.

+ +

Later, more than 2000 community validators will secure the blockchain and make it decentralized. +These validators are Testnet participants who helped test Pactus during our testing period. +The community validators will receive the initial staking coins from a Discord Bot named RoboPac.

+ +

To ensure everything works smoothly on the Mainnet, three different Testnets ( +Testnet0, +Testnet1, and +Testnet2) have been run.

+ +

The Mainnet will never be stopped or interrupted by the core developers of Pactus, +and validators should primarily participate in and maintain the security of the blockchain.

]]>
Pactus 0.19.0 Released2024-01-04T00:00:00+00:002024-01-04T00:00:00+00:00https://pactus.org/2024/01/04/release-0-19-0Overview + +

Pactus Blockchain Version 0.19.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 has improved the overall performance of the blockchain by implementing +PIP-15. +PIP-15 suggests to add caching algorithms to the database for the most frequently used items.

+ +

Additionally, this version has enhanced the connectivity of the nodes in the P2P network.

+ +

Availability Score

+ +

This version comes with the implementation of PIP-19. +PIP-19 suggests assigning the “Availability Score” to each validator based on their activities in the +committee. +Validators with a score less than 0.8 won’t receive the block reward, +as their proposals will be rejected by other validators. +The main reason behind this PIP is to prevent users from downgrading +their node specifications and running Pactus on machines with low resources.

+ +

Breaking change

+ +

The Docker container now contains both daemon and wallet binary files. +Users who use Docker to run Pacts now need to add the entry point to run Pactus.

+ +

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

+ +
    +
  • gRPC: defining network and peers info response’s properly (#898)
  • +
  • implementing pip-19 (#899)
  • +
  • network: disabling GosipSub, only FloodSub (#895)
  • +
  • www: adding change proposer round and value to consensus info votes (#892)
  • +
  • network: adding relay service to dial relay nodes (#887)
  • +
  • implementing pip-15 (#843)
  • +
  • check already running by lock file (#871)
  • +
+ +

Fix

+ +
    +
  • store: use cache to check if public key exists (#902)
  • +
  • executor: not rejecting bond transaction for bootstrap validator (#901)
  • +
  • GUI: removing unnecessary tags in transaction confirm dialog (#893)
  • +
  • network: close relay connection for public node (#891)
  • +
  • network: refining GossipSubParams for Gossiper node (#882)
  • +
  • sync: adding sequence number to the bundle (#881)
  • +
  • network: turn off mesh for gossiper node (#880)
  • +
  • consensus: check voteset for CP strong termination (#879)
  • +
  • adding querier to query messages (#878)
  • +
  • execution: fixing issue #869 (#870)
  • +
  • fixing logger issue on rotating log file (#859)
  • +
+ +

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

]]>
Pactus 0.18.0 Released2023-12-12T00:00:00+00:002023-12-12T00:00:00+00:00https://pactus.org/2023/12/12/release-0-18-0Overview + +

Pactus Blockchain Version 0.18.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 has significantly improved the syncing progress. +The syncing process concurrently requests blocks from 8 different peers and +actively connects to the most optimal peers for downloading the blockchain.

+ +

Additionally, users can now import private keys into their wallet and securely encrypt them using their wallet password.

+ +

Breaking change

+ +

For Unix-based systems, please note that the working directory for root users has changed from /pactus to /root/pactus.

+ +

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.

+ +

+After you update the node, the configuration file will automatically get updated, keeping the old settings. +If you want to return the configuration file to its default settings, +just delete the current config file and restart the node. +

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • implement pip-14 (#841)
  • +
  • sort wallet addresses (#836)
  • +
  • grpc: endpoints for creating raw transaction (#838)
  • +
  • network reachability API (#834)
  • +
  • implement pip-13 (#835)
  • +
  • subscribing to libp2p eventbus (#831)
  • +
  • implement helper methods for wallet address path (#830)
  • +
  • logger: adding rotate log file after days, compress and maxgae for logger config (#822)
  • +
  • enable bandwidth router metric (#819)
  • +
+ +

Fix

+ +
    +
  • network: refining the connection limit (#849)
  • +
  • corrected mistake when retrieving the reward address (#848)
  • +
  • config: restore default config when it is deleted (#847)
  • +
  • cmd: changing home directory for root users (#846)
  • +
  • removing BasicCheck for hash (#845)
  • +
  • disabling libp2p ping protocol (#844)
  • +
  • build docker file (#839)
  • +
  • sync: ignore publishing a block if it is received before (#829)
  • +
  • network: subscribing to the Libp2p event bus (#828)
  • +
  • sync: ignore block request if blocks are already inside the cache (#817)
  • +
+ +

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

]]>
Pactus 0.17.0 Released2023-11-12T00:00:00+00:002023-11-12T00:00:00+00:00https://pactus.org/2023/11/12/release-0-17-0Overview + +

Pactus Blockchain Version 0.17.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 Testnet has been upgraded and all validators must update their nodes.

+ +

This version will address major networking issues, reduce network usage, and improve overall performance.

+ +

A new node type, “Node Gossips”, has been introduced to help broadcast and spread messages across the network. +Node Gossips support the network by delivering messages to non-gossiping nodes. +This gossip option is disabled by default but can be enabled in the configuration file. +If you are running Pactus on a stable and reliable server, we recommend enabling this option for your node. +Please note that this option is still experimental and subject to potential changes in future releases.

+ +

Node gossip in config 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.

+ +

+After updating the node, the configuration file will be overwritten with a new version. +You need to make modifications to the config file if you had customized it prior to the update. +

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • network: default configs for bootstrap and relay peers (#812)
  • +
  • introducing node gossip type (#811)
  • +
  • sync: adding remote address to the peer info (#804)
  • +
  • network: adding public address to factory (#795)
  • +
  • network: filter private ips (#793)
  • +
+ +

Fix

+ +
    +
  • upgrading Testnet (#814)
  • +
  • sync: prevent opening sessions indefinitely (#813)
  • +
  • execution: fixing mistake on calculating unbonded power (#806)
  • +
  • network: check connection threshold on gater (#803)
  • +
  • network: no transient connection (#799)
  • +
  • not close connection for bootstrap nodes (#792)
  • +
+ +

Refactor

+ +
    +
  • sync: refactoring sync process (#807)
  • +
+ +

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

]]>
Pactus 0.16.0 Released2023-10-29T00:00:00+00:002023-10-29T00:00:00+00:00https://pactus.org/2023/10/29/release-0-16-0Overview + +

Pactus Blockchain Version 0.16.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 allows users to create new addresses for both validators and accounts. +The networking module has been improved, and users can now set limits on the number of connections. +A random crash on the agreement protocol has been fixed in this version.

+ +

New address dialog

+ +

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

+ +
    +
  • gui: display network ID (#780)
  • +
  • create new validator address (CLI and GUI) (#757)
  • +
  • add community bootstrap nodes to testnet config (#764)
  • +
  • network: implementing connection manager (#773)
  • +
  • network: adding bootstrapper mode to the network config (#760)
  • +
+ +

Fix

+ +
    +
  • network: redefine the network limits (#788)
  • +
  • consensus: not increase the vote-box power on duplicated votes (#785)
  • +
  • network: close connection when unable 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)
  • +
  • consensus: strong termination for the binary agreement (#765)
  • +
  • consensus: not increase the voting power on duplicated binary votes (#762)
  • +
+ +

Refactor

+ +
    +
  • network: refactoring peer manager (#787)
  • +
+ +

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 51, +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-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

+ +

In May 2023, we launched Testnet-1. +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

+ +

Major updates

+ +

During Testnet-1, we released three versions(Version +0.11.0, +0.12.0, +0.13.0), and the upgrade process was smooth. +Unfortunately, during Testnet-1, we encountered a consensus failure that may occur at any time in the future. +The consensus failure was resolved by requiring some validators to re-sync their nodes. +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.

+ +

Special 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 PAC coins to set up their validators.

+ +

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.

]]>
\ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 000000000..5b2784dc9 --- /dev/null +++ b/index.html @@ -0,0 +1,603 @@ + + + + + + + + + + + + + Home | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + +
+
+
+
+ Pactus - a real Proof-of-Stake blockchain +
+
+
+
+
Welcome to Pactus
+
Pactus is a community-run blockchain technology with a revolutionary, secure, Solid State Proof of Stake Consensus. Come join us and build a decentralized future together!
+
+ +
+
+
+ +
+
+
+


Get started

+ To start your Pactus journey, you will need to download the latest software. Pactus is designed to be lightweight and user-friendly, offering support for all operating systems and infrastructures with our GUI and CLI applications. + + +
+
+ <br> Get started +
+
+ +
+
+ <br> Get PAC +
+
+


Get PAC

+ Before you can utilize all that Pactus has to offer, you will need to obtain our native coin. PAC is a currency that can be exchanged for products, services and other currencies with a percentage fee based model of 0.01% per tx. + + +
+
+ +
+
+


Become a validator

+ You can become a Pactus validator by staking some coins to your node. As a Pactus validator you will earn rewards, these are given for collecting valid transactions and creating new blocks. The emission is one coin per block. + +
+ Learn +
+
+
+ <br> Become a validator +
+
+ +
+
+ <br> Make Pactus better +
+
+


Make Pactus better

+ There are many ways you can support Pactus and help it grow, from being a valuable community member and sharing with your friends to contributing to our core development. Let's work together to make Pactus even better! + + +
+
+
+ +
+
+
+

Our Partners

+
+
+
+ + Sensifia + +
+
+ + IPMINTER + +
+
+
+
+
+ +
+
+
+

Featured Validators

+
+
+
+ + SGTstake + +
+
+ + NodeSync.Top + +
+
+ + CodeBlockLabs + +
+
+ + CoreNode + +
+
+ + CoreNode + +
+
+ + Validator247 + +
+
+ + VNBnode + +
+
+ + Ionode + +
+
+ + dnsarz + +
+
+ + genznodes + +
+
+ + node39 + +
+
+ + tpes + +
+
+ + oshvank + +
+
+ + testnetnodes + +
+
+ + p10node + +
+
+ + kenz + +
+
+ + blocksync + +
+
+ + adora + +
+
+ + ykpbb + +
+
+ + validator-wiki + +
+
+ + nodeops + +
+
+ + catsmile + +
+
+ + str + +
+
+ + tpes + +
+
+
+
+ + + + + +
+ + +
+ + diff --git a/learn/api/grpc/index.html b/learn/api/grpc/index.html new file mode 100644 index 000000000..ad6988533 --- /dev/null +++ b/learn/api/grpc/index.html @@ -0,0 +1,3658 @@ + + + + + + + + + + + + + gRPC API Reference | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

gRPC API Reference

+ +

Each node in the Pactus network can be configured to use the gRPC protocol for communication. +Here you can find the list of all gRPC methods and messages.

+ +

Table of Contents

+ +
+ +
+ +

Transaction Service transaction.proto

+

Transaction service defines various RPC methods for interacting with transactions.

+

GetTransaction rpc

+
Request message: GetTransactionRequest
+
Response message: GetTransactionResponse
+

GetTransaction retrieves transaction details based on the provided request parameters.

+

CalculateFee rpc

+
Request message: CalculateFeeRequest
+
Response message: CalculateFeeResponse
+

CalculateFee calculates the transaction fee based on the specified amount and payload type.

+

BroadcastTransaction rpc

+ + +

BroadcastTransaction broadcasts a signed transaction to the network.

+

GetRawTransferTransaction rpc

+ +
Response message: GetRawTransactionResponse
+

GetRawTransferTransaction retrieves raw details of a transfer transaction.

+

GetRawBondTransaction rpc

+ +
Response message: GetRawTransactionResponse
+

GetRawBondTransaction retrieves raw details of a bond transaction.

+

GetRawUnBondTransaction rpc

+ +
Response message: GetRawTransactionResponse
+

GetRawUnBondTransaction retrieves raw details of an unbond transaction.

+

GetRawWithdrawTransaction rpc

+ +
Response message: GetRawTransactionResponse
+

GetRawWithdrawTransaction retrieves raw details of a withdraw transaction.

+

Blockchain Service blockchain.proto

+

Blockchain service defines RPC methods for interacting with the blockchain.

+

GetBlock rpc

+
Request message: GetBlockRequest
+
Response message: GetBlockResponse
+

GetBlock retrieves information about a block based on the provided request parameters.

+

GetBlockHash rpc

+
Request message: GetBlockHashRequest
+
Response message: GetBlockHashResponse
+

GetBlockHash retrieves the hash of a block at the specified height.

+

GetBlockHeight rpc

+
Request message: GetBlockHeightRequest
+
Response message: GetBlockHeightResponse
+

GetBlockHeight retrieves the height of a block with the specified hash.

+

GetBlockchainInfo rpc

+
Request message: GetBlockchainInfoRequest
+
Response message: GetBlockchainInfoResponse
+

GetBlockchainInfo retrieves general information about the blockchain.

+

GetConsensusInfo rpc

+
Request message: GetConsensusInfoRequest
+
Response message: GetConsensusInfoResponse
+

GetConsensusInfo retrieves information about the consensus instances.

+

GetAccount rpc

+
Request message: GetAccountRequest
+
Response message: GetAccountResponse
+

GetAccount retrieves information about an account based on the provided address.

+

GetValidator rpc

+
Request message: GetValidatorRequest
+
Response message: GetValidatorResponse
+

GetValidator retrieves information about a validator based on the provided address.

+

GetValidatorByNumber rpc

+ +
Response message: GetValidatorResponse
+

GetValidatorByNumber retrieves information about a validator based on the provided number.

+

GetValidatorAddresses rpc

+ + +

GetValidatorAddresses retrieves a list of all validator addresses.

+

GetPublicKey rpc

+
Request message: GetPublicKeyRequest
+
Response message: GetPublicKeyResponse
+

GetPublicKey retrieves the public key of an account based on the provided address.

+

Network Service network.proto

+

Network service provides RPCs for retrieving information about the network.

+

GetNetworkInfo rpc

+
Request message: GetNetworkInfoRequest
+
Response message: GetNetworkInfoResponse
+

GetNetworkInfo retrieves information about the overall network.

+

GetNodeInfo rpc

+
Request message: GetNodeInfoRequest
+
Response message: GetNodeInfoResponse
+

GetNodeInfo retrieves information about a specific node in the network.

+

Wallet Service wallet.proto

+

Define the Wallet service with various RPC methods for wallet management.

+

CreateWallet rpc

+
Request message: CreateWalletRequest
+
Response message: CreateWalletResponse
+

CreateWallet creates a new wallet with the specified parameters.

+

LoadWallet rpc

+
Request message: LoadWalletRequest
+
Response message: LoadWalletResponse
+

LoadWallet loads an existing wallet with the given name.

+

UnloadWallet rpc

+
Request message: UnloadWalletRequest
+
Response message: UnloadWalletResponse
+

UnloadWallet unloads a currently loaded wallet with the specified name.

+

LockWallet rpc

+
Request message: LockWalletRequest
+
Response message: LockWalletResponse
+

LockWallet locks a currently loaded wallet with the provided password and timeout.

+

UnlockWallet rpc

+
Request message: UnlockWalletRequest
+
Response message: UnlockWalletResponse
+

UnlockWallet unlocks a locked wallet with the provided password and timeout.

+

SignRawTransaction rpc

+
Request message: SignRawTransactionRequest
+
Response message: SignRawTransactionResponse
+

SignRawTransaction signs a raw transaction for a specified wallet.

+

GetValidatorAddress rpc

+ +
Response message: GetValidatorAddressResponse
+

GetValidatorAddress retrieves the validator address associated with a public key.

+

Messages and Enums

+

+BroadcastTransactionRequest +msg +

+

Request message for broadcasting a signed transaction.

+ + + + + + + + + + + + +
FieldTypeDescription
signed_raw_transaction + bytes + Signed raw transaction data.
+

+BroadcastTransactionResponse +msg +

+

Response message containing the ID of the broadcasted transaction.

+ + + + + + + + + + + + +
FieldTypeDescription
id + bytes + Transaction ID.
+

+CalculateFeeRequest +msg +

+

Request message for calculating transaction fee.

+ + + + + + + + + + + + + + + + + +
FieldTypeDescription
amount + int64 + Transaction amount.
payloadType + PayloadType + Type of transaction payload.
+

+CalculateFeeResponse +msg +

+

Response message containing the calculated transaction fee.

+ + + + + + + + + + + + +
FieldTypeDescription
fee + int64 + Calculated transaction fee.
+

+GetRawBondTransactionRequest +msg +

+

Request message for retrieving raw details of a bond transaction.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
lock_time + uint32 + Lock time for the transaction.
sender + string + Sender's address.
receiver + string + Receiver's address.
stake + int64 + Stake amount.
public_key + string + Public key of the validator.
fee + int64 + Transaction fee.
memo + string + Transaction memo.
+

+GetRawTransactionResponse +msg +

+

Response message containing raw transaction data.

+ + + + + + + + + + + + +
FieldTypeDescription
raw_transaction + bytes + Raw transaction data.
+

+GetRawTransferTransactionRequest +msg +

+

Request message for retrieving raw details of a transfer transaction.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
lock_time + uint32 + Lock time for the transaction.
sender + string + Sender's address.
receiver + string + Receiver's address.
amount + int64 + Transaction amount.
fee + int64 + Transaction fee.
memo + string + Transaction memo.
+

+GetRawUnBondTransactionRequest +msg +

+

Request message for retrieving raw details of an unbond transaction.

+ + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
lock_time + uint32 + Lock time for the transaction.
validator_address + string + Address of the validator to unbond from.
memo + string + Transaction memo.
+

+GetRawWithdrawTransactionRequest +msg +

+

Request message for retrieving raw details of a withdraw transaction.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
lock_time + uint32 + Lock time for the transaction.
validator_address + string + Address of the validator to withdraw from.
account_address + string + Address of the account to withdraw to.
fee + int64 + Transaction fee.
amount + int64 + Withdrawal amount.
memo + string + Transaction memo.
+

+GetTransactionRequest +msg +

+

Request message for retrieving transaction details.

+ + + + + + + + + + + + + + + + + +
FieldTypeDescription
id + bytes + Transaction ID.
verbosity + TransactionVerbosity + Verbosity level for transaction details.
+

+GetTransactionResponse +msg +

+

Response message containing details of a transaction.

+ + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
block_height + uint32 + Height of the block containing the transaction.
block_time + uint32 + Time of the block containing the transaction.
transaction + TransactionInfo + Information about the transaction.
+

+PayloadBond +msg +

+

Payload for a bond transaction.

+ + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
sender + string + Sender's address.
receiver + string + Receiver's address.
stake + int64 + Stake amount.
+

+PayloadSortition +msg +

+

Payload for a sortition transaction.

+ + + + + + + + + + + + + + + + + +
FieldTypeDescription
address + string + Address associated with the sortition.
proof + bytes + Proof for the sortition.
+

+PayloadTransfer +msg +

+

Payload for a transfer transaction.

+ + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
sender + string + Sender's address.
receiver + string + Receiver's address.
amount + int64 + Transaction amount.
+

+PayloadUnbond +msg +

+

Payload for an unbond transaction.

+ + + + + + + + + + + + +
FieldTypeDescription
validator + string + Address of the validator to unbond from.
+

+PayloadWithdraw +msg +

+

Payload for a withdraw transaction.

+ + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
from + string + Address to withdraw from.
to + string + Address to withdraw to.
amount + int64 + Withdrawal amount.
+

+TransactionInfo +msg +

+

Information about a transaction.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
id + bytes + Transaction ID.
data + bytes + Transaction data.
version + int32 + Transaction version.
lock_time + uint32 + Lock time for the transaction.
value + int64 + Transaction value.
fee + int64 + Transaction fee.
payloadType + PayloadType + Type of transaction payload.
transfer + PayloadTransfer + Transfer payload.
bond + PayloadBond + Bond payload.
sortition + PayloadSortition + Sortition payload.
unbond + PayloadUnbond + Unbond payload.
withdraw + PayloadWithdraw + Withdraw payload.
memo + string + Transaction memo.
public_key + string + Public key associated with the transaction.
signature + bytes + Transaction signature.
+

+AccountInfo +msg +

+

Message containing information about an account.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
hash + bytes + Hash of the account.
data + bytes + Account data.
number + int32 + Account number.
balance + int64 + Account balance.
address + string + Address of the account.
+

+BlockHeaderInfo +msg +

+

Message containing information about the header of a block.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
version + int32 + Block version.
prev_block_hash + bytes + Hash of the previous block.
state_root + bytes + State root of the block.
sortition_seed + bytes + Sortition seed of the block.
proposer_address + string + Address of the proposer of the block.
+

+CertificateInfo +msg +

+

Message containing information about a certificate.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
hash + bytes + Hash of the certificate.
round + int32 + Round of the certificate.
committersrepeated + int32 + List of committers in the certificate.
absenteesrepeated + int32 + List of absentees in the certificate.
signature + bytes + Certificate signature.
+

+ConsensusInfo +msg +

+

Message containing information about consensus.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
address + string + Address of the consensus instance.
Active + bool + Whether the consensus instance is active.
height + uint32 + Height of the consensus instance.
round + int32 + Round of the consensus instance.
votesrepeated + VoteInfo + List of votes in the consensus instance.
+

+GetAccountRequest +msg +

+

Message to request account information based on an address.

+ + + + + + + + + + + + +
FieldTypeDescription
address + string + Address of the account.
+

+GetAccountResponse +msg +

+

Message containing the response with account information.

+ + + + + + + + + + + + +
FieldTypeDescription
account + AccountInfo + Account information.
+

+GetBlockHashRequest +msg +

+

Message to request block hash based on height.

+ + + + + + + + + + + + +
FieldTypeDescription
height + uint32 + Height of the block.
+

+GetBlockHashResponse +msg +

+

Message containing the response with the block hash.

+ + + + + + + + + + + + +
FieldTypeDescription
hash + bytes + Hash of the block.
+

+GetBlockHeightRequest +msg +

+

Message to request block height based on hash.

+ + + + + + + + + + + + +
FieldTypeDescription
hash + bytes + Hash of the block.
+

+GetBlockHeightResponse +msg +

+

Message containing the response with the block height.

+ + + + + + + + + + + + +
FieldTypeDescription
height + uint32 + Height of the block.
+

+GetBlockRequest +msg +

+

Message to request block information based on height and verbosity.

+ + + + + + + + + + + + + + + + + +
FieldTypeDescription
height + uint32 + Height of the block.
verbosity + BlockVerbosity + Verbosity level for block information.
+

+GetBlockResponse +msg +

+

Message containing the response with block information.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
height + uint32 + Height of the block.
hash + bytes + Hash of the block.
data + bytes + Block data.
block_time + uint32 + Block timestamp.
header + BlockHeaderInfo + Block header information.
prev_cert + CertificateInfo + Certificate information of the previous block.
txsrepeated + TransactionInfo + List of transactions in the block.
+

+GetBlockchainInfoRequest +msg +

+

Message to request general information about the blockchain.

+

Message has no fields.

+

+GetBlockchainInfoResponse +msg +

+

Message containing the response with general blockchain information.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
last_block_height + uint32 + Height of the last block.
last_block_hash + bytes + Hash of the last block.
total_accounts + int32 + Total number of accounts.
total_validators + int32 + Total number of validators.
total_power + int64 + Total power in the blockchain.
committee_power + int64 + Power of the committee.
committee_validatorsrepeated + ValidatorInfo + List of committee validators.
+

+GetConsensusInfoRequest +msg +

+

Message to request consensus information.

+

Message has no fields.

+

+GetConsensusInfoResponse +msg +

+

Message containing the response with consensus information.

+ + + + + + + + + + + + +
FieldTypeDescription
instancesrepeated + ConsensusInfo + List of consensus instances.
+

+GetPublicKeyRequest +msg +

+

Message to request public key based on an address.

+ + + + + + + + + + + + +
FieldTypeDescription
address + string + Address for which public key is requested.
+

+GetPublicKeyResponse +msg +

+

Message containing the response with the public key.

+ + + + + + + + + + + + +
FieldTypeDescription
public_key + string + Public key of the account.
+

+GetValidatorAddressesRequest +msg +

+

Message to request validator addresses.

+

Message has no fields.

+

+GetValidatorAddressesResponse +msg +

+

Message containing the response with a list of validator addresses.

+ + + + + + + + + + + + +
FieldTypeDescription
addressesrepeated + string + List of validator addresses.
+

+GetValidatorByNumberRequest +msg +

+

Message to request validator information based on a validator number.

+ + + + + + + + + + + + +
FieldTypeDescription
number + int32 + Validator number.
+

+GetValidatorRequest +msg +

+

Message to request validator information based on an address.

+ + + + + + + + + + + + +
FieldTypeDescription
address + string + Address of the validator.
+

+GetValidatorResponse +msg +

+

Message containing the response with validator information.

+ + + + + + + + + + + + +
FieldTypeDescription
validator + ValidatorInfo + Validator information.
+

+ValidatorInfo +msg +

+

Message containing information about a validator.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
hash + bytes + Hash of the validator.
data + bytes + Validator data.
public_key + string + Public key of the validator.
number + int32 + Validator number.
stake + int64 + Validator stake.
last_bonding_height + uint32 + Last bonding height.
last_sortition_height + uint32 + Last sortition height.
unbonding_height + uint32 + Unbonding height.
address + string + Address of the validator.
availability_score + double + Availability score of the validator.
+

+VoteInfo +msg +

+

Message containing information about a vote.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
type + VoteType + Type of the vote.
voter + string + Voter's address.
block_hash + bytes + Hash of the block being voted on.
round + int32 + Round of the vote.
cp_round + int32 + Consensus round of the vote.
cp_value + int32 + Consensus value of the vote.
+

+GetNetworkInfoRequest +msg +

+

Request message for retrieving overall network information.

+

Message has no fields.

+

+GetNetworkInfoResponse +msg +

+

Response message containing information about the overall network.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
network_name + string + Name of the network.
total_sent_bytes + uint32 + Total bytes sent across the network.
total_received_bytes + uint32 + Total bytes received across the network.
connected_peers_count + uint32 + Number of connected peers.
connected_peersrepeated + PeerInfo + List of connected peers.
sent_bytesrepeated + GetNetworkInfoResponse.SentBytesEntry + Bytes sent per peer ID.
received_bytesrepeated + GetNetworkInfoResponse.ReceivedBytesEntry + Bytes received per peer ID.
+

+GetNetworkInfoResponse.ReceivedBytesEntry +msg +

+

+ + + + + + + + + + + + + + + + + +
FieldTypeDescription
key + uint32 +
value + uint64 +
+

+GetNetworkInfoResponse.SentBytesEntry +msg +

+

+ + + + + + + + + + + + + + + + + +
FieldTypeDescription
key + uint32 +
value + uint64 +
+

+GetNodeInfoRequest +msg +

+

Request message for retrieving information about a specific node in the network.

+

Message has no fields.

+

+GetNodeInfoResponse +msg +

+

Response message containing information about a specific node in the network.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
moniker + string + Moniker of the node.
agent + string + Agent information of the node.
peer_id + bytes + Peer ID of the node.
started_at + uint64 + Timestamp when the node started.
reachability + string + Reachability status of the node.
servicesrepeated + int32 + List of services provided by the node.
services_namesrepeated + string + Names of services provided by the node.
addrsrepeated + string + List of addresses associated with the node.
protocolsrepeated + string + List of protocols supported by the node.
+

+PeerInfo +msg +

+

Information about a peer in the network.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
status + int32 + Status of the peer.
moniker + string + Moniker of the peer.
agent + string + Agent information of the peer.
peer_id + bytes + Peer ID of the peer.
consensus_keysrepeated + string + Consensus keys used by the peer.
consensus_addressrepeated + string + Consensus address of the peer.
services + uint32 + Services provided by the peer.
last_block_hash + bytes + Hash of the last block the peer knows.
height + uint32 + Height of the peer in the blockchain.
received_messages + int32 + Count of received messages.
invalid_messages + int32 + Count of invalid messages received.
last_sent + int64 + Timestamp of the last sent message.
last_received + int64 + Timestamp of the last received message.
sent_bytesrepeated + PeerInfo.SentBytesEntry + Bytes sent per message type.
received_bytesrepeated + PeerInfo.ReceivedBytesEntry + Bytes received per message type.
address + string + Network address of the peer.
direction + string + Direction of connection with the peer.
protocolsrepeated + string + List of protocols supported by the peer.
total_sessions + int32 + Total sessions with the peer.
completed_sessions + int32 + Completed sessions with the peer.
+

+PeerInfo.ReceivedBytesEntry +msg +

+

+ + + + + + + + + + + + + + + + + +
FieldTypeDescription
key + int32 +
value + int64 +
+

+PeerInfo.SentBytesEntry +msg +

+

+ + + + + + + + + + + + + + + + + +
FieldTypeDescription
key + int32 +
value + int64 +
+

+CreateWalletRequest +msg +

+

Request message for creating a new wallet.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
wallet_name + string + Name of the new wallet.
mnemonic + string + Mnemonic for wallet recovery.
language + string + Language for the mnemonic.
password + string + Password for securing the wallet.
+

+CreateWalletResponse +msg +

+

Response message containing the name of the created wallet.

+ + + + + + + + + + + + +
FieldTypeDescription
wallet_name + string + Name of the created wallet.
+

+GetValidatorAddressRequest +msg +

+

Request message for obtaining the validator address associated with a public key.

+ + + + + + + + + + + + +
FieldTypeDescription
public_key + string + Public key for which the validator address is requested.
+

+GetValidatorAddressResponse +msg +

+

Response message containing the validator address corresponding to a public key.

+ + + + + + + + + + + + +
FieldTypeDescription
address + string + Validator address associated with the public key.
+

+LoadWalletRequest +msg +

+

Request message for loading an existing wallet.

+ + + + + + + + + + + + +
FieldTypeDescription
wallet_name + string + Name of the wallet to load.
+

+LoadWalletResponse +msg +

+

Response message containing the name of the loaded wallet.

+ + + + + + + + + + + + +
FieldTypeDescription
wallet_name + string + Name of the loaded wallet.
+

+LockWalletRequest +msg +

+

Request message for locking a currently loaded wallet.

+ + + + + + + + + + + + +
FieldTypeDescription
wallet_name + string + Name of the wallet to lock.
+

+LockWalletResponse +msg +

+

Response message containing the name of the locked wallet.

+ + + + + + + + + + + + +
FieldTypeDescription
wallet_name + string + Name of the locked wallet.
+

+SignRawTransactionRequest +msg +

+

Request message for signing a raw transaction.

+ + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
wallet_name + string + Name of the wallet used for signing.
raw_transaction + bytes + Raw transaction data to be signed.
password + string + Password for unlocking the wallet for signing.
+

+SignRawTransactionResponse +msg +

+

Response message containing the transaction ID and signed raw transaction.

+ + + + + + + + + + + + + + + + + +
FieldTypeDescription
transaction_id + bytes + ID of the signed transaction.
signed_raw_transaction + bytes + Signed raw transaction data.
+

+UnloadWalletRequest +msg +

+

Request message for unloading a currently loaded wallet.

+ + + + + + + + + + + + +
FieldTypeDescription
wallet_name + string + Name of the wallet to unload.
+

+UnloadWalletResponse +msg +

+

Response message containing the name of the unloaded wallet.

+ + + + + + + + + + + + +
FieldTypeDescription
wallet_name + string + Name of the unloaded wallet.
+

+UnlockWalletRequest +msg +

+

Request message for unlocking a wallet.

+ + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
wallet_name + string + Name of the wallet to unlock.
password + string + Password for unlocking the wallet.
timeout + int32 + Timeout duration for the unlocked state.
+

+UnlockWalletResponse +msg +

+

Response message containing the name of the unlocked wallet.

+ + + + + + + + + + + + +
FieldTypeDescription
wallet_name + string + Name of the unlocked wallet.
+ +

+PayloadType +enum +

+

Enumeration for different types of transaction payloads.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameNumberDescription
UNKNOWN0Unknown payload type.
TRANSFER_PAYLOAD1Transfer payload type.
BOND_PAYLOAD2Bond payload type.
SORTITION_PAYLOAD3Sortition payload type.
UNBOND_PAYLOAD4Unbond payload type.
WITHDRAW_PAYLOAD5Withdraw payload type.
+

+TransactionVerbosity +enum +

+

Enumeration for verbosity level when requesting transaction details.

+ + + + + + + + + + + + + + + + + + + +
NameNumberDescription
TRANSACTION_DATA0Request only transaction data.
TRANSACTION_INFO1Request detailed transaction information.
+

+BlockVerbosity +enum +

+

Enumeration for verbosity level when requesting block information.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameNumberDescription
BLOCK_DATA0Request block data only.
BLOCK_INFO1Request block information only.
BLOCK_TRANSACTIONS2Request block transactions only.
+

+VoteType +enum +

+

Enumeration for types of votes.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameNumberDescription
VOTE_UNKNOWN0Unknown vote type.
VOTE_PREPARE1Prepare vote type.
VOTE_PRECOMMIT2Precommit vote type.
VOTE_CHANGE_PROPOSER3Change proposer vote type.
+ +

Scalar Value Types

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
.proto TypeC++JavaPythonGoC#PHP
doubledoubledoublefloatfloat64doublefloat
floatfloatfloatfloatfloat32floatfloat
int32int32intintint32intinteger
int64int64longint/longint64longinteger/string
uint32uint32intint/longuint32uintinteger
uint64uint64longint/longuint64ulonginteger/string
sint32int32intintint32intinteger
sint64int64longint/longint64longinteger/string
fixed32uint32intintuint32uintinteger
fixed64uint64longint/longuint64ulonginteger/string
sfixed32int32intintint32intinteger
sfixed64int64longint/longint64longinteger/string
boolboolbooleanbooleanboolboolboolean
stringstringStringstr/unicodestringstringstring
bytesstringByteStringstr[]byteByteStringstring
+ +
+
+
+ + + + + diff --git a/learn/blockchain/account/index.html b/learn/blockchain/account/index.html new file mode 100644 index 000000000..f94e63bcb --- /dev/null +++ b/learn/blockchain/account/index.html @@ -0,0 +1,665 @@ + + + + + + + + + + + + + Account | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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 in the Pactus blockchain that holds 21 million coins at the genesis time. +The treasury address is defined as: 000000000000000000000000000000000000000000. +The address type is 0, and therefore, +it doesn’t have any key pair associated with it. +Every time a block is created, one coin from the Treasury account transfers to the proposer account as a block reward.

+ +
+
+
+ + + + + diff --git a/learn/blockchain/address/index.html b/learn/blockchain/address/index.html new file mode 100644 index 000000000..ac9634504 --- /dev/null +++ b/learn/blockchain/address/index.html @@ -0,0 +1,672 @@ + + + + + + + + + + + + + Address | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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..020f0476d --- /dev/null +++ b/learn/blockchain/block/index.html @@ -0,0 +1,788 @@ + + + + + + + + + + + + + Block | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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..cbf2e1011 --- /dev/null +++ b/learn/blockchain/cryptography/index.html @@ -0,0 +1,651 @@ + + + + + + + + + + + + + Cryptography | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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..8210d1ce7 --- /dev/null +++ b/learn/blockchain/genesis/index.html @@ -0,0 +1,673 @@ + + + + + + + + + + + + + Genesis | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Genesis

+ +

The Pactus blockchain starts from scratch, with no pre-existing accounts or pre-allocated coins. +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 51 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 +holds 21 million coins at the genesis time. Each coin is divided into 1 billion units.
  • +
  • Reserved Accounts: Reserved account are defined at the Genesis time and at total they have 21 milion coins. +These coins are reserved and the main purpise is to support the project over time.
  • +
  • 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..65e033423 --- /dev/null +++ b/learn/blockchain/incentive/index.html @@ -0,0 +1,691 @@ + + + + + + + + + + + + + Incentive | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Incentive

+ +
+

The incentive may help encourage nodes to stay honest.

+ +

Satoshi Nakamoto

+
+ +

In Pactus, rewards are given to validators for collecting valid transactions and creating new blocks. +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 42,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..8c2bb2ffc --- /dev/null +++ b/learn/blockchain/serialization/index.html @@ -0,0 +1,776 @@ + + + + + + + + + + + + + Data Serialization | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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..7dc002790 --- /dev/null +++ b/learn/blockchain/state-hash/index.html @@ -0,0 +1,683 @@ + + + + + + + + + + + + + State Hash | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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..8f3ce0d8a --- /dev/null +++ b/learn/blockchain/validator/index.html @@ -0,0 +1,679 @@ + + + + + + + + + + + + + Validator | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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..eee991f3d --- /dev/null +++ b/learn/consensus/committee/index.html @@ -0,0 +1,767 @@ + + + + + + + + + + + + + Committee | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Committee

+ +

The committee is a group of 51 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 51 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 51. +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 51 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%51357\(3.34 \times 10^{-14}\)
15%996714\(1.41 \times 10^{-24}\)
10%21152\(3.39 \times 10^{-09}\)
10%51355\(1.90 \times 10^{-18}\)
10%99679\(2.91 \times 10^{-35}\)
5%21151\(2.81 \times 10^{-13}\)
5%51352\(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..e7d68dcde --- /dev/null +++ b/learn/consensus/parameters/index.html @@ -0,0 +1,665 @@ + + + + + + + + + + + + + Consensus Parameters | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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 51 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..8a0f26119 --- /dev/null +++ b/learn/consensus/proof-of-stake/index.html @@ -0,0 +1,686 @@ + + + + + + + + + + + + + Solid State Proof of Stake | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Solid State 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..343c53c66 --- /dev/null +++ b/learn/consensus/protocol/index.html @@ -0,0 +1,887 @@ + + + + + + + + + + + + + Consensus protocol | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+
+ 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+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..a0b3baa2f --- /dev/null +++ b/learn/consensus/sortition/index.html @@ -0,0 +1,783 @@ + + + + + + + + + + + + + Sortition Algorithm | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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..0c3ed901e --- /dev/null +++ b/learn/consensus/specification/index.html @@ -0,0 +1,663 @@ + + + + + + + + + + + + + Consensus specification | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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..b7ee4b253 --- /dev/null +++ b/learn/index.html @@ -0,0 +1,504 @@ + + + + + + + + + + + + + Learn | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+

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..e838fcf3d --- /dev/null +++ b/learn/smart-contract/storage/index.html @@ -0,0 +1,740 @@ + + + + + + + + + + + + + Storage as file | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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..262b8d0cb --- /dev/null +++ b/learn/transaction/bond/index.html @@ -0,0 +1,671 @@ + + + + + + + + + + + + + Bond Transaction | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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
VariantAmount
+ +
    +
  • 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..a7c39915a --- /dev/null +++ b/learn/transaction/fee/index.html @@ -0,0 +1,673 @@ + + + + + + + + + + + + + Transaction Fee | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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..d776a2410 --- /dev/null +++ b/learn/transaction/format/index.html @@ -0,0 +1,710 @@ + + + + + + + + + + + + + Transaction Format | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Transaction Format

+ +

Transactions in Pactus consists the following fields:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SizeField
1 byteVersion
4 bytesLock Time
VariantFee
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..5f254e5ea --- /dev/null +++ b/learn/transaction/sortition/index.html @@ -0,0 +1,661 @@ + + + + + + + + + + + + + Sortition Transaction | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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..4c20e8d7b --- /dev/null +++ b/learn/transaction/transfer/index.html @@ -0,0 +1,675 @@ + + + + + + + + + + + + + Transfer Transaction | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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
VariantAmount
+ +
    +
  • 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..0faeaa665 --- /dev/null +++ b/learn/transaction/unbond/index.html @@ -0,0 +1,652 @@ + + + + + + + + + + + + + Unbond Transaction | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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..84c63df96 --- /dev/null +++ b/learn/transaction/withdraw/index.html @@ -0,0 +1,661 @@ + + + + + + + + + + + + + Withdraw Transaction | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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
VariantAmount
+ +
    +
  • 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..0c9b8774d --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,272 @@ + + + +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/29/release-0-16-0.html +2023-10-29T00:00:00+00:00 + + +https://pactus.org/2023/11/12/release-0-17-0.html +2023-11-12T00:00:00+00:00 + + +https://pactus.org/2023/12/12/release-0-18-0.html +2023-12-12T00:00:00+00:00 + + +https://pactus.org/2024/01/04/release-0-19-0.html +2024-01-04T00:00:00+00:00 + + +https://pactus.org/2024/01/08/mainnet-announcement.html +2024-01-08T00:00:00+00:00 + + +https://pactus.org/2024/01/10/pactus-records-its-ips-in-ipminter.html +2024-01-10T00:00:00+00:00 + + +https://pactus.org/2024/01/11/release-0-20-0.html +2024-01-11T00:00:00+00:00 + + +https://pactus.org/2024/01/22/testnet-2-concluded.html +2024-01-22T00:00:00+00:00 + + +https://pactus.org/2024/01/24/mainnet-launched.html +2024-01-24T20:24:00+00:00 + + +https://pactus.org/2024/01/31/release-1-0-0.html +2024-01-31T00:00:00+00:00 + + +https://pactus.org/2024/02/10/release-1-0-1.html +2024-02-10T00:00:00+00:00 + + +https://pactus.org/2024/02/18/release-1-0-2.html +2024-02-18T00:00:00+00:00 + + +https://pactus.org/blog/ + + +https://pactus.org/ + + +https://pactus.org/community/ + + +https://pactus.org/contributing/ + + +https://pactus.org/user-guides/run-pactus-docker/ + + +https://pactus.org/user-guides/send-transactions-gui/ + + +https://pactus.org/user-guides/grpc-sign-transactions/ + + +https://pactus.org/user-guides/reduce-network/ + + +https://pactus.org/user-guides/run-pactus-cli/ + + +https://pactus.org/user-guides/run-pactus-metrics/ + + +https://pactus.org/user-guides/run-pactus-gui/ + + +https://pactus.org/user-guides/use-wallet-cli/ + + +https://pactus.org/user-guides/ + + +https://pactus.org/download/ + + +https://pactus.org/term-of-use/ + + +https://pactus.org/about/what-is-pactus/ + + +https://pactus.org/about/roadmap/ + + +https://pactus.org/about/faq/ + + +https://pactus.org/learn/blockchain/block/ + + +https://pactus.org/learn/blockchain/state-hash/ + + +https://pactus.org/learn/blockchain/account/ + + +https://pactus.org/learn/blockchain/genesis/ + + +https://pactus.org/learn/blockchain/validator/ + + +https://pactus.org/learn/blockchain/cryptography/ + + +https://pactus.org/learn/blockchain/address/ + + +https://pactus.org/learn/blockchain/incentive/ + + +https://pactus.org/learn/blockchain/serialization/ + + +https://pactus.org/learn/consensus/specification/ + + +https://pactus.org/learn/consensus/proof-of-stake/ + + +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/smart-contract/storage/ + + +https://pactus.org/learn/transaction/transfer/ + + +https://pactus.org/learn/transaction/fee/ + + +https://pactus.org/learn/transaction/withdraw/ + + +https://pactus.org/learn/transaction/unbond/ + + +https://pactus.org/learn/transaction/bond/ + + +https://pactus.org/learn/transaction/format/ + + +https://pactus.org/learn/transaction/sortition/ + + +https://pactus.org/learn/api/grpc/ + + +https://pactus.org/learn/ + + diff --git a/term-of-use/index.html b/term-of-use/index.html new file mode 100644 index 000000000..76b21526b --- /dev/null +++ b/term-of-use/index.html @@ -0,0 +1,562 @@ + + + + + + + + + + + + + Term of Use | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+

Terms of Use

+ +

Welcome to Pactus.

+ +

By using our website or services, you agree to these Terms of Use (“Terms”). +Please review them carefully. +If you do not accept the Terms, please do not use our website or services.

+ +

We may update the Terms occasionally. +Your continued use of our website or services after any changes means you accept the updates. +If you do not agree to the updates, please stop using our website and services.

+ +

“We,” “us,” “our,” and “Pactus” refer to the Pactus Blockchain Project. “You” refers to each user of our +website or services.

+ +

Website Access and Modifications

+ +

We strive to provide continuous website access but cannot guarantee uninterrupted or error-free service. +Pactus is not liable for any inaccessible features or website unavailability.

+ +

We may modify, expand, limit, or discontinue any part of the website or +services at any time to accommodate users or for other reasons, without notice. +We reserve the right to suspend website access temporarily or permanently, at our discretion, without notice.

+ +

Users may need to update their computer hardware or software to access some website content or features. +Pactus is not responsible for any inability to access the website or services due to user systems, +internet networks, or other causes.

+ +

Age Limit

+ +

Our website and services are not intended for those under 18. +If you are under 18, you may only use this website with the supervision of a parent, guardian, or other responsible adult.

+ +

No Personalized Advice

+ +

This website does not provide individualized legal, tax, financial, or investment advice. +Since everyone’s situation is different, we recommend consulting a qualified professional for financial decisions.

+ +

PAC coin is meant to be used as a medium of exchange. +Nothing on this website should be considered investment advice or a solicitation to +buy, hold, invest in, own, or use PAC coin.

+ +

No Content Guarantees

+ +

We cannot guarantee the accuracy, completeness, or quality of the information on this website. +All content is provided on an “as is” and “as available” basis, and use is at your own risk.

+ +

The content may be sourced from third parties. +Pactus is not responsible for any errors, omissions, or inaccuracies. +The information may not suit everyone and may only apply to certain regions.

+ +

It is your responsibility to evaluate if the information and services are technically and legally suitable for +your intended use and comply with applicable laws. +Always verify any information before using it for personal, financial, or business purposes.

+ +

We may modify website content and services at any time without notice. +We are not obligated to inform you of any changes or corrections.

+ +

External Content

+ +

Any testimonials, opinions, advice, offers, or other third party content on this website reflect the views +and intentions of those parties/people only. +They do not represent the views of Pactus.

+ +

We do not guarantee the accuracy, completeness, reliability, or usefulness of external content. +Users are responsible for assessing external content. +Pactus is not liable for any damage or loss from relying on or using third party content.

+ +

User Generated Content

+ +

By posting or submitting any material to this website, including the forum, you grant Pactus a +worldwide, fully paid-up, non-exclusive license to edit and display your materials on our website and +social media platforms as we deem appropriate.

+ +

You agree to indemnify and hold harmless Pactus and its Users from any third-party claims arising from +your materials. +You also represent that you own or have the right to post the materials, that they are +accurate, their use on the Pactus website complies with laws, and they will not cause harm to any +person.

+ +

Pactus has the right to remove any materials we deem objectionable, offensive, illegal, harmful, or in +violation of these Terms. +We may disclose user information if legally required.

+ +

Please contact info@pactus.org to request the removal of your posted content for reasons such as +privacy concerns, copyright issues, or no longer wanting your content to appear publicly. +We will review removal requests on a case-by-case basis.

+ +

File Safety and Security

+ +

Pactus implements measures to protect downloadable files on our website but cannot guarantee they +are free of infections, viruses, or harmful code.

+ +

We are also not responsible if users’ devices are infected by visiting our website or downloading files in +the event of a security breach.

+ +

If uncertain, users should consider compiling Pactus from the provided source code. +Users are responsible for meeting their own security requirements.

+ + + +

Pactus works with reputable partners, but does not endorse or take responsibility for sponsored content claims. +We do not review, recommend, or endorse any products or services promoted on our site.

+ +

Pactus is not liable for damages from misuse of personal information given to sponsors. +We are also not responsible for losses from using sponsor links or services on our site.

+ + + +

For user convenience, our website may contain links to external sites and resources. +However, we do not control these external sites and are not responsible for +their content, products, services, or information.

+ +

Link inclusion does not imply Pactus endorsement or affiliation. +Users should be aware they may leave our website by clicking links. +External site terms of use may differ from ours.Pactus is not responsible for +losses from users following links to external sites. +We encourage caution and reviewing external sites’ terms and policies before transacting or engaging.

+ +

Electronic Communications

+ +

Our website responses and email communications will be delivered electronically. +Pactus reserves the right to disclose any user emails or objectionable material +to comply with legal processes or protect the +rights and property of Pactus, its customers, suppliers, and users.

+ +

No Financial Services

+ +

This website does not engage in storing, selling, buying, sending, or receiving Pactus coins. +All activities related to owning and transferring Pactus coins occur on the DEX/CEX/decentralized Pactus network. +This website does not actively participate in that network.

+ +

No Liability

+ +

Pactus assumes no liability for any damages, claims, or losses related to using Pactus. +This includes third party actions or inactions and events.

+ +

It includes but is not limited to: security issues when using Pactus software/services, technical problems +when using Pactus software/services, software or data corruption when using Pactus software/services, +or user errors when using Pactus software/services.

+ +

Disclaimer of Warranties

+ +

Pactus expressly disclaims all warranties, representations, and conditions, whether express or implied, +including but not limited to the implied warranties and conditions of merchantability, fitness for a +particular purpose, and non-infringement.

+ +

This disclaimer extends to the use of this website and its services, as well as the accuracy, completeness, +timeliness, or currentness of its content, in any manner and for any purpose.

+ +

No Consequential Damages

+ +

Under no circumstances will Pactus be liable for any incidental, special, consequential, exemplary, +indirect, or other damages arising from use of this website, its services, or content. +This includes but is not limited to data loss, even if advised of such damage possibilities.

+ +

This disclaimer applies whether based on contract, tort, negligence, product liability, strict liability, or otherwise. +It extends to all potential scenarios and circumstances.

+ +

General

+ +

These Terms of Use (TOU) and any applicable Terms of Service are the full agreement for website use by +users and Pactus. They replace previous agreements.

+ +

If Pactus or a user does not exercise a TOU right, this does not waive the right. If a TOU provision is +invalid, the rest remain valid.

+ +

The TOU and Terms of Service are intentionally in English, the governing language for Pactus and users.

+ + + +

Attributed Content

+ +

Logos for operating systems, platforms, and sponsors we support are copyrighted by their respective owners. +Pactus does not own these copyrights but uses the logos with permission or in a clear, non- harmful way.

+ +

Privacy Policy

+ +

Data Collection and Use

+ +

We collect standard server logs from our website. +This data helps provide site statistics, improve content and information flow, analyze errors, and diagnose dead links. +A segment of server logs gathers download statistics to better understand user needs.

+ +
    +
  • Last update: 25 January 2024
  • +
+ +
+
+
+
+ + + + + diff --git a/user-guides/grpc-sign-transactions/index.html b/user-guides/grpc-sign-transactions/index.html new file mode 100644 index 000000000..008911e1a --- /dev/null +++ b/user-guides/grpc-sign-transactions/index.html @@ -0,0 +1,525 @@ + + + + + + + + + + + + + How to sign transaction using gRPC? | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

How to sign transaction using gRPC?

+ +

Preface

+ +

The Pactus Blockchain provides a gRPC interface that allows users to interact with the blockchain and native wallet. +This is ideal for merchants and users who want to create, sign, and broadcast transactions using their local node. +This tutorial will guide you step-by-step on how to use gRPC to sign transactions.

+ +

Setup node

+ +

Initialize the node

+ +

To follow along with this tutorial, you’ll first need to set up and run a localnet blockchain, which is suitable for testing:

+ +
./pactus-daemon init \
+  --localnet \
+  --working-dir ./pactus-localnet \
+  --password "super-secret-password" \
+  --val-num 7 \
+  --restore "fish cool avoid history kitten quick olive purchase blossom grocery cool treat"
+
+ +

This command initializes a Pactus blockchain as a localnet. +The purpose of this network is for testing. +The above command actually restores a node from the given mnemonic. +This helps you to create the same wallet with this tutorial. The first two addresses in this wallet are:

+ +
tpc1zhv2hq30rnu9lkjusgwqk4f5qfdr72sd2mndnn6
+tpc1zsrvuvn0j80vc3we5q44apjrv8j7ta5807z7xc7
+
+ +

We are going to transfer 1 PAC from the first account to the second one.

+ +

Run the node

+ +

Now you can run the node simply with this command:

+ +
./pactus-daemon start \
+  --working-dir ./pactus-localnet \
+  --password "super-secret-password"
+
+ +

By running the node, you will see that it starts creating blocks, and +therefore the reward account address will be rewarded locally. +We can use this balance for testing purposes.

+ +

Interact with the node

+ +

Open another terminal and run the following command:

+ +
./pactus-ctl --server-addr localhost:50052 \
+  blockchain get-blockchain-info
+
+ +

It should print information about the localnet blockchain. +The pactus-ctl application uses gRPC to interact with the blockchain. +In this tutorial, we use pactus-ctl to interact with the blockchain. +You can either use gRPC-gateway REST APIs or make direct gRPC calls to interact with the node. +They are more or less similar and all interact with the node using gRPC endpoints.

+ +

Signing Transitions

+ +

Create raw transaction

+ +

To sign a transaction, we first need to create a raw transaction and then sign it. +We can use the get_raw_transfer_transaction method to create a raw transfer transaction. +Similar methods can be used to create raw bond, unbond, and withdraw transactions.

+ +
./pactus-ctl --server-addr localhost:50052 \
+  transaction get-raw-transfer-transaction \
+    --sender tpc1zhv2hq30rnu9lkjusgwqk4f5qfdr72sd2mndnn6 \
+    --receiver tpc1zsrvuvn0j80vc3we5q44apjrv8j7ta5807z7xc7 \
+    --amount 1
+{
+  "rawTransaction":  "AgGWBQAA6AcAAQK7FXBF458L+0uQQ4FqpoBLR+VBqgKA2cZN8jvZiLs0BWvQyGw8vL7Q7wE="
+}
+
+ +

The sender account is the first reward address in the wallet, therefore it should have some coins in its account.

+ +

Please note that the amount here is in atomic units. +There is a Working-In-Progress PR to accept and return all amounts in PAC units (10^9).

+ +

Sign transaction

+ +

Now you can sign this raw transaction. To sign a transaction, first, we need to load a wallet. +At the time of writing this document, Pactus only supports the “default_wallet”. +Soon, creating wallets through gRPC and loading them will be supported.

+ +
./pactus-ctl --server-addr localhost:50052 \
+  wallet load-wallet --wallet-name "default_wallet"
+{
+  "walletName":  "default_wallet"
+}
+
+ +

Now that the “default_wallet” is loaded, we can proceed to sign the raw transaction:

+ +
./pactus-ctl --server-addr localhost:50052 \
+  wallet sign-raw-transaction \
+    --wallet-name "default_wallet" \
+    --password "super-secret-password" \
+    --raw-transaction "AgGWBQAA6AcAAQK7FXBF458L+0uQQ4FqpoBLR+VBqgKA2cZN8jvZiLs0BWvQyGw8vL7Q7wE="
+{
+  "transactionId": "JZqOnVq87eWBd67LvF1bYIYiXjy/orru/vSmrir9iGA=",
+  "signedRawTransaction": "AAGWBQAA6AcAAQK7FXBF458L+0uQQ4FqpoBLR+VBqgKA2cZN8jvZiLs0BWvQyGw8vL7Q7wG0VVIZZ6CfW7J91B0lcw8Ji7+hgRbB88uT8pWyxf9cTqWGLL3sIbnNA1zQol+GtO6C645tYQYi6FWxtOcgYuurrsTapgSa911ZBuToQxJ8D5hj/BPqBiAtfMFwSWlXXbUKr4CGOCCPsA+IEAY0zVpxFa/bl3VMcZF4mgeAoJLZ3hcjz2leLJG9oVvNdwqvu0U="
+}
+
+ +

Transaction successfully signed.

+ +

Broadcast signed transaction

+ +

Now you can broadcast the signed transaction:

+ +
./pactus-ctl --server-addr localhost:50052 \
+  transaction broadcast-transaction \
+    --signed-raw-transaction "AAGWBQAA6AcAAQK7FXBF458L+0uQQ4FqpoBLR+VBqgKA2cZN8jvZiLs0BWvQyGw8vL7Q7wG0VVIZZ6CfW7J91B0lcw8Ji7+hgRbB88uT8pWyxf9cTqWGLL3sIbnNA1zQol+GtO6C645tYQYi6FWxtOcgYuurrsTapgSa911ZBuToQxJ8D5hj/BPqBiAtfMFwSWlXXbUKr4CGOCCPsA+IEAY0zVpxFa/bl3VMcZF4mgeAoJLZ3hcjz2leLJG9oVvNdwqvu0U="
+{
+  "id": "JZqOnVq87eWBd67LvF1bYIYiXjy/orru/vSmrir9iGA="
+}
+
+ +

Transaction successfully broadcasted.

+ +

Production Security Considerations

+ +

In this tutorial, we utilized a localnet version of Pactus. +For production purposes, you’ll need to set up the node for the Mainnet and synchronize it with the network. +Additionally, in production, the wallet service is disabled by default. +You can enable the wallet service in the configuration file.

+ +

When signing transactions in production, you need to prioritize the security of the wallet. +Make sure you have set a strong password for the native wallet. +Ensure that it is called on localhost for safety. +If you intend to call it on a remote server, there are several security measures to consider:

+ +
    +
  • Ensure SSL is installed using Nginx to secure the connections.
  • +
  • Secure the API using a password (currently under development; see here: PIP-20).
  • +
+ + + + + +
+
+
+
+ + + + + diff --git a/user-guides/index.html b/user-guides/index.html new file mode 100644 index 000000000..b4e95e48e --- /dev/null +++ b/user-guides/index.html @@ -0,0 +1,389 @@ + + + + + + + + + + + + + User Guides | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + diff --git a/user-guides/reduce-network/index.html b/user-guides/reduce-network/index.html new file mode 100644 index 000000000..c8ebb5847 --- /dev/null +++ b/user-guides/reduce-network/index.html @@ -0,0 +1,420 @@ + + + + + + + + + + + + + How to reduce the network usage? | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

How to reduce the network usage?

+ +

Preface

+ +

Pactus is designed for low traffic usage. +However, some users still face bandwidth limitations imposed by their Internet Service Providers (ISPs). +This guide will explore effective ways to reduce networking usage for a Pactus node.

+ +

Reducing the number of connection

+ +

By default, Pactus attempts to maintain 64 open connections with other nodes, +split into 32 inbound and 32 outbound connections. +To reduce networking usage, you can decrease this maximum number of connections. +However, it’s important to remember that more connections with +peers usually enable the node to function more effectively and securely. +The max_connections setting in the config file can be adjusted to manage the maximum number of connections.

+ +

Disabling Relay

+ +

A relay connection is a type of connection that can be established between two peers, +usually behind a NAT, by a third-party peer known as a relay. +This is especially helpful when users run Pactus on a private network like home internet. +However, the relay connection is not as stable as a direct connection. +Disabling the relay connection may reduce network usage. +If you have a reliable and public IP address, you can disable the relay connection. +The relay connection is enabled by default. To disable the relay connection, +set enable_relay to false inside the config file.

+ +

Disabling Node-Network service

+ +

A node-network is a type of node that provides historical data, such as blocks, +to other nodes so they can sync with the network. +By default, this service is enabled. +Disabling this service helps reduce traffic usage. +Keep in mind that new nodes rely on other nodes to be able to sync. +To disable the node-network service, set node_network to false.

+ + + + + +
+
+
+
+ + + + + diff --git a/user-guides/run-pactus-cli/index.html b/user-guides/run-pactus-cli/index.html new file mode 100644 index 000000000..5776ec571 --- /dev/null +++ b/user-guides/run-pactus-cli/index.html @@ -0,0 +1,637 @@ + + + + + + + + + + + + + How to run Pactus in Command Line Mode? | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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, download and extract the Pactus CLI file from +here. +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
+
+ +

This command creates your wallet and setup the working working directory at ~/pactus.

+ + +
+ +
+ +
pactus-daemon.exe init
+
+ +

This command creates your wallet and setup the working working directory at C:\Users\<USER_NAME>\pactus.

+ + +
+ +
+ +
+ Working director +

+ By default the working directory that store the blockchain data is set to ~/pactus in Unix-like systems. + For Windows it is set to C:\Users\<USER_NAME>\pactus. +

+ If you wish to select or specify a different path, use the --working-dir option. +
+ +
+ Wallet seed is important

Keep your wallet seed phrase private and secure. If someone else gains access to your seed phrase, they can control your wallet and funds. + +
+ +

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 Node

+ +

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 --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 --restore "<your-mnemonic>"
+
+ +

Replace <your-mnemonic> with your previously noted mnemonic phrase. +This command will restore your wallet in the C:\Users\<USER_NAME>\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
+
+ + +
+ +
+ +
pactus-daemon.exe start
+
+ + +
+ +
+ +

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.

+ +

Default Ports

+ +

The default network ports in Pactus are defined as follows. It is recommended not to change these default ports:

+ +
    +
  • P2P port is set to 21888. P2P supports both UDP and TCP protocols.
  • +
  • gRPC port is set to 50051. The gRPC module is enabled by default for localhost.
  • +
  • gRPC-gateway is set to 8080. gRPC-gateway is disabled by default.
  • +
  • Nanomsg port is set to 40899. The Nanomsg service is disabled by default.
  • +
+ +
+ +

Running Pactus in the Background

+ +

To run Pactus commands in the background and keep them running even after you close your terminal or +log out, you can use terminal multiplexer software. +Terminal multiplexers allow you to create and manage multiple terminal sessions within a single window.

+ +

Two popular terminal multiplexer options are:

+ +
    +
  1. tmux: Tmux is a terminal multiplexer that
  2. +
  3. lets you create, manage, and detach terminal sessions.
  4. +
  5. +

    You can install tmux on Unix-like systems using your package manager (e.g., apt, brew, yum).

    + +

    Here’s how to use tmux to run Pactus in the background:

    + +
      +
    • Start a new tmux session: tmux
    • +
    • Run your Pactus command within the tmux session.
    • +
    • Detach from the tmux session: Press Ctrl-b, followed by d.
    • +
    • Reattach to the tmux session later to check the progress: tmux attach-session
    • +
    +
  6. +
  7. screen: GNU Screen is another terminal multiplexer that
  8. +
  9. +

    allows you to run terminal sessions in the background.

    + +

    Here’s how to use screen to run Pactus in the background:

    + +
      +
    • Start a new screen session: screen
    • +
    • Run your Pactus command within the screen session.
    • +
    • Detach from the screen session: Press Ctrl-a, followed by d.
    • +
    • Reattach to the screen session later to check the progress: screen -r
    • +
    +
  10. +
+ +

Choose the terminal multiplexer that suits your preference and install it using your system’s package manager. +With these tools, you can run Pactus commands in the background with ease.

+ +
+ +

Become validator

+ +

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..38bdfca21 --- /dev/null +++ b/user-guides/run-pactus-docker/index.html @@ -0,0 +1,626 @@ + + + + + + + + + + + + + How to run Pactus using Docker? | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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

+ +

Before running Pactus with Docker, ensure that you have a clear understanding of +how pactus-daemon and pactus-wallet works. +Then you need to install docker in your system. +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:/root/pactus pactus/pactus pactus-daemon init
+
+ +

This command creates your wallet and setup the working working directory at ~/pactus.

+ + +
+ +
+ +
docker run -it --rm -v %USERPROFILE%\pactus:/root/pactus pactus/pactus pactus-daemon init
+
+ +

This command creates your wallet and setup the working working directory at C:\Users\<USER_NAME>\pactus.

+ + +
+ +
+ +

Here’s an explanation of the Docker flags:

+ +
    +
  • -it: Makes the Docker container interactive for command-line interaction.
  • +
  • --rm: Cleans up the temporary environment automatically when you’re done.
  • +
  • -v <local_dir>:<container_dir>: Allows to choose where to store the Pactus data.
  • +
+ +
+ Wallet seed is important

Keep your wallet seed phrase private and secure. If someone else gains access to your seed phrase, they can control your wallet and funds. + +
+ +
+ +

Running the Node

+ +

Now you can start the node and sync with the network. Run the following command in the Terminal:

+ + +
+ +
+ +
docker run -it -d -v ~/pactus:/root/pactus -p 21888:21888 -p 21888:21888/udp -p 50051:50051 -p 8080:8080 --name pactus pactus/pactus pactus-daemon start --password <WALLET_PASSWORD>
+
+ + +
+ +
+ +
docker run -it -d -v %USERPROFILE%\pactus:/root/pactus -p 21888:21888 -p 21888:21888/udp -p 50051:50051 -p 8080:8080 --name pactus pactus/pactus pactus-daemon start  --password {WALLET_PASSWORD}
+
+ + +
+ +
+ +

This command creates and runs a Docker container named “pactus”. +Here’s an explanation of the Docker flags:

+ +
    +
  • -p <host_port>:<container_port>: Maps a port from your host machine to a port in the Docker container.
  • +
  • -d: Starts the container in detached mode. The container runs in the background.
  • +
  • --name <NAME>: Allows you to assign a custom name to a container.
  • +
+ +

Default Ports

+ +

The default network ports in Pactus are defined as follows. It is recommended not to change these default ports:

+ +
    +
  • P2P port is set to 21888. P2P supports both UDP and TCP protocols.
  • +
  • gRPC port is set to 50051. The gRPC module is enabled by default for localhost.
  • +
  • gRPC-gateway is set to 8080. gRPC-gateway is disabled by default.
  • +
  • Nanomsg port is set to 40899. The Nanomsg service is disabled by default.
  • +
+ +

Essential Commands

+ +

You can manage the Pactus Docker container with these essential commands:

+ +

Stop the container:

+ +
docker stop pactus
+
+ +

This command gracefully stops the “pactus” container.

+ +

Start the container:

+ +
docker start pactus
+
+ +

This command starts the Pactus Docker container.

+ +

View Container Logs:

+ +

To check the logs:

+ +
docker logs pactus --tail 1000 -f
+
+ +

Here’s an explanation of the Docker flags:

+ +
    +
  • --tail 1000: Displays the last 1000 lines of logs.
  • +
  • -f: Shows the log output in real-time.
  • +
+ +

Remove Docker container:

+ +

If you want to upgrade the node, you should first remove the current container:

+ +
docker rm pactus
+
+ +

After removing the Pactus Docker container, you can create and run a new version, as explained above.

+ +

Enabling IPv6

+ +

By default, Docker only supports IPv4. IPv6 is only supported on Linux systems. +Enabling IPv6 can help you improve connectivity and security. +To enable IPv6 for Docker, follow the official documentation here.

+ +
+ +

Managing Wallet Using Docker

+ +

You can use Pactus Docker to manage the wallet. +For example, you can check the balance of your wallet as shown below:

+ + +
+ +
+ +
docker run -it --rm -v ~/pactus:/root/pactus pactus/pactus pactus-wallet address all --balance --stake
+
+
+ + +
+ +
+ +
docker run -it --rm -v %USERPROFILE%\pactus:/root/pactus pactus-wallet address all --balance --stake
+
+ + +
+ +
+ +

You can check How to use wallet in Command Line Mode? +for additional commands to manage your wallet.

+ +
+ +

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..a798f3b7d 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..851e95044 --- /dev/null +++ b/user-guides/run-pactus-gui/index.html @@ -0,0 +1,527 @@ + + + + + + + + + + + + + How to run Pactus in Graphic Mode? | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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

+ +
+ Wallet seed is important

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 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..9b91c97d6 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..1fe39875a 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/run-pactus-metrics/index.html b/user-guides/run-pactus-metrics/index.html new file mode 100644 index 000000000..eabfc7582 --- /dev/null +++ b/user-guides/run-pactus-metrics/index.html @@ -0,0 +1,522 @@ + + + + + + + + + + + + + How to run Pactus Metrics? | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

How to run Pactus Metrics?

+ +

Preface

+ +

Pactus can be run with metrics, providing you with the ability to monitor your node. +This tutorial will guide you through the steps to run Pactus with metrics, suitable for advanced users.

+ +

Prerequisites

+ +

Before proceeding with the steps below, ensure that you have the following:

+ + + +

Configure Pactus Node for Metrics

+ +

To Configure the Pactus Node for Metrics, navigate to the Pactus directory; by default, it’s located at the following path.

+ +
/home/YourUsername/pactus
+
+ +

There’s a file named config.toml that contains all the configurations for your node. +There are two parameters that you should enable for metrics: the first is enable_metrics, +and the second is enable http. After editing the config.toml you should restart your node. +The metrics now can be accessed at http://localhost:80/metrics/prometheus (this url going to be use by prometheus).

+ +
+ +if you are running Pactus with docker image, make sure to expose :80 port. + +
+ +
+ +

Configure Grafana And Prometheus

+ +

You should run Grafana and Prometheus for gathering metrics and displaying them in charts. +First, create a directory named prometheus-grafana. Inside the directory, +create a docker-compose.yml file and paste the code below.

+ +
services:
+  prometheus:
+    image: prom/prometheus
+    container_name: prometheus
+    command:
+      - "--config.file=/etc/prometheus/prometheus.yml"
+    ports:
+      - 9090:9090
+    restart: unless-stopped
+    volumes:
+      - ./prometheus:/etc/prometheus
+      - prom_data:/prometheus
+  grafana:
+    image: grafana/grafana
+    container_name: grafana
+    ports:
+      - 3000:3000
+    restart: unless-stopped
+    environment:
+      - GF_SECURITY_ADMIN_USER=admin
+      - GF_SECURITY_ADMIN_PASSWORD=admin
+    volumes:
+      - ./grafana:/etc/grafana/provisioning/datasources
+volumes: prom_data
+
+ +

You can change the default username and password of Grafana by modifying the values of GF_SECURITY_ADMIN_USER and GF_SECURITY_ADMIN_PASSWORD. +Now, save the file. Then, in the current directory (meaning you are inside the prometheus-grafana directory), +create another directory named grafana. Then, go to the directory. So now you’re in the path /prometheus-grafana/grafana/. +In the current directory, create a file named datasource.yml and paste the code below there.

+ +
apiVersion: 1
+
+datasources:
+  - name: Prometheus
+    type: prometheus
+    url: http://prometheus:9090
+    isDefault: true
+    access: proxy
+    editable: true
+
+ +

Then save the file and exit. +Now, we should go up one directory level from the current directory and navigate to the /prometheus-grafana directory. +In the current directory, which is /prometheus-grafana, create another directory named prometheus, +then go into the directory.In the prometheus directory create a file named prometheus.yml and paste below code there.

+ +
global:
+  scrape_interval: 15s
+  scrape_timeout: 10s
+  evaluation_interval: 15s
+alerting:
+  alertmanagers:
+    - static_configs:
+        - targets: []
+      scheme: http
+      timeout: 10s
+      api_version: v1
+scrape_configs:
+  - job_name: prometheus
+    honor_timestamps: true
+    scrape_interval: 15s
+    scrape_timeout: 10s
+    metrics_path: /metrics/prometheus
+    scheme: http
+    static_configs:
+      - targets:
+          - 127.0.0.1
+
+ +

Then save the file and exit.

+ +
+ +Tip: In the last section of the code, you will see the targets section where I’ve written 127.0.0.1. +You can change it based on your localhost IP or your website domain. +Please be aware that your target should match with your node http port. +The default http port of pactus node is 80. + +
+ +

Run Grafana and Prometheus

+ +

Go to the /prometheus-grafana directory where the docker-compose.yml is located and run the command below.

+ +
docker compose up -d
+
+ +

Congratulations! Grafana and Prometheus are now up and accessible at ports 3000 and 9090 respectively.

+ +

Import Pactus Metrics to Grafana Dashboard

+ +

As Pactus uses libp2p for its peer-to-peer network, we should import libp2p metrics that you can find here. +Download one of the metrics config and then Import it into Grafana Dashboard.

+ +

Congratulations! You did it. Now, you can perform the same operations for other configurations.

+ + + + + +
+
+
+
+ + + + + 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..951b58d33 --- /dev/null +++ b/user-guides/send-transactions-gui/index.html @@ -0,0 +1,431 @@ + + + + + + + + + + + + + How to send transactions in Graphic Mode? | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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

+ +

If a validator does not yet exist, the public key of the validator should be set. +For an existing validator, a public key is not required. +Also, note that if the public key is not set, the system tries to search for it inside the wallet. +Therefore, if you want to stake on your own validators, you don’t need to set the public key here.

+ +

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..7ecc5ba1c --- /dev/null +++ b/user-guides/use-wallet-cli/index.html @@ -0,0 +1,1008 @@ + + + + + + + + + + + + + How to use wallet in Command Line Mode? | Welcome to Pactus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

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. +Once you have downloaded and extracted the Pactus CLI file, you can proceed to the next step.

+ +
+ +

Wallet Commands

+ +

In this section, we will explore various wallet commands that help you create, manage, +and recover your Pactus wallet.

+ +
+ Wallet Path +

+ By default, the node’s wallet is stored at ~/pactus/wallets/default_wallet on Unix-like systems. + On Windows, you can find it at C:\Users\<USER_NAME>\pactus\wallets\default_wallet. +

+ If you wish to select or specify a different wallet, use the --path option. +
+ +

Create a Wallet

+ +

To create a new wallet, run the following command:

+ + +
+ +
+ +
./pactus-wallet --path <PATH-To-NEW-WALLET> create
+
+ + +
+ +
+ +
pactus-wallet.exe --path <PATH-To-NEW-WALLET> create
+
+ + +
+ +
+ +

Replace <PATH-To-NEW-WALLET> with the file path where you want to create the wallet.

+ +

Recover Wallet

+ +

If you lose your wallet or forget your password, you can recover it by running this command:

+ + +
+ +
+ +
./pactus-wallet --path <PATH-To-NEW-WALLET> recover
+
+ + +
+ +
+ +
pactus-wallet.exe --path <PATH-To-NEW-WALLET> recover
+
+ + +
+ +
+ +

Replace <PATH-To-NEW-WALLET> with the file path where you want to restore the wallet.

+ +

Wallet Password

+ +

You can change the wallet password by running this command:

+ + +
+ +
+ +
./pactus-wallet password
+
+ + +
+ +
+ +
pactus-wallet.exe password
+
+ + +
+ +
+ +

This command changes the password for the default_wallet if there is one, or sets a new password.

+ +

Wallet Seed

+ +

You can obtain the wallet seed by running this command:

+ + +
+ +
+ +
./pactus-wallet seed
+
+ + +
+ +
+ +
pactus-wallet.exe seed
+
+ + +
+ +
+ +

The wallet seed is encrypted within your wallet, and +you’ll need to enter the wallet password to access it.

+ +
+ +

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 address new
+
+ + +
+ +
+ +
pactus-wallet.exe 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 address all
+
+ + +
+ +
+ +
pactus-wallet.exe address all
+
+ + +
+ +
+ +

Get Public Key

+ +

To obtain the public key for a specific address, run this command:

+ + +
+ +
+ +
./pactus-wallet address pub <ADDRESS>
+
+ + +
+ +
+ +
pactus-wallet.exe address pub <ADDRESS>
+
+ + +
+ +
+ +

Replace <ADDRESS> with the address for which you want to retrieve its public key.

+ +

Get Private Key

+ +

You can get the private key of your address by this command:

+ + +
+ +
+ +
./pactus-wallet address priv <ADDRESS>
+
+ + +
+ +
+ +
pactus-wallet.exe address priv <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.

+ +

Get Address Balance

+ +

You can get the balance of your address by this command:

+ + +
+ +
+ +
./pactus-wallet address balance <ADDRESS>
+
+ + +
+ +
+ +
pactus-wallet.exe address balance <ADDRESS>
+
+ + +
+ +
+ +

Replace <ADDRESS> with the address for which you want to retrieve your balance.

+ +
+ +

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 tx transfer <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +
pactus-wallet.exe 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 tx bond <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +
pactus-wallet.exe 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 tx bond --pub <PUBLIC_KEY> <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +
pactus-wallet.exe --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 tx unbond <ADDRESS>
+
+ + +
+ +
+ +
pactus-wallet.exe 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 tx unbond <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +
pactus-wallet.exe 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..7ec685c9c --- /dev/null +++ b/zh/2022/08/29/dev-meeting.html @@ -0,0 +1,400 @@ + + + + + + + + + + + + + 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..e13a1c05b --- /dev/null +++ b/zh/2022/09/04/dev-meeting.html @@ -0,0 +1,509 @@ + + + + + + + + + + + + + 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..c160aab78 --- /dev/null +++ b/zh/2022/09/18/dev-meeting.html @@ -0,0 +1,419 @@ + + + + + + + + + + + + + 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..c2b3ef5b9 --- /dev/null +++ b/zh/2022/09/20/release-0-9-0.html @@ -0,0 +1,389 @@ + + + + + + + + + + + + + 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..533631dd8 --- /dev/null +++ b/zh/2022/09/24/testnet-0-launched.html @@ -0,0 +1,385 @@ + + + + + + + + + + + + + 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..df810626b --- /dev/null +++ b/zh/2022/10/30/dev-meeting.html @@ -0,0 +1,412 @@ + + + + + + + + + + + + + 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..8f03db79d --- /dev/null +++ b/zh/2022/11/24/release-0-9-1.html @@ -0,0 +1,404 @@ + + + + + + + + + + + + + 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..849d1269b --- /dev/null +++ b/zh/2023/03/01/what-is-testnet.html @@ -0,0 +1,456 @@ + + + + + + + + + + + + + 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 coins 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 coins 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..a5c632542 --- /dev/null +++ b/zh/2023/04/21/testnet-0-concluded.html @@ -0,0 +1,418 @@ + + + + + + + + + + + + + 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 Testnet-0. +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.

+ +

Special 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 PAC coins to set up their validators.

+ +

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..bfaa9431a --- /dev/null +++ b/zh/2023/05/08/release-0-10-0.html @@ -0,0 +1,432 @@ + + + + + + + + + + + + + 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..1a2a76dd0 --- /dev/null +++ b/zh/2023/05/09/testnet-1-launched.html @@ -0,0 +1,415 @@ + + + + + + + + + + + + + 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..b35e550b0 --- /dev/null +++ b/zh/2023/05/29/release-0-11-0.html @@ -0,0 +1,444 @@ + + + + + + + + + + + + + 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..d456cfc28 --- /dev/null +++ b/zh/2023/06/19/release-0-12-0.html @@ -0,0 +1,442 @@ + + + + + + + + + + + + + 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..ed4b1ec9d --- /dev/null +++ b/zh/2023/07/01/release-0-13-0.html @@ -0,0 +1,433 @@ + + + + + + + + + + + + + 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..6c15059a1 --- /dev/null +++ b/zh/2023/07/05/testnet-500-validators.html @@ -0,0 +1,407 @@ + + + + + + + + + + + + + 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..f139aec9b --- /dev/null +++ b/zh/2023/07/09/dev-meeting.html @@ -0,0 +1,413 @@ + + + + + + + + + + + + + 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..5afbbe67a --- /dev/null +++ b/zh/2023/08/01/testnet-1-concluded.html @@ -0,0 +1,442 @@ + + + + + + + + + + + + + Story of Testnet-1 | 帕图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Story of Testnet-1

+ +

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

+ +

In May 2023, we launched Testnet-1. +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

+ +

Major updates

+ +

During Testnet-1, we released three versions(Version +0.11.0, +0.12.0, +0.13.0), and the upgrade process was smooth. +Unfortunately, during Testnet-1, we encountered a consensus failure that may occur at any time in the future. +The consensus failure was resolved by requiring some validators to re-sync their nodes. +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.

+ +

Special 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 PAC coins to set up their validators.

+ +

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..253815473 --- /dev/null +++ b/zh/2023/08/22/dev-report.html @@ -0,0 +1,407 @@ + + + + + + + + + + + + + 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..5f3c7f696 --- /dev/null +++ b/zh/2023/09/04/introduction-to-pips.html @@ -0,0 +1,415 @@ + + + + + + + + + + + + + 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..f7597bc99 --- /dev/null +++ b/zh/2023/09/24/dev-report-pre-testnet-2.html @@ -0,0 +1,425 @@ + + + + + + + + + + + + + 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..8383ceb26 --- /dev/null +++ b/zh/2023/09/28/how-sspos-works-in-simple-word.html @@ -0,0 +1,459 @@ + + + + + + + + + + + + + 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 51, +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..329474e2d --- /dev/null +++ b/zh/2023/10/15/release-0-15-0.html @@ -0,0 +1,499 @@ + + + + + + + + + + + + + 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..14ebf4ce1 --- /dev/null +++ b/zh/2023/10/15/testnet-2-launched.html @@ -0,0 +1,423 @@ + + + + + + + + + + + + + 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/29/release-0-16-0.html b/zh/2023/10/29/release-0-16-0.html new file mode 100644 index 000000000..d6c7d423f --- /dev/null +++ b/zh/2023/10/29/release-0-16-0.html @@ -0,0 +1,446 @@ + + + + + + + + + + + + + Pactus 0.16.0 Released | 帕图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Pactus 0.16.0 Released

+ +

Overview

+ +

Pactus Blockchain Version 0.16.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 allows users to create new addresses for both validators and accounts. +The networking module has been improved, and users can now set limits on the number of connections. +A random crash on the agreement protocol has been fixed in this version.

+ +

New address dialog

+ +

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

+ +
    +
  • gui: display network ID (#780)
  • +
  • create new validator address (CLI and GUI) (#757)
  • +
  • add community bootstrap nodes to testnet config (#764)
  • +
  • network: implementing connection manager (#773)
  • +
  • network: adding bootstrapper mode to the network config (#760)
  • +
+ +

Fix

+ +
    +
  • network: redefine the network limits (#788)
  • +
  • consensus: not increase the vote-box power on duplicated votes (#785)
  • +
  • network: close connection when unable 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)
  • +
  • consensus: strong termination for the binary agreement (#765)
  • +
  • consensus: not increase the voting power on duplicated binary votes (#762)
  • +
+ +

Refactor

+ +
    +
  • network: refactoring peer manager (#787)
  • +
+ +

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

+ + + + +
+
+
+
+ + + + diff --git a/zh/2023/11/12/release-0-17-0.html b/zh/2023/11/12/release-0-17-0.html new file mode 100644 index 000000000..5cc4692c9 --- /dev/null +++ b/zh/2023/11/12/release-0-17-0.html @@ -0,0 +1,455 @@ + + + + + + + + + + + + + Pactus 0.17.0 Released | 帕图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Pactus 0.17.0 Released

+ +

Overview

+ +

Pactus Blockchain Version 0.17.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 Testnet has been upgraded and all validators must update their nodes.

+ +

This version will address major networking issues, reduce network usage, and improve overall performance.

+ +

A new node type, “Node Gossips”, has been introduced to help broadcast and spread messages across the network. +Node Gossips support the network by delivering messages to non-gossiping nodes. +This gossip option is disabled by default but can be enabled in the configuration file. +If you are running Pactus on a stable and reliable server, we recommend enabling this option for your node. +Please note that this option is still experimental and subject to potential changes in future releases.

+ +

Node gossip in config 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.

+ +

+After updating the node, the configuration file will be overwritten with a new version. +You need to make modifications to the config file if you had customized it prior to the update. +

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • network: default configs for bootstrap and relay peers (#812)
  • +
  • introducing node gossip type (#811)
  • +
  • sync: adding remote address to the peer info (#804)
  • +
  • network: adding public address to factory (#795)
  • +
  • network: filter private ips (#793)
  • +
+ +

Fix

+ +
    +
  • upgrading Testnet (#814)
  • +
  • sync: prevent opening sessions indefinitely (#813)
  • +
  • execution: fixing mistake on calculating unbonded power (#806)
  • +
  • network: check connection threshold on gater (#803)
  • +
  • network: no transient connection (#799)
  • +
  • not close connection for bootstrap nodes (#792)
  • +
+ +

Refactor

+ +
    +
  • sync: refactoring sync process (#807)
  • +
+ +

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

+ + + + +
+
+
+
+ + + + diff --git a/zh/2023/12/12/release-0-18-0.html b/zh/2023/12/12/release-0-18-0.html new file mode 100644 index 000000000..f16ac14c7 --- /dev/null +++ b/zh/2023/12/12/release-0-18-0.html @@ -0,0 +1,456 @@ + + + + + + + + + + + + + Pactus 0.18.0 Released | 帕图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Pactus 0.18.0 Released

+ +

Overview

+ +

Pactus Blockchain Version 0.18.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 has significantly improved the syncing progress. +The syncing process concurrently requests blocks from 8 different peers and +actively connects to the most optimal peers for downloading the blockchain.

+ +

Additionally, users can now import private keys into their wallet and securely encrypt them using their wallet password.

+ +

Breaking change

+ +

For Unix-based systems, please note that the working directory for root users has changed from /pactus to /root/pactus.

+ +

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.

+ +

+After you update the node, the configuration file will automatically get updated, keeping the old settings. +If you want to return the configuration file to its default settings, +just delete the current config file and restart the node. +

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • implement pip-14 (#841)
  • +
  • sort wallet addresses (#836)
  • +
  • grpc: endpoints for creating raw transaction (#838)
  • +
  • network reachability API (#834)
  • +
  • implement pip-13 (#835)
  • +
  • subscribing to libp2p eventbus (#831)
  • +
  • implement helper methods for wallet address path (#830)
  • +
  • logger: adding rotate log file after days, compress and maxgae for logger config (#822)
  • +
  • enable bandwidth router metric (#819)
  • +
+ +

Fix

+ +
    +
  • network: refining the connection limit (#849)
  • +
  • corrected mistake when retrieving the reward address (#848)
  • +
  • config: restore default config when it is deleted (#847)
  • +
  • cmd: changing home directory for root users (#846)
  • +
  • removing BasicCheck for hash (#845)
  • +
  • disabling libp2p ping protocol (#844)
  • +
  • build docker file (#839)
  • +
  • sync: ignore publishing a block if it is received before (#829)
  • +
  • network: subscribing to the Libp2p event bus (#828)
  • +
  • sync: ignore block request if blocks are already inside the cache (#817)
  • +
+ +

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

+ + + + +
+
+
+
+ + + + diff --git a/zh/2024/01/04/release-0-19-0.html b/zh/2024/01/04/release-0-19-0.html new file mode 100644 index 000000000..caf64242f --- /dev/null +++ b/zh/2024/01/04/release-0-19-0.html @@ -0,0 +1,460 @@ + + + + + + + + + + + + + Pactus 0.19.0 Released | 帕图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Pactus 0.19.0 Released

+ +

Overview

+ +

Pactus Blockchain Version 0.19.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 has improved the overall performance of the blockchain by implementing +PIP-15. +PIP-15 suggests to add caching algorithms to the database for the most frequently used items.

+ +

Additionally, this version has enhanced the connectivity of the nodes in the P2P network.

+ +

Availability Score

+ +

This version comes with the implementation of PIP-19. +PIP-19 suggests assigning the “Availability Score” to each validator based on their activities in the +committee. +Validators with a score less than 0.8 won’t receive the block reward, +as their proposals will be rejected by other validators. +The main reason behind this PIP is to prevent users from downgrading +their node specifications and running Pactus on machines with low resources.

+ +

Breaking change

+ +

The Docker container now contains both daemon and wallet binary files. +Users who use Docker to run Pacts now need to add the entry point to run Pactus.

+ +

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

+ +
    +
  • gRPC: defining network and peers info response’s properly (#898)
  • +
  • implementing pip-19 (#899)
  • +
  • network: disabling GosipSub, only FloodSub (#895)
  • +
  • www: adding change proposer round and value to consensus info votes (#892)
  • +
  • network: adding relay service to dial relay nodes (#887)
  • +
  • implementing pip-15 (#843)
  • +
  • check already running by lock file (#871)
  • +
+ +

Fix

+ +
    +
  • store: use cache to check if public key exists (#902)
  • +
  • executor: not rejecting bond transaction for bootstrap validator (#901)
  • +
  • GUI: removing unnecessary tags in transaction confirm dialog (#893)
  • +
  • network: close relay connection for public node (#891)
  • +
  • network: refining GossipSubParams for Gossiper node (#882)
  • +
  • sync: adding sequence number to the bundle (#881)
  • +
  • network: turn off mesh for gossiper node (#880)
  • +
  • consensus: check voteset for CP strong termination (#879)
  • +
  • adding querier to query messages (#878)
  • +
  • execution: fixing issue #869 (#870)
  • +
  • fixing logger issue on rotating log file (#859)
  • +
+ +

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

+ + + + +
+
+
+
+ + + + diff --git a/zh/2024/01/08/mainnet-announcement.html b/zh/2024/01/08/mainnet-announcement.html new file mode 100644 index 000000000..06472d641 --- /dev/null +++ b/zh/2024/01/08/mainnet-announcement.html @@ -0,0 +1,392 @@ + + + + + + + + + + + + + Mainnet announcement | 帕图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Mainnet announcement

+ +

The much-awaited Mainnet Launch of The Pactus Blockchain is finally here! +On January 24, 2024, at 20:24:00 UTC, the first block, known as the Genesis block, +will be minted by four Bootstrap validators. +After that, every 10 seconds, a new block will be added to the blockchain. +Each block contains the committed transactions in the network. +The block finality in the Pactus blockchain is immediate. +It means that there is no need to wait for block confirmation to ensure a transaction is committed.

+ +

Later, more than 2000 community validators will secure the blockchain and make it decentralized. +These validators are Testnet participants who helped test Pactus during our testing period. +The community validators will receive the initial staking coins from a Discord Bot named RoboPac.

+ +

To ensure everything works smoothly on the Mainnet, three different Testnets ( +Testnet0, +Testnet1, and +Testnet2) have been run.

+ +

The Mainnet will never be stopped or interrupted by the core developers of Pactus, +and validators should primarily participate in and maintain the security of the blockchain.

+ + + + +
+
+
+
+ + + + diff --git a/zh/2024/01/10/pactus-records-its-ips-in-ipminter.html b/zh/2024/01/10/pactus-records-its-ips-in-ipminter.html new file mode 100644 index 000000000..fd5a5a552 --- /dev/null +++ b/zh/2024/01/10/pactus-records-its-ips-in-ipminter.html @@ -0,0 +1,397 @@ + + + + + + + + + + + + + Pactus records its IPs in IPMINTER | 帕图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Pactus records its IPs in IPMINTER

+ +

IPMINTER

+ +

In our continuous pursuit of innovation, the recording of our intellectual property is the +cornerstone philosophy of Pactus. Yet, we found traditional patenting methods to be a +slow and expensive hurdle. That is… until we discovered IPMINTER!

+ +

Pactus profile in IPMINTER

+ +

We are ecstatic to announce that the blockchain-based platform by IPMINTER has +revolutionized the way we secure our creations.

+ +

Gone are the days of lengthy processes and hefty fees. With IPMINTER, registering our +intellectual property on the blockchain was a cakewalk – accomplished in a mere 10 minutes! +Plus, the moment we received our exquisite certificate, complete with a QR code directly linking +to our secure blockchain entry, our confidence in this platform soared.

+ +

Our journey with IPMINTER didn’t end there, it became our trusted ally in the ongoing mission +to protect our inventive proposals. The assurance we’ve experienced using their platform has +been unparalleled.

+ +

We’re proud to share our story and to recommend IPMINTER to those on a quest for a straightforward, +economical, and robust IP recording solution. They have our heartfelt endorsement!

+ +

Join us in embracing the future of IP management with IPMINTER. Record what’s yours, the smart way!

+ + + + +
+
+
+
+ + + + diff --git a/zh/2024/01/11/release-0-20-0.html b/zh/2024/01/11/release-0-20-0.html new file mode 100644 index 000000000..80831615e --- /dev/null +++ b/zh/2024/01/11/release-0-20-0.html @@ -0,0 +1,457 @@ + + + + + + + + + + + + + Pactus 0.20.0 Released | 帕图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Pactus 0.20.0 Released

+ +

Overview

+ +

Pactus Blockchain Version 0.20.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

+ +

Validator Stake Management

+ +

The new GUI application enables users to easily Unbond and Withdraw their validator’s stake.

+ +

Withdraw dialog

+ +

Improving Network Connectivity

+ +

Some users have reported that UDP packets are being dropped by their Internet Service Providers. +Therefore, the UDP protocol is disabled by default. +Users can still activate the UDP protocol by configuring the settings in the file if necessary.

+ +

Also, the experimental Node Gossip feature has been removed in this version. +Node gossip could cause some validators to become isolated from the rest of the network.

+ +

Relay service

+ +

This version enables users to turn their node into a relay service. +A relay service node can help users behind NAT to communicate with each other. +It is disabled by default and can be enabled inside the config file. +Please note that it is still in an experimental state.

+ +

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

+ +
    +
  • implement relay service (#931)
  • +
  • HTTP: Integrate AddRowDouble and update tests (#926)
  • +
  • network: making listen address private in config (#921)
  • +
  • http: adding AvailabilityScore to http module (#917)
  • +
  • network: adding ‘enable_udp’ config (#918)
  • +
  • network: removing gossip node service (#916)
  • +
  • gRPC: adding AvailabilityScore to gRPC (#910)
  • +
  • GUI: unbond and withdraw transaction dialogs (#908)
  • +
+ +

Fix

+ +
    +
  • gRPC: adding missing get raw transaction APIs to gRPC gateway (#925)
  • +
  • network: preventing self dial (#924)
  • +
  • fixing time lag on starting node (#923)
  • +
  • network: fixing network deadlock on linux arm64 (#922)
  • +
  • GUI: updating unbond and withdraw dialogs (#911)
  • +
  • fixing gRPC node info issue (#906)
  • +
+ +

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

+ + + + +
+
+
+
+ + + + diff --git a/zh/2024/01/22/testnet-2-concluded.html b/zh/2024/01/22/testnet-2-concluded.html new file mode 100644 index 000000000..12d7b6a46 --- /dev/null +++ b/zh/2024/01/22/testnet-2-concluded.html @@ -0,0 +1,440 @@ + + + + + + + + + + + + + Story of Testnet-2 | 帕图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Story of Testnet-2

+ +

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

+ +

In October 2023, we launched Testnet-2. +The main purpose of this Testnet was to closely monitor the new consensus mechanism and the stability of the P2P network.

+ +

The committee for Testnet-2 was set to 51 validators, +and 2084 validators joined during the Testnet period. +More than 1500 computers and servers joined the network, and we experienced a high volume of data transmission in the network. +More than 800,000 blocks were created, and about 2 million transactions were processed during this time. +The size of the blockchain is about 450 megabytes.

+ +

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

+ +

Stability of Consensus

+ +

In Testnet-1, we had one consensus failure that caused us to +conclude the Testnet-1. +During Testnet-2, there were no issues with the consensus mechanism, and +we had no case of failure during the testing period, +although the number of validators and nodes significantly increased on Testnet-2 compared to its predecessor. +It proved that the consensus mechanism is in a stable situation.

+ +

Networking issues

+ +

In Testnet-2, the blockchain stopped twice, and each time it took more than 24 hours to fix the problem. +In the second blockage, we had no choice but to ask active validators inside the committee to +update their nodes to overcome the networking issue. +The development team faced a difficult situation and had to make the proper decision to fix the networking issues. +On one hand, the networking traffic increased significantly, and on the other hand, we had to +make sure normal users with limited internet bandwidth could still participate in the consensus mechanism without any problems. +After examining different scenarios, the networking issues were resolved, and +no major problems were reported till the end of Testnet.

+ +

Major updates

+ +

During Testnet-2, we introduced several updates, including versions +0.15.0, +0.16.0, +0.17.0, +0.18.0, +0.19.0, and +0.20.0. +The update process went smoothly, and with the stability of Version 0.20.0 confirmed, +the development team shifted its focus to the Mainnet launch.

+ +

Special 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 PAC coins to set up their validators.

+ +

We are grateful to all those who participated in Testnets, and we encourage them to join the Mainnet. +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/2024/01/24/mainnet-launched.html b/zh/2024/01/24/mainnet-launched.html new file mode 100644 index 000000000..393f8b4d2 --- /dev/null +++ b/zh/2024/01/24/mainnet-launched.html @@ -0,0 +1,430 @@ + + + + + + + + + + + + + Mainnet launched 🚀 | 帕图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Mainnet launched 🚀

+ +

Years to Launch

+ +

Pactus Mainnet started creating the first block on 24 January 2024 at 20:24:10 UTC time. +Pactus Mainnet is the result of years of hard work, research, and innovation. +It started from one idea:

+ +

A low-cost, truly decentralized blockchain, built by the people for the people, +where anyone could run and be their own validator.

+ +

We faced many challenges and obstacles along the way, but we never gave up.
+We overcame them with our determination and perseverance.
+We learned from our mistakes and improved our solutions.
+We grew from a small team to a large community.
+We achieved many milestones and breakthroughs. And we did it.
+We created Pactus, the platform that empowers you.

+ +

Thanks to Community

+ +

We want to thank Pactus community for helping us on the Testnet.

+ +

You have been instrumental in testing and improving the Testnet.
+You have given us your honest feedback and constructive suggestions.
+You have reported and help fixed bugs and errors.
+You have challenged and pushed us to do better.
+You have been our partners and friends in this journey.

+ +

On the Road

+ +

The true journey has just started.
+The Mainnet is not the end, but the beginning.
+The beginning of a new era of blockchain innovation.
+The beginning of a new challenge and opportunity.
+The beginning of a new revolution and evolution!

+ +

We welcome you more than ever.
+We need you to join us in this exciting adventure.
+We need you to support us in this ambitious endeavor.
+We need you to be part of Pactus, the platform that empowers you!

+ +

We Have a Dream

+ +

We have a dream.
+A dream of a world where blockchain technology is not a privilege, but a right for everyone.
+A dream of a world where smart contracts and decentralized applications are fast, secure, and scalable.
+A dream of a world where Pactus is the platform that empowers you.

+ +

This dream is not just ours. It is yours too.
+You share our vision and passion for blockchain innovation.
+You believe in our potential and impact.
+You support our goals and values.
+You are part of our dream.

+ +

And this dream is not just a fantasy. It is a reality.
+A reality that we have created together.
+A reality that we have launched today. A reality that we can explore and enjoy together.
+A reality that we can shape and improve together.
+A reality that we can make better and brighter together!

+ + + + +
+
+
+
+ + + + diff --git a/zh/2024/01/31/release-1-0-0.html b/zh/2024/01/31/release-1-0-0.html new file mode 100644 index 000000000..2c602c230 --- /dev/null +++ b/zh/2024/01/31/release-1-0-0.html @@ -0,0 +1,445 @@ + + + + + + + + + + + + + Pactus 1.0.0 (Beijing) Released | 帕图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Pactus 1.0.0 (Beijing) Released

+ +

Overview

+ +

Pactus Blockchain Version 1.0.0 (Beijing) +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.

+ +

Pactus Version 1.0.0 (Beijing)

+ +

Highlights

+ +

Mainnet Official Release v1.0.0 (Beijing)

+ +

The much-anticipated official software release of Pactus v1.0.0 (Beijing) marks a significant milestone +for our community. +This impressive mainnet release represents the culmination of extensive development efforts. +Pactus v1.0.0 (Beijing) offers a pioneering solution for streamlining the validation of Pactus blockchain, +enhancing security, and providing a user-friendly experience. We’re excited to unveil the official software +and welcome users to experience the power of Pactus in revolutionizing the future of blockchain. Join us on +this exciting journey.

+ +

Onboarding validators

+ +

On February 1st, a total of 53,494 PAC coins will be distributed among 1,311 validators who participated in +Testnet-0, +Testnet-1, and +Testnet-2. +This marks the beginning of a new chapter in the decentralized world.

+ +

Download

+ +

This version has been implemented for Mainnet +To start using Pactus Mainnet, download the latest version from the download +page and join the Mainnet.

+ +

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

+ + + +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • implement get validator address for grpc (#975)
  • +
  • add bootstrap.json and load in config on build (#964)
  • +
  • add mainnet config and genesis files (#951)
  • +
  • add Consensus-address to network info (#952)
  • +
  • grpc: sign transaction using wallet client (#945)
  • +
  • pactus gui lock support (#947)
  • +
  • consensus: turning consensus to a zero-config module (#942)
  • +
+ +

Fix

+ +
    +
  • localnet wallet issue (#970)
  • +
  • sync: remove ReachabilityStatus from agent info (#956)
  • +
  • daemon: keeping previous behavior for password flag, linting CLI messages (#950)
  • +
  • consensus: detect if the system time is behind the network (#939)
  • +
+ +

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

+ + + + +
+
+
+
+ + + + diff --git a/zh/2024/02/10/release-1-0-1.html b/zh/2024/02/10/release-1-0-1.html new file mode 100644 index 000000000..54529da02 --- /dev/null +++ b/zh/2024/02/10/release-1-0-1.html @@ -0,0 +1,425 @@ + + + + + + + + + + + + + Pactus 1.0.1 (Beijing) Released | 帕图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Pactus 1.0.1 (Beijing) Released

+ +

Overview

+ +

Pactus Blockchain Version 1.0.1 (Beijing) +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.

+ +

This release is named after the city of Beijing and it +was unanimously selected by Pactus community.

+ +

Pactus Version 1.0.1 (Beijing)

+ +

Highlights

+ +

This update fixes several issues identified after the release of +1.0.0 (Beijing). +Specifically, it fixes the missed log file on the Windows GUI application and improves the node connectivity.

+ +

Download

+ +

To start using Pactus blockchain, download the latest version from the download +page and join the Mainnet.

+ +

How to Upgrade

+ +

If you are running an older version, close it first. +Then uninstall the previous version and install the newer version. +If you are using the archived version, simply replace it with the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • gui: add connections and moniker fields to main windows (#1090)
  • +
+ +

Fix

+ +
    +
  • network: set dial and accept limit in connection gater (#1089)
  • +
  • gui stderr logger in windows os (#1081)
  • +
  • sync: improve syncing process (#1087)
  • +
  • network: redefine resource limits (#1086)
  • +
+ +

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

+ + + + +
+
+
+
+ + + + diff --git a/zh/2024/02/18/release-1-0-2.html b/zh/2024/02/18/release-1-0-2.html new file mode 100644 index 000000000..eacb0374a --- /dev/null +++ b/zh/2024/02/18/release-1-0-2.html @@ -0,0 +1,416 @@ + + + + + + + + + + + + + Pactus 1.0.2 (Istanbul) Released | 帕图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Pactus 1.0.2 (Istanbul) Released

+ +

Overview

+ +

Pactus Blockchain Version 1.0.2 (Istanbul) +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.

+ +

This release is named after the city of Istanbul and it +was unanimously selected by Pactus community.

+ +

Pactus Version 1.0.2 (Istanbul)

+ +

Highlights

+ +

This update fixes a major issue that decreases the number of inbound connections of the nodes over time. +We highly recommend all users to upgrade to the new version for better connectivity.

+ +

Download

+ +

To start using Pactus blockchain, download the latest version from the download +page and join the Mainnet.

+ +

How to Upgrade

+ +

If you are running an older version, close it first. +Then uninstall the previous version and install the newer version. +If you are using the archived version, simply replace it with the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Fix

+ +
    +
  • sync: fix concurrent map read-write crash (#1112)
  • +
  • network: remove disconnected peers from peerMgr (#1110)
  • +
+ +

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..f55f29460 --- /dev/null +++ b/zh/404.html @@ -0,0 +1,218 @@ + + + + + + + + + + + + + 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..921adcf2d --- /dev/null +++ b/zh/about/faq/index.html @@ -0,0 +1,1525 @@ + + + + + + + + + + + + + 常见问题解答 | 帕图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+
+

常见问题解答

+

该常见问题解答页面旨在提供有关Pactus的常见问题和关注点的有用信息和指导。 +

+
+ +
+ + + + + + + + + +
+
+
+ + 交易问题 +
+
+ +
+ + + +
+
***
+ +
+ +
+
+
+ + 常规问题 +
+
+ + +

+ Pactus是什么意思? +

+
+ + + + + + + Pactus一词源自拉丁语,意为共同协议、契约或交易。 在英语中,Pact一词源自拉丁词汇Pactus。 + + + +
+ + +

+ Pactus是其他任何区块链的副本吗? +

+
+ + + + + + + 不,Pactus不是任何其他区块链的副本或衍生品。它是一种全新而独特的区块链协议,从头开始设计。Pactus使用的共识机制是独特的,专门为解决权益证明区块链中验证者的可扩展性问题而创建。 + + + +
+ + +

+ Did Pactus have an 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试图解决其他区块链网络面临的几个问题,包括可扩展性、可访问性、分配公平性和存储成本。

可扩展性: Pactus拥有一个独特的共识机制,专门设计用于解决可扩展性问题, 同时不牺牲安全性和去中心化。

可访问性: 在Pactus上运行验证者设计更容易普通用户使用,与其他区块链相比更易上手。

分配公平性: Pactus有一个公平透明的币分配模型,旨在防止财富的集中。

存储成本: Pactus通过允许用户分配专用存储文件提供了一种新颖的存储解决方案, 从而降低存储成本并简化智能合约。 + + + +
+ + +

+ Pactus与比特币有何不同? +

+
+ + + + + + + Pactus和比特币是两种不同类型的区块链网络。 + 比特币使用称为工作量证明的过程来保护其网络,而Pactus使用一种称为股权证明的不同方法。 +这意味着,验证者负责对进入的区块进行投票,必须持有网络的一定数量的代币,即押金,以防止恶意行为。 + + + +
+ + +

+ Pactus与以太坊有何不同? +

+
+ + + + + + + + + Pactus和以太坊都是股权证明的区块链,但它们在运行验证者方面存在差异。 在以太坊上运行验证者可能具有挑战性,需要至少抵押32个以太币。 相比之下,Pactus的设计更加普及化。 没有最低押注要求,您可以在任何操作系统上使用基本硬件运行Pactus节点。 这种方法反映了我们推广去中心化和让更多人使用区块链技术的承诺。 + + + +
+ +
+ +
+
+
+ + 验证节点问题 +
+
+ + +

+ 什么是验证节点? +

+
+ + + + + + + 在Pactus上,验证者负责处理交易和创建区块,通过这样的方式帮助保护网络并使其去中心化。 他们使用自己的代币作为押金以确保网络的安全,并获得其贡献的奖励。 + + + + + +
+ + +

+ Pactus有多少个验证者? +

+
+ + + + + + + + + Pactus是一个真正的权益证明区块链,这意味着网络中的验证者数量没有限制。但是,由21个验证者组成的委员会负责创建区块。需要注意的是,委员会成员不固定,随时间变化。 + + + + + +
+ + +

+ 我可以质押的最小和最大金额是多少? +

+
+ + + + + + + + + 在Pactus中,没有质押币的最低限制,但您可以质押的最大金额为1000个币。如果您想质押超过1000个币,可以运行新的验证者。运行多个验证者可以保持网络更加去中心化,并有助于维护其安全性和稳定性。 + + + +
+ + +

+ What are the minimum hardware requirements? +

+
+ + + + + + + After thorough testing on multiple machines, we can conclude that the reccomended minimum hardware
requirements are as follows:

VPS:
* CPU's: 1/2 physical core / 1vCPU
* RAM: 1 GB Ram
* Storage (SSD): 20 GB NVMe Drive
* Network: stable internet connection with 1 TBps speed

PC:
* CPU's: 2 physical cores / 4vCPU
* RAM: 4 GB Ram
* Storage (SSD): 64 GB SSD Drive
* Network: stable internet connection with over 15 MBps speed

**Note** These specifications have been tested and provide an availabilty score of over 0.9. + + + + + +
+ + +

+ 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. + + + + + +
+ + +

+ 验证者如何获得奖励? +

+
+ + + + + + + + + 一旦验证者提出一个有效的区块,并被网络接受,验证者就会收到一个代币作为区块奖励。 奖励是给予验证者的激励,以表彰他们对网络安全和完整性的贡献,帮助网络平稳运行。 + + + + + +
+ + +

+ Pactus中的区块奖励是多少? +

+
+ + + + + + + Pactus的区块奖励是固定的,每个区块始终为1枚币。这种平坦奖励方案有助于确保简单性、公平性和更好的币分配。 + + + Pactus中的区块奖励是多少? + + + + +
+ + +

+ How many PAC coins are generated per day? +

+
+ + + + + + + Daily, a total amount of 8640 PAC is generated. This figure translates to 241,000 every 28 days and 3,153,600 per year. + + + +
+ +
+ +
+
+
+ + 共识问题 +
+
+ + +

+ Pactus区块链是如何工作的? +

+
+ + + + + + + + + Pactus使用一个验证者委员会来创建新的区块。 委员会由21个验证者组成,但委员会成员随时间随机变化。 每10秒,委员会中的验证者(称为提案者)收集所有有效交易,将它们添加到一个区块中, 并与委员会中的其他验证者分享。 如果委员会中的超过2/3的利益相关者签署并认可提议的区块, 区块就会被提交,区块中的所有交易将得到执行。 这个过程每10秒重复一次。 + + + Pactus区块链是如何工作的? + + + + +
+ + +

+ 验证者如何进入委员会? +

+
+ + + + + + + + + 在Pactus中,为了进入委员会,验证者需要参与每个区块的彩票或抽签过程。 在这个过程中,验证者生成一个可证明的随机数,介于0和总质押币之间, 如果这个数字小于他们的质押量,则可以发送一个称为抽签交易的交易,并提供抽签证明。 一旦抽签交易被包含在一个区块中,验证者将取代最老的委员会成员。 + + + + + +
+ + +

+ 委员会内如何选择区块提议者? +

+
+ + + + + + + 在委员会内部,区块提议者是根据他们进入委员会的时间进行选择的。 这意味着选择过程遵循先来先提出的顺序。 + + + + + +
+ + +

+ 是否可以让多个验证者同时进入委员会? +

+
+ + + + + + + + + Pactus中的抽签过程是随机的,因此有可能出现多个验证者同时进入委员会,或者根本没有验证者进入。 然而,为了使抽签交易被视为有效并被包含在一个区块中,必须满足两个条件: 它不能改变超过委员会总质押的1/3,不能移除尚未有机会提议区块的验证者。 + + + +
+ + +

+ Pactus区块链是否可能同时出现两个有效区块? +

+
+ + + + + + + 在Pactus区块链中,不可能同时出现两个有效区块。 Pactus的共识算法防止了同时出现两个区块提议者的可能性。 这确保了网络中不会出现分叉。 + + + + + +
+ + +

+ How much is the block confirmation in the Pactus Blockchain? +

+
+ + + + + + + Block confirmation refers to the number of blocks that need to be created before a transaction is considered final and irreversible. In Pactus, block confirmation is immediate, meaning that once a transaction is added to a block, it is considered confirmed and cannot be reversed. + + + + + +
+ +
+ +
+
+
+ + Economy +
+
+ + +

+ Pactus币的总供应量是多少? +

+
+ + + + + + + + + Pactus的总供应量为2100万枚币,每枚币被分为10亿个单位。每10秒钟会生成一枚新的币,每天会产生8640枚币,每年约300万枚币。所有币将在7年内产生。 + + + +
+ + +

+ How are Genesis Coins allocated in Pactus? +

+
+ + + + + + + The initial allocation of Genesis Coins in the Pactus blockchain is distributed as follows:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Genesis Coin Allocation for Pactus
CategoryCoin AllocationPercentage
Treasury21 Million coins50%
Foundation8.4 Million coins20%
VC Allocation6.3 Million coins15%
Team and Operations4.2 Million coins10%
Community2.1 Million coins5%
+ + + How are Genesis Coins allocated in Pactus? + + +
+ + +

+ 什么是国库账户? +

+
+ + + + + + + 国库账户是Pactus区块链中的一个特殊账户,持有总供应量2100万个币。它在创世时创建,没有与之关联的密钥对,这意味着任何人都无法访问或控制它。每当创建一个区块时,从国库账户中转移一枚币到提案者账户作为区块奖励。 + + + + + +
+ + +

+ How are Treasury coins distributed? +

+
+ + + + + + + Treasury coins are distributed as block rewards to the block proposers. Every 10 seconds, one coin from the Treasury account transfers to the block proposer account. This process is called "coin minting". As a result, the total number of Pactus coins in circulation gradually increases over time as new blocks are added to the blockchain. Every day, 8,640 coins are minted, resulting in approximately 3 million coins being minted annually by the Treasury account. + + + How are Treasury coins distributed? + + + + +
+ + +

+ How will the Support coins be spent? +

+
+ + + + + + + The support accounts are designed to provide financial backing for the project. Initially, Pactus Genesis contained only the Treasury accounts without any Backup or Support accounts. The introduction of support coins was a strategic response to the absence of investors, despite the significant progress of the project.

These coins are allocated in several ways:
    +
  • Community: + This portion will mainly support the community. + As part of this, the participants on Testnets receive initial staking coins to + setup their validator and secure the Mainnet. +
  • +
  • Team and Operations: + Another portion supports the project team. + Team members receive a monthly distribution of these coins, which is estimated to sustain the team for over six years. +
  • +
  • Venture Capital (VC) Allocation: + Another portion is set aside for any potential venture capitalists who + might show interest in investing in the project in the future. +
  • +
  • Foundation: + The foundation coins are reserved for future use, potentially in supporting strong projects that align with Pactus's objectives. +
  • +
+Transparency is a key aspect of this allocation, as all movements of these coins are trackable due to the fully transparent nature of the blockchain. + + + +
+ +
+ +
+
+
+ + 交易问题 +
+
+ + +

+ 什么是转账交易? +

+
+ + + + + + + 转账交易是一种允许用户将Pactus币从一个账户转移到另一个账户的交易类型。 + + + + + +
+ + +

+ 什么是绑定交易? +

+
+ + + + + + + + + 绑定交易是一种交易类型,允许您通过抵押一些币来成为验证者。 当您发送绑定交易时,您的节点将成为验证者。 抵押的数量确定您在共识中的权力。 + + + + + +
+ + +

+ 什么是随机交易? +

+
+ + + + + + + 随机交易是一种交易类型,允许验证者进入委员会。 + + + + + +
+ + +

+ 什么是解除绑定交易? +

+
+ + + + + + + + + 解除绑定交易是一种交易类型,允许您解除您的验证者身份。 当您发送解除绑定交易时,您将不能再发送随机或绑定交易。 + + + + + +
+ + +

+ 什么是提现交易? +

+
+ + + + + + + 提现交易是一种交易类型,允许验证者从网络中提取他们抵押的币。 + + + + + +
+ +
+ +
+
+
+ + 手续费问题 +
+
+ + +

+ Pactus的交易费是如何计算的? +

+
+ + + + + + + Pactus的交易费是使用基于百分比的费用模型来计算的。 这意味着费用是转账金额的百分比,有最低和最高费用。 百分比、最低费用和最高费用参数是区块链参数的一部分, 可以通过所有验证者的共识机制进行更改。 + + + + + +
+ + +

+ 最低和最高费用是多少? +

+
+ + + + + + + 这些参数旨在提供更大的控制力来管理费用结构, 并确保费用保持在一定范围内。 如果交易的计算费用低于最低费用,则使用最低费用。 同样,如果计算的费用超过了最高费用,则使用最高费用。 这有助于防止用户为交易支付过高或过低的费用, 并在费用结构上提供更大的可预测性和公平性。 + + + + + +
+ + +

+ 为什么选择基于百分比的费用模型? +

+
+ + + + + + + 选择基于百分比的费用模型是因为它为用户提供了更加公平和可预测的费用结构, 因为费用与转移金额成比例。 它还允许更大的灵活性来调整费用结构, 以更好地满足区块链及其用户的需求, 因为百分比、最低费用和最高费用参数可以通过所有验证者同意的共识机制进行更改。 + + + +
+ +
+ +
+ + + + +
+ +
+
+
+
+ + + + + diff --git a/zh/about/roadmap/index.html b/zh/about/roadmap/index.html new file mode 100644 index 000000000..b27256ef9 --- /dev/null +++ b/zh/about/roadmap/index.html @@ -0,0 +1,714 @@ + + + + + + + + + + + + + 路线图 | 帕图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+

路线图

+ +
+
✅ 已完成任务
+
🚧 正在进行的任务
+
⏳ 即将进行的任务
+
+ +
+
+
+ + +
+
+
+
+ + Decentralized Storage Platform + +
+
Q1 2025
+
+
+
+ +
+
+
+
+ + Browser Extension Wallet + +
+
Q4 2024
+
+
+
+ +
+
+
+
+ + Desktop and Mobile Friendly GUI + +
+
July 2024
+
+
+
+ +
+
+
+
+ + CLI tools for controlling Pactus node + +
+
Jun 2024
+
+
+
+ +
+
+
+
+ + First Interactive Block Explorer + +
+
March 2024
+
+
+
+ +
+
+
+
+ + Permanent testnet launch + +
+
February 2024
+
+
+
+ +
+
+
+ +
January 2024
+
+
+
+ +
+
+
+ +
24 January 2024
+
+
+
+ +
+
+
+ +
January 2024
+
+
+
+ +
+
+
+ +
January 2024
+
+
+
+ +
+
+
+ +
January 2024
+
+
+
+ +
+
+
+ +
December 2023
+
+
+
+ +
+
+
+ +
November 2023
+
+
+
+ +
+
+
+ +
October 2023
+
+
+
+ +
+
+
+ +
October 2023
+
+
+
+ +
+
+
+ +
October 2023
+
+
+
+ +
+
+
+ +
August 2023
+
+
+
+ +
+
+
+ +
July 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..3f4073ec8 --- /dev/null +++ b/zh/about/what-is-pactus/index.html @@ -0,0 +1,410 @@ + + + + + + + + + + + + + 什么是帕图斯? | 帕图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+

什么是帕图斯?

+ +
+ +
+
+

帕图斯是一个专注于去中心化的区块链

+ 帕图斯建立在这样一个原则之上,即仅通过去中心化才能实现公平和透明的系统。 与许多其他区块链平台不同,帕图斯旨在通过消除委托和矿工的需要,消除集中化和操纵的潜力。 这使任何人都可以成为该生态系统的一部分,并确保平台保持真正的去中心化。 + +
+
+ +
+
+

帕图斯是一种用户友好的区块链

+ 帕图斯旨在创建一种用户友好的区块链,任何人都可以轻松使用,而不仅仅是技术专家。 我们的协议旨在简单易用、易于维护和开发。帕图斯提供了一个简单的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..309f55ddc --- /dev/null +++ b/zh/assets/css/custom.css @@ -0,0 +1 @@ +:root{--primary-color-light: #021a34;--secondary-color-light: #075f94;--bg-color-light: #edeef0;--bg-color-reverse-light: #021a34;--bg-color-tinted-light: #b0b2b4;--text-color-light: #4c4c4c;--text-color-reverse-light: #edeef0;--text-muted-color-light: #4c4c4c;--link-color-light: #4c4c4c;--link-hover-color-light: #6c6c6c;--primary-color-dark: #edeef0;--secondary-color-dark: #075f94;--bg-color-dark: #14171c;--bg-color-reverse-dark: #edeef0;--bg-color-tinted-dark: #627191;--text-color-dark: #edeef0;--text-color-reverse-dark: #14171c;--text-muted-color-dark: #edeef0;--link-color-dark: #edeef0;--link-hover-color-dark: #ffffff}[data-bs-theme=light]{--primary-color: var(--primary-color-light);--secondary-color: var(--secondary-color-light);--bg-color-tinted: var(--bg-color-tinted-light);--bg-color: var(--bg-color-light);--bg-color-reverse: var(--bg-color-reverse-light);--text-color: var(--text-color-light);--text-color-reverse: var(--text-color-reverse-light);--text-muted-color: var(--text-muted-color-light);--link-color: var(--link-color-light);--link-hover-color: var(--link-hover-color-light)}[data-bs-theme=dark]{--primary-color: var(--primary-color-dark);--secondary-color: var(--secondary-color-dark);--bg-color: var(--bg-color-dark);--bg-color-reverse: var(--bg-color-reverse-dark);--bg-color-tinted: var(--bg-color-tinted-dark);--text-color: var(--text-color-dark);--text-color-reverse: var(--text-color-reverse-dark);--text-muted-color: var(--text-muted-color-dark);--link-color: var(--link-color-dark);--link-hover-color: var(--link-hover-color-dark)}:root,[data-bs-theme=light]{--pa-blue: #0d6efd;--pa-indigo: #6610f2;--pa-purple: #6f42c1;--pa-pink: #d63384;--pa-red: #dc3545;--pa-orange: #fd7e14;--pa-yellow: #ffc107;--pa-green: #198754;--pa-teal: #20c997;--pa-cyan: #0dcaf0;--pa-black: #000;--pa-white: #fff;--pa-gray: #6c757d;--pa-gray-dark: #343a40;--pa-gray-100: #f8f9fa;--pa-gray-200: #e9ecef;--pa-gray-300: #dee2e6;--pa-gray-400: #ced4da;--pa-gray-500: #adb5bd;--pa-gray-600: #6c757d;--pa-gray-700: #495057;--pa-gray-800: #343a40;--pa-gray-900: #212529;--pa-primary: #021a34;--pa-secondary: #075f94;--pa-success: #198754;--pa-info: #0dcaf0;--pa-warning: #ffc107;--pa-danger: #dc3545;--pa-light: #f8f9fa;--pa-dark: #212529;--pa-primary-rgb: 2, 26, 52;--pa-secondary-rgb: 7, 95, 148;--pa-success-rgb: 25, 135, 84;--pa-info-rgb: 13, 202, 240;--pa-warning-rgb: 255, 193, 7;--pa-danger-rgb: 220, 53, 69;--pa-light-rgb: 248, 249, 250;--pa-dark-rgb: 33, 37, 41;--pa-primary-text-emphasis: #010a15;--pa-secondary-text-emphasis: #03263b;--pa-success-text-emphasis: #0a3622;--pa-info-text-emphasis: #055160;--pa-warning-text-emphasis: #664d03;--pa-danger-text-emphasis: #58151c;--pa-light-text-emphasis: #495057;--pa-dark-text-emphasis: #495057;--pa-primary-bg-subtle: #ccd1d6;--pa-secondary-bg-subtle: #cddfea;--pa-success-bg-subtle: #d1e7dd;--pa-info-bg-subtle: #cff4fc;--pa-warning-bg-subtle: #fff3cd;--pa-danger-bg-subtle: #f8d7da;--pa-light-bg-subtle: #fcfcfd;--pa-dark-bg-subtle: #ced4da;--pa-primary-border-subtle: #9aa3ae;--pa-secondary-border-subtle: #9cbfd4;--pa-success-border-subtle: #a3cfbb;--pa-info-border-subtle: #9eeaf9;--pa-warning-border-subtle: #ffe69c;--pa-danger-border-subtle: #f1aeb5;--pa-light-border-subtle: #e9ecef;--pa-dark-border-subtle: #adb5bd;--pa-white-rgb: 255, 255, 255;--pa-black-rgb: 0, 0, 0;--pa-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";--pa-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--pa-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--pa-body-font-family: var(--pa-font-sans-serif);--pa-body-font-size:1rem;--pa-body-font-weight: 400;--pa-body-line-height: 1.5;--pa-body-color: #212529;--pa-body-color-rgb: 33, 37, 41;--pa-body-bg: #fff;--pa-body-bg-rgb: 255, 255, 255;--pa-emphasis-color: #000;--pa-emphasis-color-rgb: 0, 0, 0;--pa-secondary-color: rgba(33, 37, 41, 0.75);--pa-secondary-color-rgb: 33, 37, 41;--pa-secondary-bg: #e9ecef;--pa-secondary-bg-rgb: 233, 236, 239;--pa-tertiary-color: rgba(33, 37, 41, 0.5);--pa-tertiary-color-rgb: 33, 37, 41;--pa-tertiary-bg: #f8f9fa;--pa-tertiary-bg-rgb: 248, 249, 250;--pa-heading-color: inherit;--pa-link-color: #021a34;--pa-link-color-rgb: 2, 26, 52;--pa-link-decoration: underline;--pa-link-hover-color: #02152a;--pa-link-hover-color-rgb: 2, 21, 42;--pa-code-color: #d63384;--pa-highlight-color: #212529;--pa-highlight-bg: #fff3cd;--pa-border-width: 1px;--pa-border-style: solid;--pa-border-color: #dee2e6;--pa-border-color-translucent: rgba(0, 0, 0, 0.175);--pa-border-radius: 0.375rem;--pa-border-radius-sm: 0.25rem;--pa-border-radius-lg: 0.5rem;--pa-border-radius-xl: 1rem;--pa-border-radius-xxl: 2rem;--pa-border-radius-2xl: var(--pa-border-radius-xxl);--pa-border-radius-pill: 50rem;--pa-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--pa-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--pa-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);--pa-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);--pa-focus-ring-width: 0.25rem;--pa-focus-ring-opacity: 0.25;--pa-focus-ring-color: rgba(2, 26, 52, 0.25);--pa-form-valid-color: #198754;--pa-form-valid-border-color: #198754;--pa-form-invalid-color: #dc3545;--pa-form-invalid-border-color: #dc3545}[data-bs-theme=dark]{color-scheme:dark;--pa-body-color: #dee2e6;--pa-body-color-rgb: 222, 226, 230;--pa-body-bg: #212529;--pa-body-bg-rgb: 33, 37, 41;--pa-emphasis-color: #fff;--pa-emphasis-color-rgb: 255, 255, 255;--pa-secondary-color: rgba(222, 226, 230, 0.75);--pa-secondary-color-rgb: 222, 226, 230;--pa-secondary-bg: #343a40;--pa-secondary-bg-rgb: 52, 58, 64;--pa-tertiary-color: rgba(222, 226, 230, 0.5);--pa-tertiary-color-rgb: 222, 226, 230;--pa-tertiary-bg: #2b3035;--pa-tertiary-bg-rgb: 43, 48, 53;--pa-primary-text-emphasis: #677685;--pa-secondary-text-emphasis: #6a9fbf;--pa-success-text-emphasis: #75b798;--pa-info-text-emphasis: #6edff6;--pa-warning-text-emphasis: #ffda6a;--pa-danger-text-emphasis: #ea868f;--pa-light-text-emphasis: #f8f9fa;--pa-dark-text-emphasis: #dee2e6;--pa-primary-bg-subtle: #00050a;--pa-secondary-bg-subtle: #01131e;--pa-success-bg-subtle: #051b11;--pa-info-bg-subtle: #032830;--pa-warning-bg-subtle: #332701;--pa-danger-bg-subtle: #2c0b0e;--pa-light-bg-subtle: #343a40;--pa-dark-bg-subtle: #1a1d20;--pa-primary-border-subtle: #01101f;--pa-secondary-border-subtle: #043959;--pa-success-border-subtle: #0f5132;--pa-info-border-subtle: #087990;--pa-warning-border-subtle: #997404;--pa-danger-border-subtle: #842029;--pa-light-border-subtle: #495057;--pa-dark-border-subtle: #343a40;--pa-heading-color: inherit;--pa-link-color: #677685;--pa-link-hover-color: #85919d;--pa-link-color-rgb: 103, 118, 133;--pa-link-hover-color-rgb: 133, 145, 157;--pa-code-color: #e685b5;--pa-highlight-color: #dee2e6;--pa-highlight-bg: #664d03;--pa-border-color: #495057;--pa-border-color-translucent: rgba(255, 255, 255, 0.15);--pa-form-valid-color: #75b798;--pa-form-valid-border-color: #75b798;--pa-form-invalid-color: #ea868f;--pa-form-invalid-border-color: #ea868f}*,*::before,*::after{box-sizing:border-box}@media(prefers-reduced-motion: no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--pa-body-font-family);font-size:var(--pa-body-font-size);font-weight:var(--pa-body-font-weight);line-height:var(--pa-body-line-height);color:var(--pa-body-color);text-align:var(--pa-body-text-align);background-color:var(--pa-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;border:0;border-top:var(--pa-border-width) solid;opacity:.25}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--pa-heading-color)}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 + 0.9vw)}@media(min-width: 1200px){h2,.h2{font-size:2rem}}h3,.h3{font-size:calc(1.3rem + 0.6vw)}@media(min-width: 1200px){h3,.h3{font-size:1.75rem}}h4,.h4{font-size:calc(1.275rem + 0.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]{text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{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:0.875em}mark,.mark{padding:.1875em;color:var(--pa-highlight-color);background-color:var(--pa-highlight-bg)}sub,sup{position:relative;font-size:0.75em;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}a{color:rgba(var(--pa-link-color-rgb), var(--pa-link-opacity, 1));text-decoration:underline}a:hover{--pa-link-color-rgb: var(--pa-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:var(--pa-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:0.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:0.875em;color:var(--pa-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:0.875em;color:var(--pa-body-bg);background-color:var(--pa-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:var(--pa-secondary-color);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,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}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]: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 + 0.3vw);line-height:inherit}@media(min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::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:0.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:0.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:var(--pa-body-bg);border:var(--pa-border-width) solid var(--pa-border-color);border-radius:var(--pa-border-radius);box-shadow:var(--pa-box-shadow-sm);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:0.875em;color:var(--pa-secondary-color)}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{--pa-gutter-x: 1.5rem;--pa-gutter-y: 0;width:100%;padding-right:calc(var(--pa-gutter-x)*.5);padding-left:calc(var(--pa-gutter-x)*.5);margin-right:auto;margin-left:auto}@media(min-width: 576px){.container-sm,.container{max-width:540px}}@media(min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media(min-width: 1400px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}}:root{--pa-breakpoint-xs: 0;--pa-breakpoint-sm: 576px;--pa-breakpoint-md: 768px;--pa-breakpoint-lg: 992px;--pa-breakpoint-xl: 1200px;--pa-breakpoint-xxl: 1400px}.row{--pa-gutter-x: 1.5rem;--pa-gutter-y: 0;display:flex;flex-wrap:wrap;margin-top:calc(-1*var(--pa-gutter-y));margin-right:calc(-0.5*var(--pa-gutter-x));margin-left:calc(-0.5*var(--pa-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--pa-gutter-x)*.5);padding-left:calc(var(--pa-gutter-x)*.5);margin-top:var(--pa-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.33333333%}.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.66666667%}.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{--pa-gutter-x: 0}.g-0,.gy-0{--pa-gutter-y: 0}.g-1,.gx-1{--pa-gutter-x: 0.25rem}.g-1,.gy-1{--pa-gutter-y: 0.25rem}.g-2,.gx-2{--pa-gutter-x: 0.5rem}.g-2,.gy-2{--pa-gutter-y: 0.5rem}.g-3,.gx-3{--pa-gutter-x: 1rem}.g-3,.gy-3{--pa-gutter-y: 1rem}.g-4,.gx-4{--pa-gutter-x: 1.5rem}.g-4,.gy-4{--pa-gutter-y: 1.5rem}.g-5,.gx-5{--pa-gutter-x: 3rem}.g-5,.gy-5{--pa-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.33333333%}.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.66666667%}.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{--pa-gutter-x: 0}.g-sm-0,.gy-sm-0{--pa-gutter-y: 0}.g-sm-1,.gx-sm-1{--pa-gutter-x: 0.25rem}.g-sm-1,.gy-sm-1{--pa-gutter-y: 0.25rem}.g-sm-2,.gx-sm-2{--pa-gutter-x: 0.5rem}.g-sm-2,.gy-sm-2{--pa-gutter-y: 0.5rem}.g-sm-3,.gx-sm-3{--pa-gutter-x: 1rem}.g-sm-3,.gy-sm-3{--pa-gutter-y: 1rem}.g-sm-4,.gx-sm-4{--pa-gutter-x: 1.5rem}.g-sm-4,.gy-sm-4{--pa-gutter-y: 1.5rem}.g-sm-5,.gx-sm-5{--pa-gutter-x: 3rem}.g-sm-5,.gy-sm-5{--pa-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.33333333%}.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.66666667%}.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{--pa-gutter-x: 0}.g-md-0,.gy-md-0{--pa-gutter-y: 0}.g-md-1,.gx-md-1{--pa-gutter-x: 0.25rem}.g-md-1,.gy-md-1{--pa-gutter-y: 0.25rem}.g-md-2,.gx-md-2{--pa-gutter-x: 0.5rem}.g-md-2,.gy-md-2{--pa-gutter-y: 0.5rem}.g-md-3,.gx-md-3{--pa-gutter-x: 1rem}.g-md-3,.gy-md-3{--pa-gutter-y: 1rem}.g-md-4,.gx-md-4{--pa-gutter-x: 1.5rem}.g-md-4,.gy-md-4{--pa-gutter-y: 1.5rem}.g-md-5,.gx-md-5{--pa-gutter-x: 3rem}.g-md-5,.gy-md-5{--pa-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.33333333%}.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.66666667%}.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{--pa-gutter-x: 0}.g-lg-0,.gy-lg-0{--pa-gutter-y: 0}.g-lg-1,.gx-lg-1{--pa-gutter-x: 0.25rem}.g-lg-1,.gy-lg-1{--pa-gutter-y: 0.25rem}.g-lg-2,.gx-lg-2{--pa-gutter-x: 0.5rem}.g-lg-2,.gy-lg-2{--pa-gutter-y: 0.5rem}.g-lg-3,.gx-lg-3{--pa-gutter-x: 1rem}.g-lg-3,.gy-lg-3{--pa-gutter-y: 1rem}.g-lg-4,.gx-lg-4{--pa-gutter-x: 1.5rem}.g-lg-4,.gy-lg-4{--pa-gutter-y: 1.5rem}.g-lg-5,.gx-lg-5{--pa-gutter-x: 3rem}.g-lg-5,.gy-lg-5{--pa-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.33333333%}.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.66666667%}.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{--pa-gutter-x: 0}.g-xl-0,.gy-xl-0{--pa-gutter-y: 0}.g-xl-1,.gx-xl-1{--pa-gutter-x: 0.25rem}.g-xl-1,.gy-xl-1{--pa-gutter-y: 0.25rem}.g-xl-2,.gx-xl-2{--pa-gutter-x: 0.5rem}.g-xl-2,.gy-xl-2{--pa-gutter-y: 0.5rem}.g-xl-3,.gx-xl-3{--pa-gutter-x: 1rem}.g-xl-3,.gy-xl-3{--pa-gutter-y: 1rem}.g-xl-4,.gx-xl-4{--pa-gutter-x: 1.5rem}.g-xl-4,.gy-xl-4{--pa-gutter-y: 1.5rem}.g-xl-5,.gx-xl-5{--pa-gutter-x: 3rem}.g-xl-5,.gy-xl-5{--pa-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.33333333%}.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.66666667%}.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{--pa-gutter-x: 0}.g-xxl-0,.gy-xxl-0{--pa-gutter-y: 0}.g-xxl-1,.gx-xxl-1{--pa-gutter-x: 0.25rem}.g-xxl-1,.gy-xxl-1{--pa-gutter-y: 0.25rem}.g-xxl-2,.gx-xxl-2{--pa-gutter-x: 0.5rem}.g-xxl-2,.gy-xxl-2{--pa-gutter-y: 0.5rem}.g-xxl-3,.gx-xxl-3{--pa-gutter-x: 1rem}.g-xxl-3,.gy-xxl-3{--pa-gutter-y: 1rem}.g-xxl-4,.gx-xxl-4{--pa-gutter-x: 1.5rem}.g-xxl-4,.gy-xxl-4{--pa-gutter-y: 1.5rem}.g-xxl-5,.gx-xxl-5{--pa-gutter-x: 3rem}.g-xxl-5,.gy-xxl-5{--pa-gutter-y: 3rem}}.table{--pa-table-color-type: initial;--pa-table-bg-type: initial;--pa-table-color-state: initial;--pa-table-bg-state: initial;--pa-table-color: var(--pa-emphasis-color);--pa-table-bg: var(--pa-body-bg);--pa-table-border-color: var(--pa-border-color);--pa-table-accent-bg: transparent;--pa-table-striped-color: var(--pa-emphasis-color);--pa-table-striped-bg: rgba(var(--pa-emphasis-color-rgb), 0.05);--pa-table-active-color: var(--pa-emphasis-color);--pa-table-active-bg: rgba(var(--pa-emphasis-color-rgb), 0.1);--pa-table-hover-color: var(--pa-emphasis-color);--pa-table-hover-bg: rgba(var(--pa-emphasis-color-rgb), 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--pa-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--pa-table-color-state, var(--pa-table-color-type, var(--pa-table-color)));background-color:var(--pa-table-bg);border-bottom-width:var(--pa-border-width);box-shadow:inset 0 0 0 9999px var(--pa-table-bg-state, var(--pa-table-bg-type, var(--pa-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(var(--pa-border-width) * 2) solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:var(--pa-border-width) 0}.table-bordered>:not(caption)>*>*{border-width:0 var(--pa-border-width)}.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)>*{--pa-table-color-type: var(--pa-table-striped-color);--pa-table-bg-type: var(--pa-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(even){--pa-table-color-type: var(--pa-table-striped-color);--pa-table-bg-type: var(--pa-table-striped-bg)}.table-active{--pa-table-color-state: var(--pa-table-active-color);--pa-table-bg-state: var(--pa-table-active-bg)}.table-hover>tbody>tr:hover>*{--pa-table-color-state: var(--pa-table-hover-color);--pa-table-bg-state: var(--pa-table-hover-bg)}.table-primary{--pa-table-color: #000;--pa-table-bg: #ccd1d6;--pa-table-border-color: #a3a7ab;--pa-table-striped-bg: #c2c7cb;--pa-table-striped-color: #000;--pa-table-active-bg: #b8bcc1;--pa-table-active-color: #000;--pa-table-hover-bg: #bdc1c6;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-secondary{--pa-table-color: #000;--pa-table-bg: #cddfea;--pa-table-border-color: #a4b2bb;--pa-table-striped-bg: #c3d4de;--pa-table-striped-color: #000;--pa-table-active-bg: #b9c9d3;--pa-table-active-color: #000;--pa-table-hover-bg: #beced8;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-success{--pa-table-color: #000;--pa-table-bg: #d1e7dd;--pa-table-border-color: #a7b9b1;--pa-table-striped-bg: #c7dbd2;--pa-table-striped-color: #000;--pa-table-active-bg: #bcd0c7;--pa-table-active-color: #000;--pa-table-hover-bg: #c1d6cc;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-info{--pa-table-color: #000;--pa-table-bg: #cff4fc;--pa-table-border-color: #a6c3ca;--pa-table-striped-bg: #c5e8ef;--pa-table-striped-color: #000;--pa-table-active-bg: #badce3;--pa-table-active-color: #000;--pa-table-hover-bg: #bfe2e9;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-warning{--pa-table-color: #000;--pa-table-bg: #fff3cd;--pa-table-border-color: #ccc2a4;--pa-table-striped-bg: #f2e7c3;--pa-table-striped-color: #000;--pa-table-active-bg: #e6dbb9;--pa-table-active-color: #000;--pa-table-hover-bg: #ece1be;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-danger{--pa-table-color: #000;--pa-table-bg: #f8d7da;--pa-table-border-color: #c6acae;--pa-table-striped-bg: #eccccf;--pa-table-striped-color: #000;--pa-table-active-bg: #dfc2c4;--pa-table-active-color: #000;--pa-table-hover-bg: #e5c7ca;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-light{--pa-table-color: #000;--pa-table-bg: #f8f9fa;--pa-table-border-color: #c6c7c8;--pa-table-striped-bg: #ecedee;--pa-table-striped-color: #000;--pa-table-active-bg: #dfe0e1;--pa-table-active-color: #000;--pa-table-hover-bg: #e5e6e7;--pa-table-hover-color: #000;color:var(--pa-table-color);border-color:var(--pa-table-border-color)}.table-dark{--pa-table-color: #fff;--pa-table-bg: #212529;--pa-table-border-color: #4d5154;--pa-table-striped-bg: #2c3034;--pa-table-striped-color: #fff;--pa-table-active-bg: #373b3e;--pa-table-active-color: #fff;--pa-table-hover-bg: #323539;--pa-table-hover-color: #fff;color:var(--pa-table-color);border-color:var(--pa-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}}.btn{--pa-btn-padding-x: 0.75rem;--pa-btn-padding-y: 0.375rem;--pa-btn-font-family: ;--pa-btn-font-size:1rem;--pa-btn-font-weight: 400;--pa-btn-line-height: 1.5;--pa-btn-color: var(--pa-body-color);--pa-btn-bg: transparent;--pa-btn-border-width: var(--pa-border-width);--pa-btn-border-color: transparent;--pa-btn-border-radius: var(--pa-border-radius);--pa-btn-hover-border-color: transparent;--pa-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);--pa-btn-disabled-opacity: 0.65;--pa-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--pa-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--pa-btn-padding-y) var(--pa-btn-padding-x);font-family:var(--pa-btn-font-family);font-size:var(--pa-btn-font-size);font-weight:var(--pa-btn-font-weight);line-height:var(--pa-btn-line-height);color:var(--pa-btn-color);text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;border:var(--pa-btn-border-width) solid var(--pa-btn-border-color);border-radius:var(--pa-btn-border-radius);background-color:var(--pa-btn-bg);box-shadow:var(--pa-btn-box-shadow);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:hover{color:var(--pa-btn-hover-color);background-color:var(--pa-btn-hover-bg);border-color:var(--pa-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--pa-btn-color);background-color:var(--pa-btn-bg);border-color:var(--pa-btn-border-color)}.btn:focus-visible{color:var(--pa-btn-hover-color);background-color:var(--pa-btn-hover-bg);border-color:var(--pa-btn-hover-border-color);outline:0;box-shadow:var(--pa-btn-box-shadow),var(--pa-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--pa-btn-hover-border-color);outline:0;box-shadow:var(--pa-btn-box-shadow),var(--pa-btn-focus-box-shadow)}.btn-check:checked+.btn,:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--pa-btn-active-color);background-color:var(--pa-btn-active-bg);border-color:var(--pa-btn-active-border-color);box-shadow:var(--pa-btn-active-shadow)}.btn-check:checked+.btn:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible{box-shadow:var(--pa-btn-active-shadow),var(--pa-btn-focus-box-shadow)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{color:var(--pa-btn-disabled-color);pointer-events:none;background-color:var(--pa-btn-disabled-bg);border-color:var(--pa-btn-disabled-border-color);opacity:var(--pa-btn-disabled-opacity);box-shadow:none}.btn-primary{--pa-btn-color: #fff;--pa-btn-bg: #021a34;--pa-btn-border-color: #021a34;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #02162c;--pa-btn-hover-border-color: #02152a;--pa-btn-focus-shadow-rgb: 40, 60, 82;--pa-btn-active-color: #fff;--pa-btn-active-bg: #02152a;--pa-btn-active-border-color: #021427;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #fff;--pa-btn-disabled-bg: #021a34;--pa-btn-disabled-border-color: #021a34}.btn-secondary{--pa-btn-color: #fff;--pa-btn-bg: #075f94;--pa-btn-border-color: #075f94;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #06517e;--pa-btn-hover-border-color: #064c76;--pa-btn-focus-shadow-rgb: 44, 119, 164;--pa-btn-active-color: #fff;--pa-btn-active-bg: #064c76;--pa-btn-active-border-color: #05476f;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #fff;--pa-btn-disabled-bg: #075f94;--pa-btn-disabled-border-color: #075f94}.btn-success{--pa-btn-color: #fff;--pa-btn-bg: #198754;--pa-btn-border-color: #198754;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #157347;--pa-btn-hover-border-color: #146c43;--pa-btn-focus-shadow-rgb: 60, 153, 110;--pa-btn-active-color: #fff;--pa-btn-active-bg: #146c43;--pa-btn-active-border-color: #13653f;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #fff;--pa-btn-disabled-bg: #198754;--pa-btn-disabled-border-color: #198754}.btn-info{--pa-btn-color: #000;--pa-btn-bg: #0dcaf0;--pa-btn-border-color: #0dcaf0;--pa-btn-hover-color: #000;--pa-btn-hover-bg: #31d2f2;--pa-btn-hover-border-color: #25cff2;--pa-btn-focus-shadow-rgb: 11, 172, 204;--pa-btn-active-color: #000;--pa-btn-active-bg: #3dd5f3;--pa-btn-active-border-color: #25cff2;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #000;--pa-btn-disabled-bg: #0dcaf0;--pa-btn-disabled-border-color: #0dcaf0}.btn-warning{--pa-btn-color: #000;--pa-btn-bg: #ffc107;--pa-btn-border-color: #ffc107;--pa-btn-hover-color: #000;--pa-btn-hover-bg: #ffca2c;--pa-btn-hover-border-color: #ffc720;--pa-btn-focus-shadow-rgb: 217, 164, 6;--pa-btn-active-color: #000;--pa-btn-active-bg: #ffcd39;--pa-btn-active-border-color: #ffc720;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #000;--pa-btn-disabled-bg: #ffc107;--pa-btn-disabled-border-color: #ffc107}.btn-danger{--pa-btn-color: #fff;--pa-btn-bg: #dc3545;--pa-btn-border-color: #dc3545;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #bb2d3b;--pa-btn-hover-border-color: #b02a37;--pa-btn-focus-shadow-rgb: 225, 83, 97;--pa-btn-active-color: #fff;--pa-btn-active-bg: #b02a37;--pa-btn-active-border-color: #a52834;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #fff;--pa-btn-disabled-bg: #dc3545;--pa-btn-disabled-border-color: #dc3545}.btn-light{--pa-btn-color: #000;--pa-btn-bg: #f8f9fa;--pa-btn-border-color: #f8f9fa;--pa-btn-hover-color: #000;--pa-btn-hover-bg: #d3d4d5;--pa-btn-hover-border-color: #c6c7c8;--pa-btn-focus-shadow-rgb: 211, 212, 213;--pa-btn-active-color: #000;--pa-btn-active-bg: #c6c7c8;--pa-btn-active-border-color: #babbbc;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #000;--pa-btn-disabled-bg: #f8f9fa;--pa-btn-disabled-border-color: #f8f9fa}.btn-dark{--pa-btn-color: #fff;--pa-btn-bg: #212529;--pa-btn-border-color: #212529;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #424649;--pa-btn-hover-border-color: #373b3e;--pa-btn-focus-shadow-rgb: 66, 70, 73;--pa-btn-active-color: #fff;--pa-btn-active-bg: #4d5154;--pa-btn-active-border-color: #373b3e;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #fff;--pa-btn-disabled-bg: #212529;--pa-btn-disabled-border-color: #212529}.btn-outline-primary{--pa-btn-color: #021a34;--pa-btn-border-color: #021a34;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #021a34;--pa-btn-hover-border-color: #021a34;--pa-btn-focus-shadow-rgb: 2, 26, 52;--pa-btn-active-color: #fff;--pa-btn-active-bg: #021a34;--pa-btn-active-border-color: #021a34;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #021a34;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #021a34;--pa-gradient: none}.btn-outline-secondary{--pa-btn-color: #075f94;--pa-btn-border-color: #075f94;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #075f94;--pa-btn-hover-border-color: #075f94;--pa-btn-focus-shadow-rgb: 7, 95, 148;--pa-btn-active-color: #fff;--pa-btn-active-bg: #075f94;--pa-btn-active-border-color: #075f94;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #075f94;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #075f94;--pa-gradient: none}.btn-outline-success{--pa-btn-color: #198754;--pa-btn-border-color: #198754;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #198754;--pa-btn-hover-border-color: #198754;--pa-btn-focus-shadow-rgb: 25, 135, 84;--pa-btn-active-color: #fff;--pa-btn-active-bg: #198754;--pa-btn-active-border-color: #198754;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #198754;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #198754;--pa-gradient: none}.btn-outline-info{--pa-btn-color: #0dcaf0;--pa-btn-border-color: #0dcaf0;--pa-btn-hover-color: #000;--pa-btn-hover-bg: #0dcaf0;--pa-btn-hover-border-color: #0dcaf0;--pa-btn-focus-shadow-rgb: 13, 202, 240;--pa-btn-active-color: #000;--pa-btn-active-bg: #0dcaf0;--pa-btn-active-border-color: #0dcaf0;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #0dcaf0;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #0dcaf0;--pa-gradient: none}.btn-outline-warning{--pa-btn-color: #ffc107;--pa-btn-border-color: #ffc107;--pa-btn-hover-color: #000;--pa-btn-hover-bg: #ffc107;--pa-btn-hover-border-color: #ffc107;--pa-btn-focus-shadow-rgb: 255, 193, 7;--pa-btn-active-color: #000;--pa-btn-active-bg: #ffc107;--pa-btn-active-border-color: #ffc107;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #ffc107;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #ffc107;--pa-gradient: none}.btn-outline-danger{--pa-btn-color: #dc3545;--pa-btn-border-color: #dc3545;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #dc3545;--pa-btn-hover-border-color: #dc3545;--pa-btn-focus-shadow-rgb: 220, 53, 69;--pa-btn-active-color: #fff;--pa-btn-active-bg: #dc3545;--pa-btn-active-border-color: #dc3545;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #dc3545;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #dc3545;--pa-gradient: none}.btn-outline-light{--pa-btn-color: #f8f9fa;--pa-btn-border-color: #f8f9fa;--pa-btn-hover-color: #000;--pa-btn-hover-bg: #f8f9fa;--pa-btn-hover-border-color: #f8f9fa;--pa-btn-focus-shadow-rgb: 248, 249, 250;--pa-btn-active-color: #000;--pa-btn-active-bg: #f8f9fa;--pa-btn-active-border-color: #f8f9fa;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #f8f9fa;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #f8f9fa;--pa-gradient: none}.btn-outline-dark{--pa-btn-color: #212529;--pa-btn-border-color: #212529;--pa-btn-hover-color: #fff;--pa-btn-hover-bg: #212529;--pa-btn-hover-border-color: #212529;--pa-btn-focus-shadow-rgb: 33, 37, 41;--pa-btn-active-color: #fff;--pa-btn-active-bg: #212529;--pa-btn-active-border-color: #212529;--pa-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--pa-btn-disabled-color: #212529;--pa-btn-disabled-bg: transparent;--pa-btn-disabled-border-color: #212529;--pa-gradient: none}.btn-link{--pa-btn-font-weight: 400;--pa-btn-color: var(--pa-link-color);--pa-btn-bg: transparent;--pa-btn-border-color: transparent;--pa-btn-hover-color: var(--pa-link-hover-color);--pa-btn-hover-border-color: transparent;--pa-btn-active-color: var(--pa-link-hover-color);--pa-btn-active-border-color: transparent;--pa-btn-disabled-color: #6c757d;--pa-btn-disabled-border-color: transparent;--pa-btn-box-shadow: 0 0 0 #000;--pa-btn-focus-shadow-rgb: 40, 60, 82;text-decoration:underline}.btn-link:focus-visible{color:var(--pa-btn-color)}.btn-link:hover{color:var(--pa-btn-hover-color)}.btn-lg{--pa-btn-padding-y: 0.5rem;--pa-btn-padding-x: 1rem;--pa-btn-font-size:1.25rem;--pa-btn-border-radius: var(--pa-border-radius-lg)}.btn-sm{--pa-btn-padding-y: 0.25rem;--pa-btn-padding-x: 0.5rem;--pa-btn-font-size:0.875rem;--pa-btn-border-radius: var(--pa-border-radius-sm)}.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}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-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 rgba(0,0,0,0);border-bottom:0;border-left:.3em solid rgba(0,0,0,0)}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--pa-dropdown-zindex: 1000;--pa-dropdown-min-width: 10rem;--pa-dropdown-padding-x: 0;--pa-dropdown-padding-y: 0.5rem;--pa-dropdown-spacer: 0.125rem;--pa-dropdown-font-size:1rem;--pa-dropdown-color: var(--pa-body-color);--pa-dropdown-bg: var(--pa-body-bg);--pa-dropdown-border-color: var(--pa-border-color-translucent);--pa-dropdown-border-radius: var(--pa-border-radius);--pa-dropdown-border-width: var(--pa-border-width);--pa-dropdown-inner-border-radius: calc(var(--pa-border-radius) - var(--pa-border-width));--pa-dropdown-divider-bg: var(--pa-border-color-translucent);--pa-dropdown-divider-margin-y: 0.5rem;--pa-dropdown-box-shadow: var(--pa-box-shadow);--pa-dropdown-link-color: var(--pa-body-color);--pa-dropdown-link-hover-color: var(--pa-body-color);--pa-dropdown-link-hover-bg: var(--pa-tertiary-bg);--pa-dropdown-link-active-color: #fff;--pa-dropdown-link-active-bg: #021a34;--pa-dropdown-link-disabled-color: var(--pa-tertiary-color);--pa-dropdown-item-padding-x: 1rem;--pa-dropdown-item-padding-y: 0.25rem;--pa-dropdown-header-color: #6c757d;--pa-dropdown-header-padding-x: 1rem;--pa-dropdown-header-padding-y: 0.5rem;position:absolute;z-index:var(--pa-dropdown-zindex);display:none;min-width:var(--pa-dropdown-min-width);padding:var(--pa-dropdown-padding-y) var(--pa-dropdown-padding-x);margin:0;font-size:var(--pa-dropdown-font-size);color:var(--pa-dropdown-color);text-align:left;list-style:none;background-color:var(--pa-dropdown-bg);background-clip:padding-box;border:var(--pa-dropdown-border-width) solid var(--pa-dropdown-border-color);border-radius:var(--pa-dropdown-border-radius);box-shadow:var(--pa-dropdown-box-shadow)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--pa-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(--pa-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid rgba(0,0,0,0);border-bottom:.3em solid;border-left:.3em solid rgba(0,0,0,0)}.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(--pa-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:0;border-bottom:.3em solid rgba(0,0,0,0);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(--pa-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 rgba(0,0,0,0);border-right:.3em solid;border-bottom:.3em solid rgba(0,0,0,0)}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--pa-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--pa-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--pa-dropdown-item-padding-y) var(--pa-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--pa-dropdown-link-color);text-align:inherit;text-decoration:none;white-space:nowrap;background-color:rgba(0,0,0,0);border:0;border-radius:var(--pa-dropdown-item-border-radius, 0)}.dropdown-item:hover,.dropdown-item:focus{color:var(--pa-dropdown-link-hover-color);background-color:var(--pa-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--pa-dropdown-link-active-color);text-decoration:none;background-color:var(--pa-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--pa-dropdown-link-disabled-color);pointer-events:none;background-color:rgba(0,0,0,0)}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--pa-dropdown-header-padding-y) var(--pa-dropdown-header-padding-x);margin-bottom:0;font-size:0.875rem;color:var(--pa-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--pa-dropdown-item-padding-y) var(--pa-dropdown-item-padding-x);color:var(--pa-dropdown-link-color)}.dropdown-menu-dark{--pa-dropdown-color: #dee2e6;--pa-dropdown-bg: #343a40;--pa-dropdown-border-color: var(--pa-border-color-translucent);--pa-dropdown-box-shadow: ;--pa-dropdown-link-color: #dee2e6;--pa-dropdown-link-hover-color: #fff;--pa-dropdown-divider-bg: var(--pa-border-color-translucent);--pa-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);--pa-dropdown-link-active-color: #fff;--pa-dropdown-link-active-bg: #021a34;--pa-dropdown-link-disabled-color: #adb5bd;--pa-dropdown-header-color: #adb5bd}.nav{--pa-nav-link-padding-x: 1rem;--pa-nav-link-padding-y: 0.5rem;--pa-nav-link-font-weight: ;--pa-nav-link-color: var(--pa-link-color);--pa-nav-link-hover-color: var(--pa-link-hover-color);--pa-nav-link-disabled-color: var(--pa-secondary-color);display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--pa-nav-link-padding-y) var(--pa-nav-link-padding-x);font-size:var(--pa-nav-link-font-size);font-weight:var(--pa-nav-link-font-weight);color:var(--pa-nav-link-color);text-decoration:none;background:none;border:0;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:hover,.nav-link:focus{color:var(--pa-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(2,26,52,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--pa-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--pa-nav-tabs-border-width: var(--pa-border-width);--pa-nav-tabs-border-color: var(--pa-border-color);--pa-nav-tabs-border-radius: var(--pa-border-radius);--pa-nav-tabs-link-hover-border-color: var(--pa-secondary-bg) var(--pa-secondary-bg) var(--pa-border-color);--pa-nav-tabs-link-active-color: var(--pa-emphasis-color);--pa-nav-tabs-link-active-bg: var(--pa-body-bg);--pa-nav-tabs-link-active-border-color: var(--pa-border-color) var(--pa-border-color) var(--pa-body-bg);border-bottom:var(--pa-nav-tabs-border-width) solid var(--pa-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1*var(--pa-nav-tabs-border-width));border:var(--pa-nav-tabs-border-width) solid rgba(0,0,0,0);border-top-left-radius:var(--pa-nav-tabs-border-radius);border-top-right-radius:var(--pa-nav-tabs-border-radius)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--pa-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--pa-nav-tabs-link-active-color);background-color:var(--pa-nav-tabs-link-active-bg);border-color:var(--pa-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1*var(--pa-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--pa-nav-pills-border-radius: var(--pa-border-radius);--pa-nav-pills-link-active-color: #fff;--pa-nav-pills-link-active-bg: #021a34}.nav-pills .nav-link{border-radius:var(--pa-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--pa-nav-pills-link-active-color);background-color:var(--pa-nav-pills-link-active-bg)}.nav-underline{--pa-nav-underline-gap: 1rem;--pa-nav-underline-border-width: 0.125rem;--pa-nav-underline-link-active-color: var(--pa-emphasis-color);gap:var(--pa-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--pa-nav-underline-border-width) solid rgba(0,0,0,0)}.nav-underline .nav-link:hover,.nav-underline .nav-link:focus{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--pa-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{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{--pa-navbar-padding-x: 0;--pa-navbar-padding-y: 0.5rem;--pa-navbar-color: rgba(var(--pa-emphasis-color-rgb), 0.65);--pa-navbar-hover-color: rgba(var(--pa-emphasis-color-rgb), 0.8);--pa-navbar-disabled-color: rgba(var(--pa-emphasis-color-rgb), 0.3);--pa-navbar-active-color: rgba(var(--pa-emphasis-color-rgb), 1);--pa-navbar-brand-padding-y: 0.3125rem;--pa-navbar-brand-margin-end: 1rem;--pa-navbar-brand-font-size: 1.25rem;--pa-navbar-brand-color: rgba(var(--pa-emphasis-color-rgb), 1);--pa-navbar-brand-hover-color: rgba(var(--pa-emphasis-color-rgb), 1);--pa-navbar-nav-link-padding-x: 0.5rem;--pa-navbar-toggler-padding-y: 0.25rem;--pa-navbar-toggler-padding-x: 0.75rem;--pa-navbar-toggler-font-size: 1.25rem;--pa-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%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--pa-navbar-toggler-border-color: rgba(var(--pa-emphasis-color-rgb), 0.15);--pa-navbar-toggler-border-radius: var(--pa-border-radius);--pa-navbar-toggler-focus-width: 0.25rem;--pa-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(--pa-navbar-padding-y) var(--pa-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--pa-navbar-brand-padding-y);padding-bottom:var(--pa-navbar-brand-padding-y);margin-right:var(--pa-navbar-brand-margin-end);font-size:var(--pa-navbar-brand-font-size);color:var(--pa-navbar-brand-color);text-decoration:none;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--pa-navbar-brand-hover-color)}.navbar-nav{--pa-nav-link-padding-x: 0;--pa-nav-link-padding-y: 0.5rem;--pa-nav-link-font-weight: ;--pa-nav-link-color: var(--pa-navbar-color);--pa-nav-link-hover-color: var(--pa-navbar-hover-color);--pa-nav-link-disabled-color: var(--pa-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--pa-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--pa-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--pa-navbar-active-color)}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:var(--pa-navbar-toggler-padding-y) var(--pa-navbar-toggler-padding-x);font-size:var(--pa-navbar-toggler-font-size);line-height:1;color:var(--pa-navbar-color);background-color:rgba(0,0,0,0);border:var(--pa-border-width) solid var(--pa-navbar-toggler-border-color);border-radius:var(--pa-navbar-toggler-border-radius);transition:var(--pa-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(--pa-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--pa-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--pa-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(--pa-navbar-nav-link-padding-x);padding-left:var(--pa-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:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;box-shadow:none;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(--pa-navbar-nav-link-padding-x);padding-left:var(--pa-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:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;box-shadow:none;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(--pa-navbar-nav-link-padding-x);padding-left:var(--pa-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:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;box-shadow:none;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(--pa-navbar-nav-link-padding-x);padding-left:var(--pa-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:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;box-shadow:none;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(--pa-navbar-nav-link-padding-x);padding-left:var(--pa-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:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;box-shadow:none;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(--pa-navbar-nav-link-padding-x);padding-left:var(--pa-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:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;box-shadow:none;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,.navbar[data-bs-theme=dark]{--pa-navbar-color: rgba(255, 255, 255, 0.55);--pa-navbar-hover-color: rgba(255, 255, 255, 0.75);--pa-navbar-disabled-color: rgba(255, 255, 255, 0.25);--pa-navbar-active-color: #fff;--pa-navbar-brand-color: #fff;--pa-navbar-brand-hover-color: #fff;--pa-navbar-toggler-border-color: rgba(255, 255, 255, 0.1);--pa-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")}[data-bs-theme=dark] .navbar-toggler-icon{--pa-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")}.badge{--pa-badge-padding-x: 0.65em;--pa-badge-padding-y: 0.35em;--pa-badge-font-size:0.75em;--pa-badge-font-weight: 700;--pa-badge-color: #fff;--pa-badge-border-radius: var(--pa-border-radius);display:inline-block;padding:var(--pa-badge-padding-y) var(--pa-badge-padding-x);font-size:var(--pa-badge-font-size);font-weight:var(--pa-badge-font-weight);line-height:1;color:var(--pa-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--pa-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--pa-alert-bg: transparent;--pa-alert-padding-x: 1rem;--pa-alert-padding-y: 1rem;--pa-alert-margin-bottom: 1rem;--pa-alert-color: inherit;--pa-alert-border-color: transparent;--pa-alert-border: var(--pa-border-width) solid var(--pa-alert-border-color);--pa-alert-border-radius: var(--pa-border-radius);--pa-alert-link-color: inherit;position:relative;padding:var(--pa-alert-padding-y) var(--pa-alert-padding-x);margin-bottom:var(--pa-alert-margin-bottom);color:var(--pa-alert-color);background-color:var(--pa-alert-bg);border:var(--pa-alert-border);border-radius:var(--pa-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--pa-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{--pa-alert-color: var(--pa-primary-text-emphasis);--pa-alert-bg: var(--pa-primary-bg-subtle);--pa-alert-border-color: var(--pa-primary-border-subtle);--pa-alert-link-color: var(--pa-primary-text-emphasis)}.alert-secondary{--pa-alert-color: var(--pa-secondary-text-emphasis);--pa-alert-bg: var(--pa-secondary-bg-subtle);--pa-alert-border-color: var(--pa-secondary-border-subtle);--pa-alert-link-color: var(--pa-secondary-text-emphasis)}.alert-success{--pa-alert-color: var(--pa-success-text-emphasis);--pa-alert-bg: var(--pa-success-bg-subtle);--pa-alert-border-color: var(--pa-success-border-subtle);--pa-alert-link-color: var(--pa-success-text-emphasis)}.alert-info{--pa-alert-color: var(--pa-info-text-emphasis);--pa-alert-bg: var(--pa-info-bg-subtle);--pa-alert-border-color: var(--pa-info-border-subtle);--pa-alert-link-color: var(--pa-info-text-emphasis)}.alert-warning{--pa-alert-color: var(--pa-warning-text-emphasis);--pa-alert-bg: var(--pa-warning-bg-subtle);--pa-alert-border-color: var(--pa-warning-border-subtle);--pa-alert-link-color: var(--pa-warning-text-emphasis)}.alert-danger{--pa-alert-color: var(--pa-danger-text-emphasis);--pa-alert-bg: var(--pa-danger-bg-subtle);--pa-alert-border-color: var(--pa-danger-border-subtle);--pa-alert-link-color: var(--pa-danger-text-emphasis)}.alert-light{--pa-alert-color: var(--pa-light-text-emphasis);--pa-alert-bg: var(--pa-light-bg-subtle);--pa-alert-border-color: var(--pa-light-border-subtle);--pa-alert-link-color: var(--pa-light-text-emphasis)}.alert-dark{--pa-alert-color: var(--pa-dark-text-emphasis);--pa-alert-bg: var(--pa-dark-bg-subtle);--pa-alert-border-color: var(--pa-dark-border-subtle);--pa-alert-link-color: var(--pa-dark-text-emphasis)}.clearfix::after{display:block;clear:both;content:""}.text-bg-primary{color:#fff !important;background-color:RGBA(var(--pa-primary-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-secondary{color:#fff !important;background-color:RGBA(var(--pa-secondary-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-success{color:#fff !important;background-color:RGBA(var(--pa-success-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-info{color:#000 !important;background-color:RGBA(var(--pa-info-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-warning{color:#000 !important;background-color:RGBA(var(--pa-warning-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-danger{color:#fff !important;background-color:RGBA(var(--pa-danger-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-light{color:#000 !important;background-color:RGBA(var(--pa-light-rgb), var(--pa-bg-opacity, 1)) !important}.text-bg-dark{color:#fff !important;background-color:RGBA(var(--pa-dark-rgb), var(--pa-bg-opacity, 1)) !important}.link-primary{color:RGBA(var(--pa-primary-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-primary-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-primary:hover,.link-primary:focus{color:RGBA(2, 21, 42, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(2, 21, 42, var(--pa-link-underline-opacity, 1)) !important}.link-secondary{color:RGBA(var(--pa-secondary-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-secondary-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-secondary:hover,.link-secondary:focus{color:RGBA(6, 76, 118, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(6, 76, 118, var(--pa-link-underline-opacity, 1)) !important}.link-success{color:RGBA(var(--pa-success-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-success-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-success:hover,.link-success:focus{color:RGBA(20, 108, 67, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(20, 108, 67, var(--pa-link-underline-opacity, 1)) !important}.link-info{color:RGBA(var(--pa-info-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-info-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-info:hover,.link-info:focus{color:RGBA(61, 213, 243, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(61, 213, 243, var(--pa-link-underline-opacity, 1)) !important}.link-warning{color:RGBA(var(--pa-warning-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-warning-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-warning:hover,.link-warning:focus{color:RGBA(255, 205, 57, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(255, 205, 57, var(--pa-link-underline-opacity, 1)) !important}.link-danger{color:RGBA(var(--pa-danger-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-danger-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-danger:hover,.link-danger:focus{color:RGBA(176, 42, 55, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(176, 42, 55, var(--pa-link-underline-opacity, 1)) !important}.link-light{color:RGBA(var(--pa-light-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-light-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-light:hover,.link-light:focus{color:RGBA(249, 250, 251, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(249, 250, 251, var(--pa-link-underline-opacity, 1)) !important}.link-dark{color:RGBA(var(--pa-dark-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-dark-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-dark:hover,.link-dark:focus{color:RGBA(26, 30, 33, var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(26, 30, 33, var(--pa-link-underline-opacity, 1)) !important}.link-body-emphasis{color:RGBA(var(--pa-emphasis-color-rgb), var(--pa-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--pa-emphasis-color-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-body-emphasis:hover,.link-body-emphasis:focus{color:RGBA(var(--pa-emphasis-color-rgb), var(--pa-link-opacity, 0.75)) !important;text-decoration-color:RGBA(var(--pa-emphasis-color-rgb), var(--pa-link-underline-opacity, 0.75)) !important}.focus-ring:focus{outline:0;box-shadow:var(--pa-focus-ring-x, 0) var(--pa-focus-ring-y, 0) var(--pa-focus-ring-blur, 0) var(--pa-focus-ring-width) var(--pa-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;text-decoration-color:rgba(var(--pa-link-color-rgb), var(--pa-link-opacity, 0.5));text-underline-offset:.25em;backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media(prefers-reduced-motion: reduce){.icon-link>.bi{transition:none}}.icon-link-hover:hover>.bi,.icon-link-hover:focus-visible>.bi{transform:var(--pa-icon-link-transform, translate3d(0.25em, 0, 0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--pa-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--pa-aspect-ratio: 100%}.ratio-4x3{--pa-aspect-ratio: 75%}.ratio-16x9{--pa-aspect-ratio: 56.25%}.ratio-21x9{--pa-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:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media(min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{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){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}.visually-hidden:not(caption),.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption){position:absolute !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:var(--pa-border-width);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}.object-fit-contain{object-fit:contain !important}.object-fit-cover{object-fit:cover !important}.object-fit-fill{object-fit:fill !important}.object-fit-scale{object-fit:scale-down !important}.object-fit-none{object-fit: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}.overflow-x-auto{overflow-x:auto !important}.overflow-x-hidden{overflow-x:hidden !important}.overflow-x-visible{overflow-x:visible !important}.overflow-x-scroll{overflow-x:scroll !important}.overflow-y-auto{overflow-y:auto !important}.overflow-y-hidden{overflow-y:hidden !important}.overflow-y-visible{overflow-y:visible !important}.overflow-y-scroll{overflow-y: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-inline-grid{display:inline-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:var(--pa-box-shadow) !important}.shadow-sm{box-shadow:var(--pa-box-shadow-sm) !important}.shadow-lg{box-shadow:var(--pa-box-shadow-lg) !important}.shadow-none{box-shadow:none !important}.focus-ring-primary{--pa-focus-ring-color: rgba(var(--pa-primary-rgb), var(--pa-focus-ring-opacity))}.focus-ring-secondary{--pa-focus-ring-color: rgba(var(--pa-secondary-rgb), var(--pa-focus-ring-opacity))}.focus-ring-success{--pa-focus-ring-color: rgba(var(--pa-success-rgb), var(--pa-focus-ring-opacity))}.focus-ring-info{--pa-focus-ring-color: rgba(var(--pa-info-rgb), var(--pa-focus-ring-opacity))}.focus-ring-warning{--pa-focus-ring-color: rgba(var(--pa-warning-rgb), var(--pa-focus-ring-opacity))}.focus-ring-danger{--pa-focus-ring-color: rgba(var(--pa-danger-rgb), var(--pa-focus-ring-opacity))}.focus-ring-light{--pa-focus-ring-color: rgba(var(--pa-light-rgb), var(--pa-focus-ring-opacity))}.focus-ring-dark{--pa-focus-ring-color: rgba(var(--pa-dark-rgb), var(--pa-focus-ring-opacity))}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{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(--pa-border-width) var(--pa-border-style) var(--pa-border-color) !important}.border-0{border:0 !important}.border-top{border-top:var(--pa-border-width) var(--pa-border-style) var(--pa-border-color) !important}.border-top-0{border-top:0 !important}.border-end{border-right:var(--pa-border-width) var(--pa-border-style) var(--pa-border-color) !important}.border-end-0{border-right:0 !important}.border-bottom{border-bottom:var(--pa-border-width) var(--pa-border-style) var(--pa-border-color) !important}.border-bottom-0{border-bottom:0 !important}.border-start{border-left:var(--pa-border-width) var(--pa-border-style) var(--pa-border-color) !important}.border-start-0{border-left:0 !important}.border-primary{--pa-border-opacity: 1;border-color:rgba(var(--pa-primary-rgb), var(--pa-border-opacity)) !important}.border-secondary{--pa-border-opacity: 1;border-color:rgba(var(--pa-secondary-rgb), var(--pa-border-opacity)) !important}.border-success{--pa-border-opacity: 1;border-color:rgba(var(--pa-success-rgb), var(--pa-border-opacity)) !important}.border-info{--pa-border-opacity: 1;border-color:rgba(var(--pa-info-rgb), var(--pa-border-opacity)) !important}.border-warning{--pa-border-opacity: 1;border-color:rgba(var(--pa-warning-rgb), var(--pa-border-opacity)) !important}.border-danger{--pa-border-opacity: 1;border-color:rgba(var(--pa-danger-rgb), var(--pa-border-opacity)) !important}.border-light{--pa-border-opacity: 1;border-color:rgba(var(--pa-light-rgb), var(--pa-border-opacity)) !important}.border-dark{--pa-border-opacity: 1;border-color:rgba(var(--pa-dark-rgb), var(--pa-border-opacity)) !important}.border-black{--pa-border-opacity: 1;border-color:rgba(var(--pa-black-rgb), var(--pa-border-opacity)) !important}.border-white{--pa-border-opacity: 1;border-color:rgba(var(--pa-white-rgb), var(--pa-border-opacity)) !important}.border-primary-subtle{border-color:var(--pa-primary-border-subtle) !important}.border-secondary-subtle{border-color:var(--pa-secondary-border-subtle) !important}.border-success-subtle{border-color:var(--pa-success-border-subtle) !important}.border-info-subtle{border-color:var(--pa-info-border-subtle) !important}.border-warning-subtle{border-color:var(--pa-warning-border-subtle) !important}.border-danger-subtle{border-color:var(--pa-danger-border-subtle) !important}.border-light-subtle{border-color:var(--pa-light-border-subtle) !important}.border-dark-subtle{border-color:var(--pa-dark-border-subtle) !important}.border-1{border-width:1px !important}.border-2{border-width:2px !important}.border-3{border-width:3px !important}.border-4{border-width:4px !important}.border-5{border-width:5px !important}.border-opacity-10{--pa-border-opacity: 0.1}.border-opacity-25{--pa-border-opacity: 0.25}.border-opacity-50{--pa-border-opacity: 0.5}.border-opacity-75{--pa-border-opacity: 0.75}.border-opacity-100{--pa-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}.row-gap-0{row-gap:0 !important}.row-gap-1{row-gap:.25rem !important}.row-gap-2{row-gap:.5rem !important}.row-gap-3{row-gap:1rem !important}.row-gap-4{row-gap:1.5rem !important}.row-gap-5{row-gap:3rem !important}.column-gap-0{column-gap:0 !important}.column-gap-1{column-gap:.25rem !important}.column-gap-2{column-gap:.5rem !important}.column-gap-3{column-gap:1rem !important}.column-gap-4{column-gap:1.5rem !important}.column-gap-5{column-gap:3rem !important}.font-monospace{font-family:var(--pa-font-monospace) !important}.fs-1{font-size:calc(1.375rem + 1.5vw) !important}.fs-2{font-size:calc(1.325rem + 0.9vw) !important}.fs-3{font-size:calc(1.3rem + 0.6vw) !important}.fs-4{font-size:calc(1.275rem + 0.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-lighter{font-weight:lighter !important}.fw-light{font-weight:300 !important}.fw-normal{font-weight:400 !important}.fw-medium{font-weight:500 !important}.fw-semibold{font-weight:600 !important}.fw-bold{font-weight:700 !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{--pa-text-opacity: 1;color:rgba(var(--pa-primary-rgb), var(--pa-text-opacity)) !important}.text-secondary{--pa-text-opacity: 1;color:rgba(var(--pa-secondary-rgb), var(--pa-text-opacity)) !important}.text-success{--pa-text-opacity: 1;color:rgba(var(--pa-success-rgb), var(--pa-text-opacity)) !important}.text-info{--pa-text-opacity: 1;color:rgba(var(--pa-info-rgb), var(--pa-text-opacity)) !important}.text-warning{--pa-text-opacity: 1;color:rgba(var(--pa-warning-rgb), var(--pa-text-opacity)) !important}.text-danger{--pa-text-opacity: 1;color:rgba(var(--pa-danger-rgb), var(--pa-text-opacity)) !important}.text-light{--pa-text-opacity: 1;color:rgba(var(--pa-light-rgb), var(--pa-text-opacity)) !important}.text-dark{--pa-text-opacity: 1;color:rgba(var(--pa-dark-rgb), var(--pa-text-opacity)) !important}.text-black{--pa-text-opacity: 1;color:rgba(var(--pa-black-rgb), var(--pa-text-opacity)) !important}.text-white{--pa-text-opacity: 1;color:rgba(var(--pa-white-rgb), var(--pa-text-opacity)) !important}.text-body{--pa-text-opacity: 1;color:rgba(var(--pa-body-color-rgb), var(--pa-text-opacity)) !important}.text-muted{--pa-text-opacity: 1;color:var(--pa-secondary-color) !important}.text-black-50{--pa-text-opacity: 1;color:rgba(0,0,0,.5) !important}.text-white-50{--pa-text-opacity: 1;color:rgba(255,255,255,.5) !important}.text-body-secondary{--pa-text-opacity: 1;color:var(--pa-secondary-color) !important}.text-body-tertiary{--pa-text-opacity: 1;color:var(--pa-tertiary-color) !important}.text-body-emphasis{--pa-text-opacity: 1;color:var(--pa-emphasis-color) !important}.text-reset{--pa-text-opacity: 1;color:inherit !important}.text-opacity-25{--pa-text-opacity: 0.25}.text-opacity-50{--pa-text-opacity: 0.5}.text-opacity-75{--pa-text-opacity: 0.75}.text-opacity-100{--pa-text-opacity: 1}.text-primary-emphasis{color:var(--pa-primary-text-emphasis) !important}.text-secondary-emphasis{color:var(--pa-secondary-text-emphasis) !important}.text-success-emphasis{color:var(--pa-success-text-emphasis) !important}.text-info-emphasis{color:var(--pa-info-text-emphasis) !important}.text-warning-emphasis{color:var(--pa-warning-text-emphasis) !important}.text-danger-emphasis{color:var(--pa-danger-text-emphasis) !important}.text-light-emphasis{color:var(--pa-light-text-emphasis) !important}.text-dark-emphasis{color:var(--pa-dark-text-emphasis) !important}.link-opacity-10{--pa-link-opacity: 0.1}.link-opacity-10-hover:hover{--pa-link-opacity: 0.1}.link-opacity-25{--pa-link-opacity: 0.25}.link-opacity-25-hover:hover{--pa-link-opacity: 0.25}.link-opacity-50{--pa-link-opacity: 0.5}.link-opacity-50-hover:hover{--pa-link-opacity: 0.5}.link-opacity-75{--pa-link-opacity: 0.75}.link-opacity-75-hover:hover{--pa-link-opacity: 0.75}.link-opacity-100{--pa-link-opacity: 1}.link-opacity-100-hover:hover{--pa-link-opacity: 1}.link-offset-1{text-underline-offset:.125em !important}.link-offset-1-hover:hover{text-underline-offset:.125em !important}.link-offset-2{text-underline-offset:.25em !important}.link-offset-2-hover:hover{text-underline-offset:.25em !important}.link-offset-3{text-underline-offset:.375em !important}.link-offset-3-hover:hover{text-underline-offset:.375em !important}.link-underline-primary{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-primary-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-secondary{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-secondary-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-success{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-success-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-info{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-info-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-warning{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-warning-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-danger{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-danger-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-light{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-light-rgb), var(--pa-link-underline-opacity)) !important}.link-underline-dark{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-dark-rgb), var(--pa-link-underline-opacity)) !important}.link-underline{--pa-link-underline-opacity: 1;text-decoration-color:rgba(var(--pa-link-color-rgb), var(--pa-link-underline-opacity, 1)) !important}.link-underline-opacity-0{--pa-link-underline-opacity: 0}.link-underline-opacity-0-hover:hover{--pa-link-underline-opacity: 0}.link-underline-opacity-10{--pa-link-underline-opacity: 0.1}.link-underline-opacity-10-hover:hover{--pa-link-underline-opacity: 0.1}.link-underline-opacity-25{--pa-link-underline-opacity: 0.25}.link-underline-opacity-25-hover:hover{--pa-link-underline-opacity: 0.25}.link-underline-opacity-50{--pa-link-underline-opacity: 0.5}.link-underline-opacity-50-hover:hover{--pa-link-underline-opacity: 0.5}.link-underline-opacity-75{--pa-link-underline-opacity: 0.75}.link-underline-opacity-75-hover:hover{--pa-link-underline-opacity: 0.75}.link-underline-opacity-100{--pa-link-underline-opacity: 1}.link-underline-opacity-100-hover:hover{--pa-link-underline-opacity: 1}.bg-primary{--pa-bg-opacity: 1;background-color:rgba(var(--pa-primary-rgb), var(--pa-bg-opacity)) !important}.bg-secondary{--pa-bg-opacity: 1;background-color:rgba(var(--pa-secondary-rgb), var(--pa-bg-opacity)) !important}.bg-success{--pa-bg-opacity: 1;background-color:rgba(var(--pa-success-rgb), var(--pa-bg-opacity)) !important}.bg-info{--pa-bg-opacity: 1;background-color:rgba(var(--pa-info-rgb), var(--pa-bg-opacity)) !important}.bg-warning{--pa-bg-opacity: 1;background-color:rgba(var(--pa-warning-rgb), var(--pa-bg-opacity)) !important}.bg-danger{--pa-bg-opacity: 1;background-color:rgba(var(--pa-danger-rgb), var(--pa-bg-opacity)) !important}.bg-light{--pa-bg-opacity: 1;background-color:rgba(var(--pa-light-rgb), var(--pa-bg-opacity)) !important}.bg-dark{--pa-bg-opacity: 1;background-color:rgba(var(--pa-dark-rgb), var(--pa-bg-opacity)) !important}.bg-black{--pa-bg-opacity: 1;background-color:rgba(var(--pa-black-rgb), var(--pa-bg-opacity)) !important}.bg-white{--pa-bg-opacity: 1;background-color:rgba(var(--pa-white-rgb), var(--pa-bg-opacity)) !important}.bg-body{--pa-bg-opacity: 1;background-color:rgba(var(--pa-body-bg-rgb), var(--pa-bg-opacity)) !important}.bg-transparent{--pa-bg-opacity: 1;background-color:rgba(0,0,0,0) !important}.bg-body-secondary{--pa-bg-opacity: 1;background-color:rgba(var(--pa-secondary-bg-rgb), var(--pa-bg-opacity)) !important}.bg-body-tertiary{--pa-bg-opacity: 1;background-color:rgba(var(--pa-tertiary-bg-rgb), var(--pa-bg-opacity)) !important}.bg-opacity-10{--pa-bg-opacity: 0.1}.bg-opacity-25{--pa-bg-opacity: 0.25}.bg-opacity-50{--pa-bg-opacity: 0.5}.bg-opacity-75{--pa-bg-opacity: 0.75}.bg-opacity-100{--pa-bg-opacity: 1}.bg-primary-subtle{background-color:var(--pa-primary-bg-subtle) !important}.bg-secondary-subtle{background-color:var(--pa-secondary-bg-subtle) !important}.bg-success-subtle{background-color:var(--pa-success-bg-subtle) !important}.bg-info-subtle{background-color:var(--pa-info-bg-subtle) !important}.bg-warning-subtle{background-color:var(--pa-warning-bg-subtle) !important}.bg-danger-subtle{background-color:var(--pa-danger-bg-subtle) !important}.bg-light-subtle{background-color:var(--pa-light-bg-subtle) !important}.bg-dark-subtle{background-color:var(--pa-dark-bg-subtle) !important}.bg-gradient{background-image:var(--pa-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:var(--pa-border-radius) !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:var(--pa-border-radius-sm) !important}.rounded-2{border-radius:var(--pa-border-radius) !important}.rounded-3{border-radius:var(--pa-border-radius-lg) !important}.rounded-4{border-radius:var(--pa-border-radius-xl) !important}.rounded-5{border-radius:var(--pa-border-radius-xxl) !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:var(--pa-border-radius-pill) !important}.rounded-top{border-top-left-radius:var(--pa-border-radius) !important;border-top-right-radius:var(--pa-border-radius) !important}.rounded-top-0{border-top-left-radius:0 !important;border-top-right-radius:0 !important}.rounded-top-1{border-top-left-radius:var(--pa-border-radius-sm) !important;border-top-right-radius:var(--pa-border-radius-sm) !important}.rounded-top-2{border-top-left-radius:var(--pa-border-radius) !important;border-top-right-radius:var(--pa-border-radius) !important}.rounded-top-3{border-top-left-radius:var(--pa-border-radius-lg) !important;border-top-right-radius:var(--pa-border-radius-lg) !important}.rounded-top-4{border-top-left-radius:var(--pa-border-radius-xl) !important;border-top-right-radius:var(--pa-border-radius-xl) !important}.rounded-top-5{border-top-left-radius:var(--pa-border-radius-xxl) !important;border-top-right-radius:var(--pa-border-radius-xxl) !important}.rounded-top-circle{border-top-left-radius:50% !important;border-top-right-radius:50% !important}.rounded-top-pill{border-top-left-radius:var(--pa-border-radius-pill) !important;border-top-right-radius:var(--pa-border-radius-pill) !important}.rounded-end{border-top-right-radius:var(--pa-border-radius) !important;border-bottom-right-radius:var(--pa-border-radius) !important}.rounded-end-0{border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.rounded-end-1{border-top-right-radius:var(--pa-border-radius-sm) !important;border-bottom-right-radius:var(--pa-border-radius-sm) !important}.rounded-end-2{border-top-right-radius:var(--pa-border-radius) !important;border-bottom-right-radius:var(--pa-border-radius) !important}.rounded-end-3{border-top-right-radius:var(--pa-border-radius-lg) !important;border-bottom-right-radius:var(--pa-border-radius-lg) !important}.rounded-end-4{border-top-right-radius:var(--pa-border-radius-xl) !important;border-bottom-right-radius:var(--pa-border-radius-xl) !important}.rounded-end-5{border-top-right-radius:var(--pa-border-radius-xxl) !important;border-bottom-right-radius:var(--pa-border-radius-xxl) !important}.rounded-end-circle{border-top-right-radius:50% !important;border-bottom-right-radius:50% !important}.rounded-end-pill{border-top-right-radius:var(--pa-border-radius-pill) !important;border-bottom-right-radius:var(--pa-border-radius-pill) !important}.rounded-bottom{border-bottom-right-radius:var(--pa-border-radius) !important;border-bottom-left-radius:var(--pa-border-radius) !important}.rounded-bottom-0{border-bottom-right-radius:0 !important;border-bottom-left-radius:0 !important}.rounded-bottom-1{border-bottom-right-radius:var(--pa-border-radius-sm) !important;border-bottom-left-radius:var(--pa-border-radius-sm) !important}.rounded-bottom-2{border-bottom-right-radius:var(--pa-border-radius) !important;border-bottom-left-radius:var(--pa-border-radius) !important}.rounded-bottom-3{border-bottom-right-radius:var(--pa-border-radius-lg) !important;border-bottom-left-radius:var(--pa-border-radius-lg) !important}.rounded-bottom-4{border-bottom-right-radius:var(--pa-border-radius-xl) !important;border-bottom-left-radius:var(--pa-border-radius-xl) !important}.rounded-bottom-5{border-bottom-right-radius:var(--pa-border-radius-xxl) !important;border-bottom-left-radius:var(--pa-border-radius-xxl) !important}.rounded-bottom-circle{border-bottom-right-radius:50% !important;border-bottom-left-radius:50% !important}.rounded-bottom-pill{border-bottom-right-radius:var(--pa-border-radius-pill) !important;border-bottom-left-radius:var(--pa-border-radius-pill) !important}.rounded-start{border-bottom-left-radius:var(--pa-border-radius) !important;border-top-left-radius:var(--pa-border-radius) !important}.rounded-start-0{border-bottom-left-radius:0 !important;border-top-left-radius:0 !important}.rounded-start-1{border-bottom-left-radius:var(--pa-border-radius-sm) !important;border-top-left-radius:var(--pa-border-radius-sm) !important}.rounded-start-2{border-bottom-left-radius:var(--pa-border-radius) !important;border-top-left-radius:var(--pa-border-radius) !important}.rounded-start-3{border-bottom-left-radius:var(--pa-border-radius-lg) !important;border-top-left-radius:var(--pa-border-radius-lg) !important}.rounded-start-4{border-bottom-left-radius:var(--pa-border-radius-xl) !important;border-top-left-radius:var(--pa-border-radius-xl) !important}.rounded-start-5{border-bottom-left-radius:var(--pa-border-radius-xxl) !important;border-top-left-radius:var(--pa-border-radius-xxl) !important}.rounded-start-circle{border-bottom-left-radius:50% !important;border-top-left-radius:50% !important}.rounded-start-pill{border-bottom-left-radius:var(--pa-border-radius-pill) !important;border-top-left-radius:var(--pa-border-radius-pill) !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}.z-n1{z-index:-1 !important}.z-0{z-index:0 !important}.z-1{z-index:1 !important}.z-2{z-index:2 !important}.z-3{z-index:3 !important}@media(min-width: 576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float:none !important}.object-fit-sm-contain{object-fit:contain !important}.object-fit-sm-cover{object-fit:cover !important}.object-fit-sm-fill{object-fit:fill !important}.object-fit-sm-scale{object-fit:scale-down !important}.object-fit-sm-none{object-fit: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-inline-grid{display:inline-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}.row-gap-sm-0{row-gap:0 !important}.row-gap-sm-1{row-gap:.25rem !important}.row-gap-sm-2{row-gap:.5rem !important}.row-gap-sm-3{row-gap:1rem !important}.row-gap-sm-4{row-gap:1.5rem !important}.row-gap-sm-5{row-gap:3rem !important}.column-gap-sm-0{column-gap:0 !important}.column-gap-sm-1{column-gap:.25rem !important}.column-gap-sm-2{column-gap:.5rem !important}.column-gap-sm-3{column-gap:1rem !important}.column-gap-sm-4{column-gap:1.5rem !important}.column-gap-sm-5{column-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}.object-fit-md-contain{object-fit:contain !important}.object-fit-md-cover{object-fit:cover !important}.object-fit-md-fill{object-fit:fill !important}.object-fit-md-scale{object-fit:scale-down !important}.object-fit-md-none{object-fit: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-inline-grid{display:inline-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}.row-gap-md-0{row-gap:0 !important}.row-gap-md-1{row-gap:.25rem !important}.row-gap-md-2{row-gap:.5rem !important}.row-gap-md-3{row-gap:1rem !important}.row-gap-md-4{row-gap:1.5rem !important}.row-gap-md-5{row-gap:3rem !important}.column-gap-md-0{column-gap:0 !important}.column-gap-md-1{column-gap:.25rem !important}.column-gap-md-2{column-gap:.5rem !important}.column-gap-md-3{column-gap:1rem !important}.column-gap-md-4{column-gap:1.5rem !important}.column-gap-md-5{column-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}.object-fit-lg-contain{object-fit:contain !important}.object-fit-lg-cover{object-fit:cover !important}.object-fit-lg-fill{object-fit:fill !important}.object-fit-lg-scale{object-fit:scale-down !important}.object-fit-lg-none{object-fit: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-inline-grid{display:inline-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}.row-gap-lg-0{row-gap:0 !important}.row-gap-lg-1{row-gap:.25rem !important}.row-gap-lg-2{row-gap:.5rem !important}.row-gap-lg-3{row-gap:1rem !important}.row-gap-lg-4{row-gap:1.5rem !important}.row-gap-lg-5{row-gap:3rem !important}.column-gap-lg-0{column-gap:0 !important}.column-gap-lg-1{column-gap:.25rem !important}.column-gap-lg-2{column-gap:.5rem !important}.column-gap-lg-3{column-gap:1rem !important}.column-gap-lg-4{column-gap:1.5rem !important}.column-gap-lg-5{column-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}.object-fit-xl-contain{object-fit:contain !important}.object-fit-xl-cover{object-fit:cover !important}.object-fit-xl-fill{object-fit:fill !important}.object-fit-xl-scale{object-fit:scale-down !important}.object-fit-xl-none{object-fit: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-inline-grid{display:inline-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}.row-gap-xl-0{row-gap:0 !important}.row-gap-xl-1{row-gap:.25rem !important}.row-gap-xl-2{row-gap:.5rem !important}.row-gap-xl-3{row-gap:1rem !important}.row-gap-xl-4{row-gap:1.5rem !important}.row-gap-xl-5{row-gap:3rem !important}.column-gap-xl-0{column-gap:0 !important}.column-gap-xl-1{column-gap:.25rem !important}.column-gap-xl-2{column-gap:.5rem !important}.column-gap-xl-3{column-gap:1rem !important}.column-gap-xl-4{column-gap:1.5rem !important}.column-gap-xl-5{column-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}.object-fit-xxl-contain{object-fit:contain !important}.object-fit-xxl-cover{object-fit:cover !important}.object-fit-xxl-fill{object-fit:fill !important}.object-fit-xxl-scale{object-fit:scale-down !important}.object-fit-xxl-none{object-fit: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-inline-grid{display:inline-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}.row-gap-xxl-0{row-gap:0 !important}.row-gap-xxl-1{row-gap:.25rem !important}.row-gap-xxl-2{row-gap:.5rem !important}.row-gap-xxl-3{row-gap:1rem !important}.row-gap-xxl-4{row-gap:1.5rem !important}.row-gap-xxl-5{row-gap:3rem !important}.column-gap-xxl-0{column-gap:0 !important}.column-gap-xxl-1{column-gap:.25rem !important}.column-gap-xxl-2{column-gap:.5rem !important}.column-gap-xxl-3{column-gap:1rem !important}.column-gap-xxl-4{column-gap:1.5rem !important}.column-gap-xxl-5{column-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-inline-grid{display:inline-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}}body{font-family:"Open Sans",sans-serif;font-weight:400;color:var(--text-color);background-color:var(--bg-color);max-width:1200px;margin:0 auto}.btn-primary{color:var(--text-color-reverse);background-color:var(--primary-color);border-color:var(--primary-color)}.btn-outline-primary{color:var(--primary-color);background:none;border-color:var(--primary-color)}.btn-outline-primary:hover{background-color:var(--primary-color);color:var(--text-color-reverse)}.btn-secondary{color:#fff;background-color:var(--secondary-color);border-color:var(--secondary-color)}.navbar .nav-top{height:86px}.navbar .fixed-menu{width:220px}.navbar .logo img{width:200px}a{text-decoration:underline;color:var(--link-color)}a:hover{color:var(--link-hover-color)}a:active{color:var(--link-color)}h1,.h1,h2,.h2{font-weight:500;line-height:1.25;padding-bottom:12px;padding-top:14px}h1,.h1{font-weight:600}h3,.h3{padding-top:16px}.motto .title{font-weight:600;font-size:32px;padding-top:36px}.motto .motto{font-weight:500;font-size:20px}.btn-fixed{border-width:2px;border-style:solid;width:220px;height:46px;text-transform:uppercase;font-weight:700;border-radius:5px 5px 5px 5px;vertical-align:middle;line-height:42px;padding:0;margin:16px;box-shadow:0 .125rem .25rem rgba(0,0,0,.075)}.pactus-video video{max-width:100%;width:100%;margin-left:auto;margin-right:auto;display:block}.highlighter-rouge .highlight pre{background-color:#0d1117;padding:32px 12px 12px 12px;color:#ccc;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:#0d1117 !important}.nav-tabs .nav-link{border-width:0 !important}.nav-tabs .nav-link:not(.active):hover{color:#fff !important;background-color:gray !important}.nav-tabs .active{color:#fff !important;background-color:#0d1117 !important}table thead tr th{font-weight:700;background-color:var(--bg-color) !important}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:var(--primary-color);color:var(--text-color-reverse)}.footer .section{font-size:1.75rem;font-weight:500;line-height:1.25;padding-bottom:20px}.footer li{padding-bottom:8px}.footer.anchor a{color:var(--text-color-reverse)}.footer.anchor a:link{color:var(--text-color-reverse);background-color:rgba(0,0,0,0);text-decoration:none}.footer.anchor a:hover{color:var(--text-color-reverse)}.footer .legal{color:var(--text-color-reverse);font-size:12px}.community img{margin:4px}.community_ran img{margin:4px}#btn-back-to-top{background-color:var(--primary-color);color:var(--bg-color);position:fixed;bottom:20px;right:20px;display:none}.edit-bar{padding-top:30px}.edit-bar .edit-btn,.edit-bar .edit-btn>a:hover{color:var(--text-color);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}:root{--primary-color-light: #021a34;--secondary-color-light: #075f94;--bg-color-light: #edeef0;--bg-color-reverse-light: #021a34;--bg-color-tinted-light: #b0b2b4;--text-color-light: #4c4c4c;--text-color-reverse-light: #edeef0;--text-muted-color-light: #4c4c4c;--link-color-light: #4c4c4c;--link-hover-color-light: #6c6c6c;--primary-color-dark: #edeef0;--secondary-color-dark: #075f94;--bg-color-dark: #14171c;--bg-color-reverse-dark: #edeef0;--bg-color-tinted-dark: #627191;--text-color-dark: #edeef0;--text-color-reverse-dark: #14171c;--text-muted-color-dark: #edeef0;--link-color-dark: #edeef0;--link-hover-color-dark: #ffffff}[data-bs-theme=light]{--primary-color: var(--primary-color-light);--secondary-color: var(--secondary-color-light);--bg-color-tinted: var(--bg-color-tinted-light);--bg-color: var(--bg-color-light);--bg-color-reverse: var(--bg-color-reverse-light);--text-color: var(--text-color-light);--text-color-reverse: var(--text-color-reverse-light);--text-muted-color: var(--text-muted-color-light);--link-color: var(--link-color-light);--link-hover-color: var(--link-hover-color-light)}[data-bs-theme=dark]{--primary-color: var(--primary-color-dark);--secondary-color: var(--secondary-color-dark);--bg-color: var(--bg-color-dark);--bg-color-reverse: var(--bg-color-reverse-dark);--bg-color-tinted: var(--bg-color-tinted-dark);--text-color: var(--text-color-dark);--text-color-reverse: var(--text-color-reverse-dark);--text-muted-color: var(--text-muted-color-dark);--link-color: var(--link-color-dark);--link-hover-color: var(--link-hover-color-dark)}.faq h3,.faq .h3{margin-top:20px;padding-top:16px;border-top:1px solid var(--primary-color)}.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}.faq .read_more{padding-top:12px}:root{--primary-color-light: #021a34;--secondary-color-light: #075f94;--bg-color-light: #edeef0;--bg-color-reverse-light: #021a34;--bg-color-tinted-light: #b0b2b4;--text-color-light: #4c4c4c;--text-color-reverse-light: #edeef0;--text-muted-color-light: #4c4c4c;--link-color-light: #4c4c4c;--link-hover-color-light: #6c6c6c;--primary-color-dark: #edeef0;--secondary-color-dark: #075f94;--bg-color-dark: #14171c;--bg-color-reverse-dark: #edeef0;--bg-color-tinted-dark: #627191;--text-color-dark: #edeef0;--text-color-reverse-dark: #14171c;--text-muted-color-dark: #edeef0;--link-color-dark: #edeef0;--link-hover-color-dark: #ffffff}[data-bs-theme=light]{--primary-color: var(--primary-color-light);--secondary-color: var(--secondary-color-light);--bg-color-tinted: var(--bg-color-tinted-light);--bg-color: var(--bg-color-light);--bg-color-reverse: var(--bg-color-reverse-light);--text-color: var(--text-color-light);--text-color-reverse: var(--text-color-reverse-light);--text-muted-color: var(--text-muted-color-light);--link-color: var(--link-color-light);--link-hover-color: var(--link-hover-color-light)}[data-bs-theme=dark]{--primary-color: var(--primary-color-dark);--secondary-color: var(--secondary-color-dark);--bg-color: var(--bg-color-dark);--bg-color-reverse: var(--bg-color-reverse-dark);--bg-color-tinted: var(--bg-color-tinted-dark);--text-color: var(--text-color-dark);--text-color-reverse: var(--text-color-reverse-dark);--text-muted-color: var(--text-muted-color-dark);--link-color: var(--link-color-dark);--link-hover-color: var(--link-hover-color-dark)}.toc .btn,.toc a{color:var(--text-color)}.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:var(--bg-color)}.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:var(--bg-color)}.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;width:50%}.timeline-card .card{border:1px solid rgba(0,0,0,.175);border-radius:5px;background-color:#eee;color:#4c4c4c}.timeline-card .card a{color:#4c4c4c}.timeline-card .card .text-muted{color:#898b8d !important}.timeline-card .card-title{padding-bottom:12px;font-size:1.1rem;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-color:#eee;box-sizing:border-box;transform:rotate(45deg) translate(-50%);top:34px;z-index:0;right:33px;border-right:1px solid rgba(0,0,0,.175);border-top:1px solid rgba(0,0,0,.175)}.timeline-card.right::before{content:"";position:absolute;height:20px;width:20px;background-color:#eee !important;box-sizing:border-box;transform:rotate(45deg) translate(-50%);top:33px;z-index:0;left:48px;border-left:1px solid rgba(0,0,0,.175);border-bottom: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:77px !important}.timeline-card.left::after,.timeline-card.right::after{left:8px !important}.timeline-card.left::before{border-right:none;border-top:none;border-left:1px solid rgba(0,0,0,.175);border-bottom:1px solid rgba(0,0,0,.175)}.timeline-card.right::before{right:auto}.timeline-card.right{left:0%}}:root{--primary-color-light: #021a34;--secondary-color-light: #075f94;--bg-color-light: #edeef0;--bg-color-reverse-light: #021a34;--bg-color-tinted-light: #b0b2b4;--text-color-light: #4c4c4c;--text-color-reverse-light: #edeef0;--text-muted-color-light: #4c4c4c;--link-color-light: #4c4c4c;--link-hover-color-light: #6c6c6c;--primary-color-dark: #edeef0;--secondary-color-dark: #075f94;--bg-color-dark: #14171c;--bg-color-reverse-dark: #edeef0;--bg-color-tinted-dark: #627191;--text-color-dark: #edeef0;--text-color-reverse-dark: #14171c;--text-muted-color-dark: #edeef0;--link-color-dark: #edeef0;--link-hover-color-dark: #ffffff}[data-bs-theme=light]{--primary-color: var(--primary-color-light);--secondary-color: var(--secondary-color-light);--bg-color-tinted: var(--bg-color-tinted-light);--bg-color: var(--bg-color-light);--bg-color-reverse: var(--bg-color-reverse-light);--text-color: var(--text-color-light);--text-color-reverse: var(--text-color-reverse-light);--text-muted-color: var(--text-muted-color-light);--link-color: var(--link-color-light);--link-hover-color: var(--link-hover-color-light)}[data-bs-theme=dark]{--primary-color: var(--primary-color-dark);--secondary-color: var(--secondary-color-dark);--bg-color: var(--bg-color-dark);--bg-color-reverse: var(--bg-color-reverse-dark);--bg-color-tinted: var(--bg-color-tinted-dark);--text-color: var(--text-color-dark);--text-color-reverse: var(--text-color-reverse-dark);--text-muted-color: var(--text-muted-color-dark);--link-color: var(--link-color-dark);--link-hover-color: var(--link-hover-color-dark)}.learn h2,.learn .h2{border-top:1px solid var(--primary-color)}[data-bs-theme=dark] blockquote{background:#14171c}[data-bs-theme=dark] .toc .btn-section::before{--svg-color: var(--text)}[data-bs-theme=dark] .fa-linux{color:#fff}/*# 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..a7da8066e --- /dev/null +++ b/zh/assets/css/custom.css.map @@ -0,0 +1 @@ +{"version":3,"sourceRoot":"","sources":["../../_sass/_vars.scss","../../../node_modules/bootstrap/scss/_root.scss","../../../node_modules/bootstrap/scss/vendor/_rfs.scss","../../../node_modules/bootstrap/scss/mixins/_color-mode.scss","../../../node_modules/bootstrap/scss/_reboot.scss","../../../node_modules/bootstrap/scss/_variables.scss","../../../node_modules/bootstrap/scss/mixins/_border-radius.scss","../../../node_modules/bootstrap/scss/_type.scss","../../../node_modules/bootstrap/scss/mixins/_lists.scss","../../../node_modules/bootstrap/scss/_images.scss","../../../node_modules/bootstrap/scss/mixins/_image.scss","../../../node_modules/bootstrap/scss/mixins/_box-shadow.scss","../../../node_modules/bootstrap/scss/_containers.scss","../../../node_modules/bootstrap/scss/mixins/_container.scss","../../../node_modules/bootstrap/scss/mixins/_breakpoints.scss","../../../node_modules/bootstrap/scss/_grid.scss","../../../node_modules/bootstrap/scss/mixins/_grid.scss","../../../node_modules/bootstrap/scss/_tables.scss","../../../node_modules/bootstrap/scss/mixins/_table-variants.scss","../../../node_modules/bootstrap/scss/_buttons.scss","../../../node_modules/bootstrap/scss/mixins/_gradients.scss","../../../node_modules/bootstrap/scss/mixins/_transition.scss","../../../node_modules/bootstrap/scss/mixins/_buttons.scss","../../../node_modules/bootstrap/scss/_transitions.scss","../../../node_modules/bootstrap/scss/_dropdown.scss","../../../node_modules/bootstrap/scss/mixins/_caret.scss","../../../node_modules/bootstrap/scss/_nav.scss","../../../node_modules/bootstrap/scss/_navbar.scss","../../../node_modules/bootstrap/scss/_badge.scss","../../../node_modules/bootstrap/scss/_alert.scss","../../../node_modules/bootstrap/scss/mixins/_clearfix.scss","../../../node_modules/bootstrap/scss/helpers/_color-bg.scss","../../../node_modules/bootstrap/scss/helpers/_colored-links.scss","../../../node_modules/bootstrap/scss/helpers/_focus-ring.scss","../../../node_modules/bootstrap/scss/helpers/_icon-link.scss","../../../node_modules/bootstrap/scss/helpers/_ratio.scss","../../../node_modules/bootstrap/scss/helpers/_position.scss","../../../node_modules/bootstrap/scss/helpers/_stacks.scss","../../../node_modules/bootstrap/scss/helpers/_visually-hidden.scss","../../../node_modules/bootstrap/scss/mixins/_visually-hidden.scss","../../../node_modules/bootstrap/scss/helpers/_stretched-link.scss","../../../node_modules/bootstrap/scss/helpers/_text-truncation.scss","../../../node_modules/bootstrap/scss/mixins/_text-truncate.scss","../../../node_modules/bootstrap/scss/helpers/_vr.scss","../../../node_modules/bootstrap/scss/mixins/_utilities.scss","../../../node_modules/bootstrap/scss/utilities/_api.scss","../../_sass/_styles.scss","../../_sass/_hexdump.scss","../../_sass/_faq.scss","../../_sass/_toc.scss","../../_sass/_roadmap.scss","../../_sass/_learn.scss","../../_sass/dark_mode.scss"],"names":[],"mappings":"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,WLuQM,gBKvQN,WLgQM,iCK5PJ,YFynBkB,IExnBlB,YFwmB0B,IHzgB1B,0BKpGF,WLuQM,kBKvQN,WLgQM,iCK5PJ,YFynBkB,IExnBlB,YFwmB0B,IHzgB1B,0BKpGF,WLuQM,gBKvQN,WLgQM,iCK5PJ,YFynBkB,IExnBlB,YFwmB0B,IHzgB1B,0BKpGF,WLuQM,kBKvQN,WLgQM,iCK5PJ,YFynBkB,IExnBlB,YFwmB0B,IHzgB1B,0BKpGF,WLuQM,gBKvQN,WLgQM,iCK5PJ,YFynBkB,IExnBlB,YFwmB0B,IHzgB1B,0BKpGF,WLuQM,kBK/OR,eCvDE,eACA,gBD2DF,aC5DE,eACA,gBD8DF,kBACE,qBAEA,mCACE,aFsoB0B,ME5nB9B,YL8MM,UALI,QKvMR,yBAIF,YACE,cFiUO,KH1HH,UALI,QK/LR,wBACE,gBAIJ,mBACE,iBACA,cFuTO,KH1HH,UALI,QKtLR,MFtFS,QEwFT,2BACE,aEhGJ,WCIE,eAGA,YDDF,eACE,QJ6jDkC,OI5jDlC,iBJ6jDkC,kBI5jDlC,2DHGE,sCKLE,WARW,wBDKf,eAGA,YDcF,QAEE,qBAGF,YACE,oBACA,cAGF,gBPyPM,UALI,QOlPR,MJgjDkC,0BOllDlC,mGCHA,sBACA,iBACA,WACA,0CACA,yCACA,kBACA,iBCsDE,yBF5CE,yBACE,UPkee,OSvbnB,yBF5CE,uCACE,UPkee,OSvbnB,yBF5CE,qDACE,UPkee,OSvbnB,0BF5CE,mEACE,UPkee,QSvbnB,0BF5CE,kFACE,UPkee,QUlfvB,MAEI,2JAKF,KCNA,sBACA,iBACA,aACA,eAEA,uCACA,2CACA,0CDEE,OCOF,cACA,WACA,eACA,0CACA,yCACA,8BA+CI,KACE,YAGF,iBApCJ,cACA,WAcA,cACE,cACA,WAFF,cACE,cACA,UAFF,cACE,cACA,mBAFF,cACE,cACA,UAFF,cACE,cACA,UAFF,cACE,cACA,mBA+BE,UAhDJ,cACA,WAqDQ,OAhEN,cACA,kBA+DM,OAhEN,cACA,mBA+DM,OAhEN,cACA,UA+DM,OAhEN,cACA,mBA+DM,OAhEN,cACA,mBA+DM,OAhEN,cACA,UA+DM,OAhEN,cACA,mBA+DM,OAhEN,cACA,mBA+DM,OAhEN,cACA,UA+DM,QAhEN,cACA,mBA+DM,QAhEN,cACA,mBA+DM,QAhEN,cACA,WAuEQ,UAxDV,wBAwDU,UAxDV,yBAwDU,UAxDV,gBAwDU,UAxDV,yBAwDU,UAxDV,yBAwDU,UAxDV,gBAwDU,UAxDV,yBAwDU,UAxDV,yBAwDU,UAxDV,gBAwDU,WAxDV,yBAwDU,WAxDV,yBAmEM,WAEE,iBAGF,WAEE,iBAPF,WAEE,uBAGF,WAEE,uBAPF,WAEE,sBAGF,WAEE,sBAPF,WAEE,oBAGF,WAEE,oBAPF,WAEE,sBAGF,WAEE,sBAPF,WAEE,oBAGF,WAEE,oBF1DN,yBEUE,QACE,YAGF,oBApCJ,cACA,WAcA,iBACE,cACA,WAFF,iBACE,cACA,UAFF,iBACE,cACA,mBAFF,iBACE,cACA,UAFF,iBACE,cACA,UAFF,iBACE,cACA,mBA+BE,aAhDJ,cACA,WAqDQ,UAhEN,cACA,kBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,WAuEQ,aAxDV,cAwDU,aAxDV,wBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,cAxDV,yBAwDU,cAxDV,yBAmEM,iBAEE,iBAGF,iBAEE,iBAPF,iBAEE,uBAGF,iBAEE,uBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,oBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,qBF1DN,yBEUE,QACE,YAGF,oBApCJ,cACA,WAcA,iBACE,cACA,WAFF,iBACE,cACA,UAFF,iBACE,cACA,mBAFF,iBACE,cACA,UAFF,iBACE,cACA,UAFF,iBACE,cACA,mBA+BE,aAhDJ,cACA,WAqDQ,UAhEN,cACA,kBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,WAuEQ,aAxDV,cAwDU,aAxDV,wBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,cAxDV,yBAwDU,cAxDV,yBAmEM,iBAEE,iBAGF,iBAEE,iBAPF,iBAEE,uBAGF,iBAEE,uBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,oBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,qBF1DN,yBEUE,QACE,YAGF,oBApCJ,cACA,WAcA,iBACE,cACA,WAFF,iBACE,cACA,UAFF,iBACE,cACA,mBAFF,iBACE,cACA,UAFF,iBACE,cACA,UAFF,iBACE,cACA,mBA+BE,aAhDJ,cACA,WAqDQ,UAhEN,cACA,kBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,WAuEQ,aAxDV,cAwDU,aAxDV,wBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,cAxDV,yBAwDU,cAxDV,yBAmEM,iBAEE,iBAGF,iBAEE,iBAPF,iBAEE,uBAGF,iBAEE,uBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,oBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,qBF1DN,0BEUE,QACE,YAGF,oBApCJ,cACA,WAcA,iBACE,cACA,WAFF,iBACE,cACA,UAFF,iBACE,cACA,mBAFF,iBACE,cACA,UAFF,iBACE,cACA,UAFF,iBACE,cACA,mBA+BE,aAhDJ,cACA,WAqDQ,UAhEN,cACA,kBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,WAuEQ,aAxDV,cAwDU,aAxDV,wBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,cAxDV,yBAwDU,cAxDV,yBAmEM,iBAEE,iBAGF,iBAEE,iBAPF,iBAEE,uBAGF,iBAEE,uBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,oBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,qBF1DN,0BEUE,SACE,YAGF,qBApCJ,cACA,WAcA,kBACE,cACA,WAFF,kBACE,cACA,UAFF,kBACE,cACA,mBAFF,kBACE,cACA,UAFF,kBACE,cACA,UAFF,kBACE,cACA,mBA+BE,cAhDJ,cACA,WAqDQ,WAhEN,cACA,kBA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,UA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,UA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,UA+DM,YAhEN,cACA,mBA+DM,YAhEN,cACA,mBA+DM,YAhEN,cACA,WAuEQ,cAxDV,cAwDU,cAxDV,wBAwDU,cAxDV,yBAwDU,cAxDV,gBAwDU,cAxDV,yBAwDU,cAxDV,yBAwDU,cAxDV,gBAwDU,cAxDV,yBAwDU,cAxDV,yBAwDU,cAxDV,gBAwDU,eAxDV,yBAwDU,eAxDV,yBAmEM,mBAEE,iBAGF,mBAEE,iBAPF,mBAEE,uBAGF,mBAEE,uBAPF,mBAEE,sBAGF,mBAEE,sBAPF,mBAEE,oBAGF,mBAEE,oBAPF,mBAEE,sBAGF,mBAEE,sBAPF,mBAEE,oBAGF,mBAEE,qBCrHV,OAEE,+BACA,4BACA,gCACA,6BAEA,2CACA,iCACA,gDACA,kCACA,mDACA,gEACA,kDACA,8DACA,iDACA,+DAEA,WACA,cZkYO,KYjYP,eZusB4B,IYtsB5B,0CAOA,yBACE,oBAEA,qFACA,oCACA,oBZ+sB0B,uBY9sB1B,2GAGF,aACE,uBAGF,aACE,sBAIJ,qBACE,+DAOF,aACE,iBAUA,4BACE,sBAeF,gCACE,sCAGA,kCACE,sCAOJ,oCACE,sBAGF,qCACE,mBAUF,2CACE,qDACA,+CAMF,yDACE,qDACA,+CAQJ,cACE,qDACA,+CAQA,8BACE,oDACA,8CC5IF,eAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,iBAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,eAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,YAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,eAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,cAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,aAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CAlBF,YAOE,uBACA,uBACA,iCACA,+BACA,+BACA,8BACA,8BACA,6BACA,6BAEA,4BACA,0CDiJA,kBACE,gBACA,iCH3FF,4BGyFA,qBACE,gBACA,kCH3FF,4BGyFA,qBACE,gBACA,kCH3FF,4BGyFA,qBACE,gBACA,kCH3FF,6BGyFA,qBACE,gBACA,kCH3FF,6BGyFA,sBACE,gBACA,kCEnKN,KAEE,4BACA,6BACA,uBjBuRI,mBALI,KiBhRR,0BACA,0BACA,qCACA,yBACA,8CACA,mCACA,gDACA,yCACA,6FACA,gCACA,kFAGA,qBACA,wDACA,sCjBsQI,UALI,wBiB/PR,sCACA,sCACA,0BACA,kBACA,qBAEA,sBACA,eACA,iBACA,mEbjBE,0CcfF,iBDkCqB,iBRxBjB,WARW,yBUUX,WFwBJ,mHEpBI,uCFhBN,KEiBQ,iBFqBN,WACE,gCAEA,wCACA,8CAGF,sBAEE,0BACA,kCACA,wCAGF,mBACE,gCCrDF,iBDsDuB,uBACrB,8CACA,UAGE,mEAMJ,8BACE,8CACA,UAGE,mEAMJ,mGAKE,iCACA,yCAGA,+CR3EE,WARW,4BQsFb,yKAGI,sEAON,mDAGE,mCACA,oBACA,2CAEA,iDACA,uCRhGE,WARW,KQoHf,aGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,sCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,eGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,wCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,aGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,wCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,UGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,wCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,aGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,uCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,YGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,uCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,WGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,yCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHyFA,UGtGA,qBACA,qBACA,+BACA,2BACA,2BACA,qCACA,sCACA,4BACA,4BACA,sCACA,6DACA,8BACA,8BACA,wCHmHA,qBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,qCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,uBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,sCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,qBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,uCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,kBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,wCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,qBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,uCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,oBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,uCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,mBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,yCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBH0FA,kBGvGA,wBACA,+BACA,2BACA,2BACA,qCACA,sCACA,4BACA,4BACA,sCACA,6DACA,iCACA,kCACA,wCACA,oBHsGF,UACE,0BACA,qCACA,yBACA,mCACA,iDACA,yCACA,kDACA,0CACA,iCACA,4CACA,gCACA,sCAEA,gBduRwC,Uc7QxC,wBACE,0BAGF,gBACE,gCAWJ,QGxIE,2BACA,yBpB8NI,mBALI,QoBvNR,mDHyIF,QG5IE,4BACA,2BpB8NI,mBALI,SoBvNR,mDCnEF,MFgBM,WEfJ,oBFmBI,uCEpBN,MFqBQ,iBElBN,iBACE,UAMF,qBACE,aAIJ,YACE,SACA,gBFDI,WEEJ,iBFEI,uCELN,YFMQ,iBEDN,gCACE,QACA,YFNE,WEOF,gBFHE,uEACE,iBGpBR,sEAME,kBAGF,iBACE,mBCwBE,wBACE,qBACA,YpB6hBwB,OoB5hBxB,epB2hBwB,OoB1hBxB,WArCJ,sBACA,sCACA,gBACA,qCA0DE,8BACE,cD9CN,eAEE,2BACA,+BACA,2BACA,gCACA,+BtBuQI,wBALI,KsBhQR,0CACA,oCACA,+DACA,qDACA,mDACA,0FACA,6DACA,uCACA,+CACA,+CACA,qDACA,mDACA,sCACA,sCACA,4DACA,mCACA,sCACA,oCACA,qCACA,uCAGA,kBACA,kCACA,aACA,uCACA,kEACA,StB0OI,UALI,6BsBnOR,+BACA,gBACA,gBACA,uCACA,4BACA,6ElBzCE,+CKLE,WARW,8Ba0Df,+BACE,SACA,OACA,qCAwBA,qBACE,qBAEA,qCACE,WACA,OAIJ,mBACE,mBAEA,mCACE,QACA,UV1CJ,yBU4BA,wBACE,qBAEA,wCACE,WACA,OAIJ,sBACE,mBAEA,sCACE,QACA,WV1CJ,yBU4BA,wBACE,qBAEA,wCACE,WACA,OAIJ,sBACE,mBAEA,sCACE,QACA,WV1CJ,yBU4BA,wBACE,qBAEA,wCACE,WACA,OAIJ,sBACE,mBAEA,sCACE,QACA,WV1CJ,0BU4BA,wBACE,qBAEA,wCACE,WACA,OAIJ,sBACE,mBAEA,sCACE,QACA,WV1CJ,0BU4BA,yBACE,qBAEA,yCACE,WACA,OAIJ,uBACE,mBAEA,uCACE,QACA,WAUN,uCACE,SACA,YACA,aACA,wCCpFA,gCACE,qBACA,YpB6hBwB,OoB5hBxB,epB2hBwB,OoB1hBxB,WA9BJ,aACA,sCACA,yBACA,qCAmDE,sCACE,cDgEJ,wCACE,MACA,WACA,UACA,aACA,sCClGA,iCACE,qBACA,YpB6hBwB,OoB5hBxB,epB2hBwB,OoB1hBxB,WAvBJ,oCACA,eACA,uCACA,uBA4CE,uCACE,cD0EF,iCACE,iBAMJ,0CACE,MACA,WACA,UACA,aACA,uCCnHA,mCACE,qBACA,YpB6hBwB,OoB5hBxB,epB2hBwB,OoB1hBxB,WAWA,mCACE,aAGF,oCACE,qBACA,apB0gBsB,OoBzgBtB,epBwgBsB,OoBvgBtB,WAnCN,oCACA,wBACA,uCAsCE,yCACE,cD2FF,oCACE,iBAON,kBACE,SACA,6CACA,gBACA,mDACA,UAMF,eACE,cACA,WACA,4EACA,WACA,YnByb4B,ImBxb5B,oCACA,mBACA,qBACA,mBACA,+BACA,SlBtKE,uDkByKF,0CAEE,0CJ1LF,iBI4LuB,iCAGvB,4CAEE,2CACA,qBJlMF,iBImMuB,kCAGvB,gDAEE,6CACA,oBACA,+BAMJ,oBACE,cAIF,iBACE,cACA,gFACA,gBtBmEI,UALI,SsB5DR,sCACA,mBAIF,oBACE,cACA,4EACA,oCAIF,oBAEE,6BACA,0BACA,+DACA,2BACA,kCACA,qCACA,6DACA,uDACA,sCACA,sCACA,2CACA,oCElPF,KAEE,8BACA,gCAEA,4BACA,0CACA,sDACA,wDAGA,aACA,eACA,eACA,gBACA,gBAGF,UACE,cACA,kExBsQI,UALI,6BwB/PR,2CACA,+BACA,qBACA,gBACA,SLfI,WKgBJ,uFLZI,uCKGN,ULFQ,iBKaN,gCAEE,qCAIF,wBACE,UACA,WrBkhBoB,+BqB9gBtB,sCAEE,wCACA,oBACA,eAQJ,UAEE,mDACA,mDACA,qDACA,4GACA,0DACA,gDACA,wGAGA,oFAEA,oBACE,uDACA,2DpB7CA,wDACA,yDoB+CA,oDAGE,kBACA,wDAIJ,8DAEE,2CACA,mDACA,yDAGF,yBAEE,oDpBjEA,yBACA,0BoB2EJ,WAEE,sDACA,uCACA,uCAGA,qBpB5FE,gDoBgGF,uDAEE,4CNjHF,iBMkHuB,mCASzB,eAEE,6BACA,0CACA,+DAGA,gCAEA,yBACE,gBACA,eACA,uEAEA,8DAEE,iCAIJ,+DAEE,YrB0d0B,IqBzd1B,gDACA,iCAUF,wCAEE,cACA,kBAKF,kDAEE,aACA,YACA,kBAMF,iEACE,WAUF,uBACE,aAEF,qBACE,cC7LJ,QAEE,yBACA,8BACA,4DACA,iEACA,oEACA,gEACA,uCACA,mCACA,qCACA,+DACA,qEACA,uCACA,uCACA,uCACA,uCACA,4QACA,2EACA,2DACA,yCACA,6DAGA,kBACA,aACA,eACA,mBACA,8BACA,8DAMA,2JACE,aACA,kBACA,mBACA,8BAoBJ,cACE,6CACA,gDACA,+CzB4NI,UALI,iCyBrNR,mCACA,qBACA,mBAEA,wCAEE,yCAUJ,YAEE,2BACA,gCAEA,4BACA,4CACA,wDACA,8DAGA,aACA,sBACA,eACA,gBACA,gBAGE,wDAEE,oCAIJ,2BACE,gBASJ,aACE,YtB8gCkC,MsB7gClC,etB6gCkC,MsB5gClC,6BAEA,yDAGE,oCAaJ,iBACE,gBACA,YAGA,mBAIF,gBACE,8EzByII,UALI,mCyBlIR,cACA,6BACA,+BACA,0ErBxIE,qDeHE,WM6IJ,oCNzII,uCMiIN,gBNhIQ,iBM0IN,sBACE,qBAGF,sBACE,qBACA,UACA,sDAMJ,qBACE,qBACA,YACA,aACA,sBACA,kDACA,4BACA,2BACA,qBAGF,mBACE,yCACA,gBb1HE,yBasIA,kBAEI,iBACA,2BAEA,8BACE,mBAEA,6CACE,kBAGF,wCACE,kDACA,iDAIJ,qCACE,iBAGF,mCACE,wBACA,gBAGF,kCACE,aAGF,6BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0BhBhOJ,WARW,KUUX,WMgOI,KAGA,+CACE,aAGF,6CACE,aACA,YACA,UACA,oBb5LR,yBasIA,kBAEI,iBACA,2BAEA,8BACE,mBAEA,6CACE,kBAGF,wCACE,kDACA,iDAIJ,qCACE,iBAGF,mCACE,wBACA,gBAGF,kCACE,aAGF,6BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0BhBhOJ,WARW,KUUX,WMgOI,KAGA,+CACE,aAGF,6CACE,aACA,YACA,UACA,oBb5LR,yBasIA,kBAEI,iBACA,2BAEA,8BACE,mBAEA,6CACE,kBAGF,wCACE,kDACA,iDAIJ,qCACE,iBAGF,mCACE,wBACA,gBAGF,kCACE,aAGF,6BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0BhBhOJ,WARW,KUUX,WMgOI,KAGA,+CACE,aAGF,6CACE,aACA,YACA,UACA,oBb5LR,0BasIA,kBAEI,iBACA,2BAEA,8BACE,mBAEA,6CACE,kBAGF,wCACE,kDACA,iDAIJ,qCACE,iBAGF,mCACE,wBACA,gBAGF,kCACE,aAGF,6BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0BhBhOJ,WARW,KUUX,WMgOI,KAGA,+CACE,aAGF,6CACE,aACA,YACA,UACA,oBb5LR,0BasIA,mBAEI,iBACA,2BAEA,+BACE,mBAEA,8CACE,kBAGF,yCACE,kDACA,iDAIJ,sCACE,iBAGF,oCACE,wBACA,gBAGF,mCACE,aAGF,8BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0BhBhOJ,WARW,KUUX,WMgOI,KAGA,gDACE,aAGF,8CACE,aACA,YACA,UACA,oBAtDR,eAEI,iBACA,2BAEA,2BACE,mBAEA,0CACE,kBAGF,qCACE,kDACA,iDAIJ,kCACE,iBAGF,gCACE,wBACA,gBAGF,+BACE,aAGF,0BAEE,gBACA,aACA,YACA,sBACA,uBACA,8BACA,0CACA,oBACA,0BhBhOJ,WARW,KUUX,WMgOI,KAGA,4CACE,aAGF,0CACE,aACA,YACA,UACA,mBAiBZ,yCAGE,6CACA,mDACA,sDACA,+BACA,8BACA,oCACA,2DACA,+QAME,0CACE,+QCxRN,OAEE,6BACA,6B1BuRI,qBALI,O0BhRR,4BACA,uBACA,kDAGA,qBACA,4D1B+QI,UALI,0B0BxQR,wCACA,cACA,4BACA,kBACA,mBACA,wBtBJE,4CsBSF,aACE,aAKJ,YACE,kBACA,SChCF,OAEE,2BACA,2BACA,2BACA,+BACA,0BACA,qCACA,6EACA,kDACA,+BAGA,kBACA,4DACA,4CACA,4BACA,oCACA,8BvBHE,4CuBQJ,eAEE,cAIF,YACE,YxB6kB4B,IwB5kB5B,iCAQF,mBACE,cxBo+C8B,KwBj+C9B,8BACE,kBACA,MACA,QACA,UACA,qBAQF,eACE,kDACA,2CACA,yDACA,uDAJF,iBACE,oDACA,6CACA,2DACA,yDAJF,eACE,kDACA,2CACA,yDACA,uDAJF,YACE,+CACA,wCACA,sDACA,oDAJF,eACE,kDACA,2CACA,yDACA,uDAJF,cACE,iDACA,0CACA,wDACA,sDAJF,aACE,gDACA,yCACA,uDACA,qDAJF,YACE,+CACA,wCACA,sDACA,oDC9DF,iBACE,cACA,WACA,WCHF,iBACE,sBACA,iFAFF,mBACE,sBACA,mFAFF,iBACE,sBACA,iFAFF,cACE,sBACA,8EAFF,iBACE,sBACA,i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ACA,WAGF,oBACE,iBACA,iBAKF,cACE,iBCjVJ,SACE,sBACA,eACA,oBAGF,iBACE,+BACA,WAEF,gBACE,c/CRF,MAEE,+BACA,iCAEA,0BACA,kCACA,iCAEA,4BACA,oCACA,kCAEA,4BACA,kCAGA,8BACA,gCAEA,yBACA,iCACA,gCAEA,2BACA,mCACA,iCAEA,2BACA,iCAGF,sBACE,4CACA,gDACA,gDAEA,kCACA,kDACA,sCAEA,sDACA,kDAEA,sCACA,kDAGF,qBACE,2CACA,+CAEA,iCACA,iDACA,+CAEA,qCACA,qDACA,iDAEA,qCACA,iDgD7DA,iBACE,gBACA,iBACA,0CAGF,OACE,qBAGF,YACE,iBAEA,iBACE,gBACA,oBAIJ,gBACE,iBACA,oBAGF,gBACE,iBhDzBJ,MAEE,+BACA,iCAEA,0BACA,kCACA,iCAEA,4BACA,oCACA,kCAEA,4BACA,kCAGA,8BACA,gCAEA,yBACA,iCACA,gCAEA,2BACA,mCACA,iCAEA,2BACA,iCAGF,sBACE,4CACA,gDACA,gDAEA,kCACA,kDACA,sCAEA,sDACA,kDAEA,sCACA,kDAGF,qBACE,2CACA,+CAEA,iCACA,iDACA,+CAEA,qCACA,qDACA,iDAEA,qCACA,iDiD5DA,iBAEE,wBAGF,kBACE,qBACA,gBACA,+BAGF,gDAEE,iCAGF,iBACE,uBACA,mBACA,oBAGF,uEAGE,iCC1BJ,UACE,kBAGA,iBACE,WACA,kBACA,UACA,iBAXS,QAYT,MACA,SACA,SACA,iBAKJ,eACE,kBACA,UAEA,qBACE,kCACA,kBACA,sBACA,cAEA,uBACE,cAGF,iCACE,yBAIJ,2BACE,oBACA,iBACA,gBAIF,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,sBACA,sBACA,wCACA,SACA,UACA,WACA,wCACA,sCAIF,6BACE,WACA,kBACA,YACA,WACA,iCACA,sBACA,wCACA,SACA,UACA,UACA,uCACA,yCAIF,4BACE,WAKJ,qCAGE,iBACE,UAIF,eACE,WACA,6BACA,8BAGA,uBACE,qBAIF,uDAEE,oBAGF,4BACE,kBACA,gBACA,uCACA,yCAGF,6BACE,WAIF,qBACE,SlDlKN,MAEE,+BACA,iCAEA,0BACA,kCACA,iCAEA,4BACA,oCACA,kCAEA,4BACA,kCAGA,8BACA,gCAEA,yBACA,iCACA,gCAEA,2BACA,mCACA,iCAEA,2BACA,iCAGF,sBACE,4CACA,gDACA,gDAEA,kCACA,kDACA,sCAEA,sDACA,kDAEA,sCACA,kDAGF,qBACE,2CACA,+CAEA,iCACA,iDACA,+CAEA,qCACA,qDACA,iDAEA,qCACA,iDmD7DA,qBACE,0CCHF,gCACE,mBAKA,+CACE,yBAIJ,+BACE","sourcesContent":["$primary-color: #021a34;\n$secondary-color: #075f94;\n\n:root {\n // -- Light\n --primary-color-light: #021a34;\n --secondary-color-light: #075f94;\n\n --bg-color-light: #edeef0;\n --bg-color-reverse-light: #021a34;\n --bg-color-tinted-light: #b0b2b4;\n\n --text-color-light: #4c4c4c;\n --text-color-reverse-light: #edeef0;\n --text-muted-color-light: #4c4c4c;\n\n --link-color-light: #4c4c4c;\n --link-hover-color-light: #6c6c6c;\n\n // -- Dark\n --primary-color-dark: #edeef0;\n --secondary-color-dark: #075f94;\n\n --bg-color-dark: #14171c;\n --bg-color-reverse-dark: #edeef0;\n --bg-color-tinted-dark: #627191;\n\n --text-color-dark: #edeef0;\n --text-color-reverse-dark: #14171c;\n --text-muted-color-dark: #edeef0;\n\n --link-color-dark: #edeef0;\n --link-hover-color-dark: #ffffff;\n}\n\n[data-bs-theme=\"light\"] {\n --primary-color: var(--primary-color-light);\n --secondary-color: var(--secondary-color-light);\n --bg-color-tinted: var(--bg-color-tinted-light);\n\n --bg-color: var(--bg-color-light);\n --bg-color-reverse: var(--bg-color-reverse-light);\n --text-color: var(--text-color-light);\n\n --text-color-reverse: var(--text-color-reverse-light);\n --text-muted-color: var(--text-muted-color-light);\n\n --link-color: var(--link-color-light);\n --link-hover-color: var(--link-hover-color-light);\n}\n\n[data-bs-theme=\"dark\"] {\n --primary-color: var(--primary-color-dark);\n --secondary-color: var(--secondary-color-dark);\n\n --bg-color: var(--bg-color-dark);\n --bg-color-reverse: var(--bg-color-reverse-dark);\n --bg-color-tinted: var(--bg-color-tinted-dark);\n\n --text-color: var(--text-color-dark);\n --text-color-reverse: var(--text-color-reverse-dark);\n --text-muted-color: var(--text-muted-color-dark);\n\n --link-color: var(--link-color-dark);\n --link-hover-color: var(--link-hover-color-dark);\n}\n",":root,\n[data-bs-theme=\"light\"] {\n // Note: Custom variable values only support SassScript inside `#{}`.\n\n // Colors\n //\n // Generate palettes for full colors, grays, and theme colors.\n\n @each $color, $value in $colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $grays {\n --#{$prefix}gray-#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors-rgb {\n --#{$prefix}#{$color}-rgb: #{$value};\n }\n\n @each $color, $value in $theme-colors-text {\n --#{$prefix}#{$color}-text-emphasis: #{$value};\n }\n\n @each $color, $value in $theme-colors-bg-subtle {\n --#{$prefix}#{$color}-bg-subtle: #{$value};\n }\n\n @each $color, $value in $theme-colors-border-subtle {\n --#{$prefix}#{$color}-border-subtle: #{$value};\n }\n\n --#{$prefix}white-rgb: #{to-rgb($white)};\n --#{$prefix}black-rgb: #{to-rgb($black)};\n\n // Fonts\n\n // Note: Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$prefix}gradient: #{$gradient};\n\n // Root and body\n // scss-docs-start root-body-variables\n @if $font-size-root != null {\n --#{$prefix}root-font-size: #{$font-size-root};\n }\n --#{$prefix}body-font-family: #{inspect($font-family-base)};\n @include rfs($font-size-base, --#{$prefix}body-font-size);\n --#{$prefix}body-font-weight: #{$font-weight-base};\n --#{$prefix}body-line-height: #{$line-height-base};\n @if $body-text-align != null {\n --#{$prefix}body-text-align: #{$body-text-align};\n }\n\n --#{$prefix}body-color: #{$body-color};\n --#{$prefix}body-color-rgb: #{to-rgb($body-color)};\n --#{$prefix}body-bg: #{$body-bg};\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg)};\n\n --#{$prefix}emphasis-color: #{$body-emphasis-color};\n --#{$prefix}emphasis-color-rgb: #{to-rgb($body-emphasis-color)};\n\n --#{$prefix}secondary-color: #{$body-secondary-color};\n --#{$prefix}secondary-color-rgb: #{to-rgb($body-secondary-color)};\n --#{$prefix}secondary-bg: #{$body-secondary-bg};\n --#{$prefix}secondary-bg-rgb: #{to-rgb($body-secondary-bg)};\n\n --#{$prefix}tertiary-color: #{$body-tertiary-color};\n --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color)};\n --#{$prefix}tertiary-bg: #{$body-tertiary-bg};\n --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg)};\n // scss-docs-end root-body-variables\n\n --#{$prefix}heading-color: #{$headings-color};\n\n --#{$prefix}link-color: #{$link-color};\n --#{$prefix}link-color-rgb: #{to-rgb($link-color)};\n --#{$prefix}link-decoration: #{$link-decoration};\n\n --#{$prefix}link-hover-color: #{$link-hover-color};\n --#{$prefix}link-hover-color-rgb: #{to-rgb($link-hover-color)};\n\n @if $link-hover-decoration != null {\n --#{$prefix}link-hover-decoration: #{$link-hover-decoration};\n }\n\n --#{$prefix}code-color: #{$code-color};\n --#{$prefix}highlight-color: #{$mark-color};\n --#{$prefix}highlight-bg: #{$mark-bg};\n\n // scss-docs-start root-border-var\n --#{$prefix}border-width: #{$border-width};\n --#{$prefix}border-style: #{$border-style};\n --#{$prefix}border-color: #{$border-color};\n --#{$prefix}border-color-translucent: #{$border-color-translucent};\n\n --#{$prefix}border-radius: #{$border-radius};\n --#{$prefix}border-radius-sm: #{$border-radius-sm};\n --#{$prefix}border-radius-lg: #{$border-radius-lg};\n --#{$prefix}border-radius-xl: #{$border-radius-xl};\n --#{$prefix}border-radius-xxl: #{$border-radius-xxl};\n --#{$prefix}border-radius-2xl: var(--#{$prefix}border-radius-xxl); // Deprecated in v5.3.0 for consistency\n --#{$prefix}border-radius-pill: #{$border-radius-pill};\n // scss-docs-end root-border-var\n\n --#{$prefix}box-shadow: #{$box-shadow};\n --#{$prefix}box-shadow-sm: #{$box-shadow-sm};\n --#{$prefix}box-shadow-lg: #{$box-shadow-lg};\n --#{$prefix}box-shadow-inset: #{$box-shadow-inset};\n\n // Focus styles\n // scss-docs-start root-focus-variables\n --#{$prefix}focus-ring-width: #{$focus-ring-width};\n --#{$prefix}focus-ring-opacity: #{$focus-ring-opacity};\n --#{$prefix}focus-ring-color: #{$focus-ring-color};\n // scss-docs-end root-focus-variables\n\n // scss-docs-start root-form-validation-variables\n --#{$prefix}form-valid-color: #{$form-valid-color};\n --#{$prefix}form-valid-border-color: #{$form-valid-border-color};\n --#{$prefix}form-invalid-color: #{$form-invalid-color};\n --#{$prefix}form-invalid-border-color: #{$form-invalid-border-color};\n // scss-docs-end root-form-validation-variables\n}\n\n@if $enable-dark-mode {\n @include color-mode(dark, true) {\n color-scheme: dark;\n\n // scss-docs-start root-dark-mode-vars\n --#{$prefix}body-color: #{$body-color-dark};\n --#{$prefix}body-color-rgb: #{to-rgb($body-color-dark)};\n --#{$prefix}body-bg: #{$body-bg-dark};\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg-dark)};\n\n --#{$prefix}emphasis-color: #{$body-emphasis-color-dark};\n --#{$prefix}emphasis-color-rgb: #{to-rgb($body-emphasis-color-dark)};\n\n --#{$prefix}secondary-color: #{$body-secondary-color-dark};\n --#{$prefix}secondary-color-rgb: #{to-rgb($body-secondary-color-dark)};\n --#{$prefix}secondary-bg: #{$body-secondary-bg-dark};\n --#{$prefix}secondary-bg-rgb: #{to-rgb($body-secondary-bg-dark)};\n\n --#{$prefix}tertiary-color: #{$body-tertiary-color-dark};\n --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color-dark)};\n --#{$prefix}tertiary-bg: #{$body-tertiary-bg-dark};\n --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg-dark)};\n\n @each $color, $value in $theme-colors-text-dark {\n --#{$prefix}#{$color}-text-emphasis: #{$value};\n }\n\n @each $color, $value in $theme-colors-bg-subtle-dark {\n --#{$prefix}#{$color}-bg-subtle: #{$value};\n }\n\n @each $color, $value in $theme-colors-border-subtle-dark {\n --#{$prefix}#{$color}-border-subtle: #{$value};\n }\n\n --#{$prefix}heading-color: #{$headings-color-dark};\n\n --#{$prefix}link-color: #{$link-color-dark};\n --#{$prefix}link-hover-color: #{$link-hover-color-dark};\n --#{$prefix}link-color-rgb: #{to-rgb($link-color-dark)};\n --#{$prefix}link-hover-color-rgb: #{to-rgb($link-hover-color-dark)};\n\n --#{$prefix}code-color: #{$code-color-dark};\n --#{$prefix}highlight-color: #{$mark-color-dark};\n --#{$prefix}highlight-bg: #{$mark-bg-dark};\n\n --#{$prefix}border-color: #{$border-color-dark};\n --#{$prefix}border-color-translucent: #{$border-color-translucent-dark};\n\n --#{$prefix}form-valid-color: #{$form-valid-color-dark};\n --#{$prefix}form-valid-border-color: #{$form-valid-border-color-dark};\n --#{$prefix}form-invalid-color: #{$form-invalid-color-dark};\n --#{$prefix}form-invalid-border-color: #{$form-invalid-border-color-dark};\n // scss-docs-end root-dark-mode-vars\n }\n}\n","// stylelint-disable scss/dimension-no-non-numeric-values\n\n// SCSS RFS mixin\n//\n// Automated responsive values for font sizes, paddings, margins and much more\n//\n// Licensed under MIT (https://github.com/twbs/rfs/blob/main/LICENSE)\n\n// Configuration\n\n// Base value\n$rfs-base-value: 1.25rem !default;\n$rfs-unit: rem !default;\n\n@if $rfs-unit != rem and $rfs-unit != px {\n @error \"`#{$rfs-unit}` is not a valid unit for $rfs-unit. Use `px` or `rem`.\";\n}\n\n// Breakpoint at where values start decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n@if $rfs-breakpoint-unit != px and $rfs-breakpoint-unit != em and $rfs-breakpoint-unit != rem {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n}\n\n// Resize values based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != number or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Mode. Possibilities: \"min-media-query\", \"max-media-query\"\n$rfs-mode: min-media-query !default;\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-rfs to false\n$enable-rfs: true !default;\n\n// Cache $rfs-base-value unit\n$rfs-base-value-unit: unit($rfs-base-value);\n\n@function divide($dividend, $divisor, $precision: 10) {\n $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);\n $dividend: abs($dividend);\n $divisor: abs($divisor);\n @if $dividend == 0 {\n @return 0;\n }\n @if $divisor == 0 {\n @error \"Cannot divide by 0\";\n }\n $remainder: $dividend;\n $result: 0;\n $factor: 10;\n @while ($remainder > 0 and $precision >= 0) {\n $quotient: 0;\n @while ($remainder >= $divisor) {\n $remainder: $remainder - $divisor;\n $quotient: $quotient + 1;\n }\n $result: $result * 10 + $quotient;\n $factor: $factor * .1;\n $remainder: $remainder * 10;\n $precision: $precision - 1;\n @if ($precision < 0 and $remainder >= $divisor * 5) {\n $result: $result + 1;\n }\n }\n $result: $result * $factor * $sign;\n $dividend-unit: unit($dividend);\n $divisor-unit: unit($divisor);\n $unit-map: (\n \"px\": 1px,\n \"rem\": 1rem,\n \"em\": 1em,\n \"%\": 1%\n );\n @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {\n $result: $result * map-get($unit-map, $dividend-unit);\n }\n @return $result;\n}\n\n// Remove px-unit from $rfs-base-value for calculations\n@if $rfs-base-value-unit == px {\n $rfs-base-value: divide($rfs-base-value, $rfs-base-value * 0 + 1);\n}\n@else if $rfs-base-value-unit == rem {\n $rfs-base-value: divide($rfs-base-value, divide($rfs-base-value * 0 + 1, $rfs-rem-value));\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == px {\n $rfs-breakpoint: divide($rfs-breakpoint, $rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == rem or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: divide($rfs-breakpoint, divide($rfs-breakpoint * 0 + 1, $rfs-rem-value));\n}\n\n// Calculate the media query value\n$rfs-mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{divide($rfs-breakpoint, $rfs-rem-value)}#{$rfs-breakpoint-unit});\n$rfs-mq-property-width: if($rfs-mode == max-media-query, max-width, min-width);\n$rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height);\n\n// Internal mixin used to determine which media query needs to be used\n@mixin _rfs-media-query {\n @if $rfs-two-dimensional {\n @if $rfs-mode == max-media-query {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}), (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) and (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) {\n @content;\n }\n }\n}\n\n// Internal mixin that adds disable classes to the selector if needed.\n@mixin _rfs-rule {\n @if $rfs-class == disable and $rfs-mode == max-media-query {\n // Adding an extra class increases specificity, which prevents the media query to override the property\n &,\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @else if $rfs-class == enable and $rfs-mode == min-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Internal mixin that adds enable classes to the selector if needed.\n@mixin _rfs-media-query-rule {\n\n @if $rfs-class == enable {\n @if $rfs-mode == min-media-query {\n @content;\n }\n\n @include _rfs-media-query () {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n }\n @else {\n @if $rfs-class == disable and $rfs-mode == min-media-query {\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @include _rfs-media-query () {\n @content;\n }\n }\n}\n\n// Helper function to get the formatted non-responsive value\n@function rfs-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: \"\";\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + \" 0\";\n }\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n @if $unit == px {\n // Convert to rem if needed\n $val: $val + \" \" + if($rfs-unit == rem, #{divide($value, $value * 0 + $rfs-rem-value)}rem, $value);\n }\n @else if $unit == rem {\n // Convert to px if needed\n $val: $val + \" \" + if($rfs-unit == px, #{divide($value, $value * 0 + 1) * $rfs-rem-value}px, $value);\n } @else {\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n $val: $val + \" \" + $value;\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// Helper function to get the responsive value calculated by RFS\n@function rfs-fluid-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: \"\";\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + \" 0\";\n } @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $unit or $unit != px and $unit != rem {\n $val: $val + \" \" + $value;\n } @else {\n // Remove unit from $value for calculations\n $value: divide($value, $value * 0 + if($unit == px, 1, divide(1, $rfs-rem-value)));\n\n // Only add the media query if the value is greater than the minimum value\n @if abs($value) <= $rfs-base-value or not $enable-rfs {\n $val: $val + \" \" + if($rfs-unit == rem, #{divide($value, $rfs-rem-value)}rem, #{$value}px);\n }\n @else {\n // Calculate the minimum value\n $value-min: $rfs-base-value + divide(abs($value) - $rfs-base-value, $rfs-factor);\n\n // Calculate difference between $value and the minimum value\n $value-diff: abs($value) - $value-min;\n\n // Base value formatting\n $min-width: if($rfs-unit == rem, #{divide($value-min, $rfs-rem-value)}rem, #{$value-min}px);\n\n // Use negative value if needed\n $min-width: if($value < 0, -$min-width, $min-width);\n\n // Use `vmin` if two-dimensional is enabled\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{divide($value-diff * 100, $rfs-breakpoint)}#{$variable-unit};\n\n // Return the calculated value\n $val: $val + \" calc(\" + $min-width + if($value < 0, \" - \", \" + \") + $variable-width + \")\";\n }\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// RFS mixin\n@mixin rfs($values, $property: font-size) {\n @if $values != null {\n $val: rfs-value($values);\n $fluid-val: rfs-fluid-value($values);\n\n // Do not print the media query if responsive & non-responsive values are the same\n @if $val == $fluid-val {\n #{$property}: $val;\n }\n @else {\n @include _rfs-rule () {\n #{$property}: if($rfs-mode == max-media-query, $val, $fluid-val);\n\n // Include safari iframe resize fix if needed\n min-width: if($rfs-safari-iframe-resize-bug-fix, (0 * 1vw), null);\n }\n\n @include _rfs-media-query-rule () {\n #{$property}: if($rfs-mode == max-media-query, $fluid-val, $val);\n }\n }\n }\n}\n\n// Shorthand helper mixins\n@mixin font-size($value) {\n @include rfs($value);\n}\n\n@mixin padding($value) {\n @include rfs($value, padding);\n}\n\n@mixin padding-top($value) {\n @include rfs($value, padding-top);\n}\n\n@mixin padding-right($value) {\n @include rfs($value, padding-right);\n}\n\n@mixin padding-bottom($value) {\n @include rfs($value, padding-bottom);\n}\n\n@mixin padding-left($value) {\n @include rfs($value, padding-left);\n}\n\n@mixin margin($value) {\n @include rfs($value, margin);\n}\n\n@mixin margin-top($value) {\n @include rfs($value, margin-top);\n}\n\n@mixin margin-right($value) {\n @include rfs($value, margin-right);\n}\n\n@mixin margin-bottom($value) {\n @include rfs($value, margin-bottom);\n}\n\n@mixin margin-left($value) {\n @include rfs($value, margin-left);\n}\n","// scss-docs-start color-mode-mixin\n@mixin color-mode($mode: light, $root: false) {\n @if $color-mode-type == \"media-query\" {\n @if $root == true {\n @media (prefers-color-scheme: $mode) {\n :root {\n @content;\n }\n }\n } @else {\n @media (prefers-color-scheme: $mode) {\n @content;\n }\n }\n } @else {\n [data-bs-theme=\"#{$mode}\"] {\n @content;\n }\n }\n}\n// scss-docs-end color-mode-mixin\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n\n// Root\n//\n// Ability to the value of the root font sizes, affecting the value of `rem`.\n// null by default, thus nothing is generated.\n\n:root {\n @if $font-size-root != null {\n @include font-size(var(--#{$prefix}root-font-size));\n }\n\n @if $enable-smooth-scroll {\n @media (prefers-reduced-motion: no-preference) {\n scroll-behavior: smooth;\n }\n }\n}\n\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Prevent adjustments of font size after orientation changes in iOS.\n// 4. Change the default tap highlight to be completely transparent in iOS.\n\n// scss-docs-start reboot-body-rules\nbody {\n margin: 0; // 1\n font-family: var(--#{$prefix}body-font-family);\n @include font-size(var(--#{$prefix}body-font-size));\n font-weight: var(--#{$prefix}body-font-weight);\n line-height: var(--#{$prefix}body-line-height);\n color: var(--#{$prefix}body-color);\n text-align: var(--#{$prefix}body-text-align);\n background-color: var(--#{$prefix}body-bg); // 2\n -webkit-text-size-adjust: 100%; // 3\n -webkit-tap-highlight-color: rgba($black, 0); // 4\n}\n// scss-docs-end reboot-body-rules\n\n\n// Content grouping\n//\n// 1. Reset Firefox's gray color\n\nhr {\n margin: $hr-margin-y 0;\n color: $hr-color; // 1\n border: 0;\n border-top: $hr-border-width solid $hr-border-color;\n opacity: $hr-opacity;\n}\n\n\n// Typography\n//\n// 1. Remove top margins from headings\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n\n%heading {\n margin-top: 0; // 1\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-style: $headings-font-style;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: var(--#{$prefix}heading-color);\n}\n\nh1 {\n @extend %heading;\n @include font-size($h1-font-size);\n}\n\nh2 {\n @extend %heading;\n @include font-size($h2-font-size);\n}\n\nh3 {\n @extend %heading;\n @include font-size($h3-font-size);\n}\n\nh4 {\n @extend %heading;\n @include font-size($h4-font-size);\n}\n\nh5 {\n @extend %heading;\n @include font-size($h5-font-size);\n}\n\nh6 {\n @extend %heading;\n @include font-size($h6-font-size);\n}\n\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\n\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n\n// Abbreviations\n//\n// 1. Add the correct text decoration in Chrome, Edge, Opera, and Safari.\n// 2. Add explicit cursor to indicate changed behavior.\n// 3. Prevent the text-decoration to be skipped.\n\nabbr[title] {\n text-decoration: underline dotted; // 1\n cursor: help; // 2\n text-decoration-skip-ink: none; // 3\n}\n\n\n// Address\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\n\n// Lists\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\n// 1. Undo browser default\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // 1\n}\n\n\n// Blockquote\n\nblockquote {\n margin: 0 0 1rem;\n}\n\n\n// Strong\n//\n// Add the correct font weight in Chrome, Edge, and Safari\n\nb,\nstrong {\n font-weight: $font-weight-bolder;\n}\n\n\n// Small\n//\n// Add the correct font size in all browsers\n\nsmall {\n @include font-size($small-font-size);\n}\n\n\n// Mark\n\nmark {\n padding: $mark-padding;\n color: var(--#{$prefix}highlight-color);\n background-color: var(--#{$prefix}highlight-bg);\n}\n\n\n// Sub and Sup\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n\nsub,\nsup {\n position: relative;\n @include font-size($sub-sup-font-size);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n// Links\n\na {\n color: rgba(var(--#{$prefix}link-color-rgb), var(--#{$prefix}link-opacity, 1));\n text-decoration: $link-decoration;\n\n &:hover {\n --#{$prefix}link-color-rgb: var(--#{$prefix}link-hover-color-rgb);\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n &,\n &:hover {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n// Code\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-code;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\n// 1. Remove browser default top margin\n// 2. Reset browser default of `1em` to use `rem`s\n// 3. Don't allow content to break outside\n\npre {\n display: block;\n margin-top: 0; // 1\n margin-bottom: 1rem; // 2\n overflow: auto; // 3\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\ncode {\n @include font-size($code-font-size);\n color: var(--#{$prefix}code-color);\n word-wrap: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n\n kbd {\n padding: 0;\n @include font-size(1em);\n font-weight: $nested-kbd-font-weight;\n }\n}\n\n\n// Figures\n//\n// Apply a consistent margin strategy (matches our type styles).\n\nfigure {\n margin: 0 0 1rem;\n}\n\n\n// Images and content\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\n\n// Tables\n//\n// Prevent double borders\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: $table-cell-padding-y;\n padding-bottom: $table-cell-padding-y;\n color: $table-caption-color;\n text-align: left;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // 1\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n text-transform: none;\n}\n// Set the cursor for non-` +

+ + + + + +
+
+
+
+

所有文章

+ + + 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..0c2c1c29e --- /dev/null +++ b/zh/community/index.html @@ -0,0 +1,444 @@ + + + + + + + + + + + + + 社区 | 帕图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+

加入帕图斯社区

+ +

加入帕图斯社区,您将成为一个全球创新者、思想家和实践者网络的一部分, 所有这些人都有一个共同的愿景,即利用区块链技术构建更美好的未来。无论您是开发人员、企业家、投资者, 还是一个区块链爱好者,在这里,都有一个属于您的位置。
所以,让我们携手并肩,创造改变吧!

+ + + +

To explore the communities managed by members of the community, you can follow the links below.

+ + + +
+
+
+
+ + + + + diff --git a/zh/contributing/index.html b/zh/contributing/index.html new file mode 100644 index 000000000..796b684a5 --- /dev/null +++ b/zh/contributing/index.html @@ -0,0 +1,434 @@ + + + + + + + + + + + + + 贡献 | 帕图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+

贡献

+ + +

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..5c925e328 --- /dev/null +++ b/zh/download/index.html @@ -0,0 +1,543 @@ + + + + + + + + + + + + + 下载 | 帕图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+

资源下载

+ +

在此页面上,您可以找到如何下载和获取帕图斯软件的最新版本。

+ +
+ +

🏗️ 从源代码编译

+ +

帕图斯项目是作为开源软件分发的,因此安装的首选方法是从 GitHub存储库克隆源代码并编译源代码。

+ +

有关编译帕图斯的说明在安装页面中提供。

+ +
+ +

⬇️ 下载稳定版

+ +

您还可以下载最新的稳定版本的帕图斯。 这些版本会在发布GitHub存储库中的新版本时自动更新。

+ +

帕图斯图形用户界面(GUI)

+ +

您可以以图形用户界面(GUI)模式运行帕图斯,适用于初学者和高级用户。

+ +

帕图斯图形用户界面(GUI)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
File nameKindOSArch
pactus-gui_1.0.2_darwin_amd64.tar.gzArchive macOS64-bit
pactus-gui_1.0.2_darwin_amd64.dmgDMG macOS64-bit
pactus-gui_1.0.2_darwin_arm64.tar.gzArchive macOSARM64
pactus-gui_1.0.2_darwin_arm64.dmgDMG macOSARM64
pactus-gui_1.0.2_linux_amd64.tar.gzArchive Linux64-bit
pactus-gui_1.0.2_windows_amd64.zipArchive Windows64-bit
pactus-gui_1.0.2_windows_amd64_installer.exeInstaller Windows64-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_1.0.2_android_arm64.tar.gz AndroidARM64
pactus-cli_1.0.2_darwin_amd64.tar.gz macOS64-bit
pactus-cli_1.0.2_darwin_arm64.tar.gz macOSARM64
pactus-cli_1.0.2_freebsd_amd64.tar.gz FreeBSD64-bit
pactus-cli_1.0.2_freebsd_arm.tar.gz FreeBSDARM
pactus-cli_1.0.2_linux_amd64.tar.gz Linux64-bit
pactus-cli_1.0.2_linux_arm64.tar.gz LinuxARM64
pactus-cli_1.0.2_windows_386.zip Windows32-bit
pactus-cli_1.0.2_windows_amd64.zip Windows64-bit
+ +

一旦您下载了帕图斯CLI,您可以按照本教程设置和运行节点: + 如何以命令行模式运行帕图斯?

+ +

Downloader script

+ +

For Unix-like systems (e.g., Linux, macOS, or MSYS2 on Windows), there is a downloader script available. This script can download the archived file, verify it, and extract it for you. To use it, simply run the following command in your terminal:

+ +
curl --proto '=https' --tlsv1.2 -sSL https://github.com/pactus-project/pactus/releases/download/v1.0.2/pactus_downloader.sh | sh
+
+ +
+ +

🐳 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..99ad248f6 --- /dev/null +++ b/zh/feed.xml @@ -0,0 +1,1223 @@ +Jekyll2024-03-10T09:34:39+00:00https://pactus.org/feed.xmlPactus blockchainPactus 1.0.2 (Istanbul) Released2024-02-18T00:00:00+00:002024-02-18T00:00:00+00:00https://pactus.org/2024/02/18/release-1-0-2Overview
+ +

Pactus Blockchain Version 1.0.2 (Istanbul) +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.

+ +

This release is named after the city of Istanbul and it +was unanimously selected by Pactus community.

+ +

Pactus Version 1.0.2 (Istanbul)

+ +

Highlights

+ +

This update fixes a major issue that decreases the number of inbound connections of the nodes over time. +We highly recommend all users to upgrade to the new version for better connectivity.

+ +

Download

+ +

To start using Pactus blockchain, download the latest version from the download +page and join the Mainnet.

+ +

How to Upgrade

+ +

If you are running an older version, close it first. +Then uninstall the previous version and install the newer version. +If you are using the archived version, simply replace it with the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Fix

+ +
    +
  • sync: fix concurrent map read-write crash (#1112)
  • +
  • network: remove disconnected peers from peerMgr (#1110)
  • +
+ +

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

]]>Pactus 1.0.1 (Beijing) Released2024-02-10T00:00:00+00:002024-02-10T00:00:00+00:00https://pactus.org/2024/02/10/release-1-0-1Overview + +

Pactus Blockchain Version 1.0.1 (Beijing) +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.

+ +

This release is named after the city of Beijing and it +was unanimously selected by Pactus community.

+ +

Pactus Version 1.0.1 (Beijing)

+ +

Highlights

+ +

This update fixes several issues identified after the release of +1.0.0 (Beijing). +Specifically, it fixes the missed log file on the Windows GUI application and improves the node connectivity.

+ +

Download

+ +

To start using Pactus blockchain, download the latest version from the download +page and join the Mainnet.

+ +

How to Upgrade

+ +

If you are running an older version, close it first. +Then uninstall the previous version and install the newer version. +If you are using the archived version, simply replace it with the new version.

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • gui: add connections and moniker fields to main windows (#1090)
  • +
+ +

Fix

+ +
    +
  • network: set dial and accept limit in connection gater (#1089)
  • +
  • gui stderr logger in windows os (#1081)
  • +
  • sync: improve syncing process (#1087)
  • +
  • network: redefine resource limits (#1086)
  • +
+ +

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

]]>
Pactus 1.0.0 (Beijing) Released2024-01-31T00:00:00+00:002024-01-31T00:00:00+00:00https://pactus.org/2024/01/31/release-1-0-0Overview + +

Pactus Blockchain Version 1.0.0 (Beijing) +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.

+ +

Pactus Version 1.0.0 (Beijing)

+ +

Highlights

+ +

Mainnet Official Release v1.0.0 (Beijing)

+ +

The much-anticipated official software release of Pactus v1.0.0 (Beijing) marks a significant milestone +for our community. +This impressive mainnet release represents the culmination of extensive development efforts. +Pactus v1.0.0 (Beijing) offers a pioneering solution for streamlining the validation of Pactus blockchain, +enhancing security, and providing a user-friendly experience. We’re excited to unveil the official software +and welcome users to experience the power of Pactus in revolutionizing the future of blockchain. Join us on +this exciting journey.

+ +

Onboarding validators

+ +

On February 1st, a total of 53,494 PAC coins will be distributed among 1,311 validators who participated in +Testnet-0, +Testnet-1, and +Testnet-2. +This marks the beginning of a new chapter in the decentralized world.

+ +

Download

+ +

This version has been implemented for Mainnet +To start using Pactus Mainnet, download the latest version from the download +page and join the Mainnet.

+ +

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

+ + + +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • implement get validator address for grpc (#975)
  • +
  • add bootstrap.json and load in config on build (#964)
  • +
  • add mainnet config and genesis files (#951)
  • +
  • add Consensus-address to network info (#952)
  • +
  • grpc: sign transaction using wallet client (#945)
  • +
  • pactus gui lock support (#947)
  • +
  • consensus: turning consensus to a zero-config module (#942)
  • +
+ +

Fix

+ +
    +
  • localnet wallet issue (#970)
  • +
  • sync: remove ReachabilityStatus from agent info (#956)
  • +
  • daemon: keeping previous behavior for password flag, linting CLI messages (#950)
  • +
  • consensus: detect if the system time is behind the network (#939)
  • +
+ +

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

]]>
Mainnet launched 🚀2024-01-24T20:24:00+00:002024-01-24T20:24:00+00:00https://pactus.org/2024/01/24/mainnet-launchedYears to Launch + +

Pactus Mainnet started creating the first block on 24 January 2024 at 20:24:10 UTC time. +Pactus Mainnet is the result of years of hard work, research, and innovation. +It started from one idea:

+ +

A low-cost, truly decentralized blockchain, built by the people for the people, +where anyone could run and be their own validator.

+ +

We faced many challenges and obstacles along the way, but we never gave up.
+We overcame them with our determination and perseverance.
+We learned from our mistakes and improved our solutions.
+We grew from a small team to a large community.
+We achieved many milestones and breakthroughs. And we did it.
+We created Pactus, the platform that empowers you.

+ +

Thanks to Community

+ +

We want to thank Pactus community for helping us on the Testnet.

+ +

You have been instrumental in testing and improving the Testnet.
+You have given us your honest feedback and constructive suggestions.
+You have reported and help fixed bugs and errors.
+You have challenged and pushed us to do better.
+You have been our partners and friends in this journey.

+ +

On the Road

+ +

The true journey has just started.
+The Mainnet is not the end, but the beginning.
+The beginning of a new era of blockchain innovation.
+The beginning of a new challenge and opportunity.
+The beginning of a new revolution and evolution!

+ +

We welcome you more than ever.
+We need you to join us in this exciting adventure.
+We need you to support us in this ambitious endeavor.
+We need you to be part of Pactus, the platform that empowers you!

+ +

We Have a Dream

+ +

We have a dream.
+A dream of a world where blockchain technology is not a privilege, but a right for everyone.
+A dream of a world where smart contracts and decentralized applications are fast, secure, and scalable.
+A dream of a world where Pactus is the platform that empowers you.

+ +

This dream is not just ours. It is yours too.
+You share our vision and passion for blockchain innovation.
+You believe in our potential and impact.
+You support our goals and values.
+You are part of our dream.

+ +

And this dream is not just a fantasy. It is a reality.
+A reality that we have created together.
+A reality that we have launched today. A reality that we can explore and enjoy together.
+A reality that we can shape and improve together.
+A reality that we can make better and brighter together!

]]>
Story of Testnet-22024-01-22T00:00:00+00:002024-01-22T00:00:00+00:00https://pactus.org/2024/01/22/testnet-2-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

+ +

In October 2023, we launched Testnet-2. +The main purpose of this Testnet was to closely monitor the new consensus mechanism and the stability of the P2P network.

+ +

The committee for Testnet-2 was set to 51 validators, +and 2084 validators joined during the Testnet period. +More than 1500 computers and servers joined the network, and we experienced a high volume of data transmission in the network. +More than 800,000 blocks were created, and about 2 million transactions were processed during this time. +The size of the blockchain is about 450 megabytes.

+ +

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

+ +

Stability of Consensus

+ +

In Testnet-1, we had one consensus failure that caused us to +conclude the Testnet-1. +During Testnet-2, there were no issues with the consensus mechanism, and +we had no case of failure during the testing period, +although the number of validators and nodes significantly increased on Testnet-2 compared to its predecessor. +It proved that the consensus mechanism is in a stable situation.

+ +

Networking issues

+ +

In Testnet-2, the blockchain stopped twice, and each time it took more than 24 hours to fix the problem. +In the second blockage, we had no choice but to ask active validators inside the committee to +update their nodes to overcome the networking issue. +The development team faced a difficult situation and had to make the proper decision to fix the networking issues. +On one hand, the networking traffic increased significantly, and on the other hand, we had to +make sure normal users with limited internet bandwidth could still participate in the consensus mechanism without any problems. +After examining different scenarios, the networking issues were resolved, and +no major problems were reported till the end of Testnet.

+ +

Major updates

+ +

During Testnet-2, we introduced several updates, including versions +0.15.0, +0.16.0, +0.17.0, +0.18.0, +0.19.0, and +0.20.0. +The update process went smoothly, and with the stability of Version 0.20.0 confirmed, +the development team shifted its focus to the Mainnet launch.

+ +

Special 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 PAC coins to set up their validators.

+ +

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

]]>
Pactus 0.20.0 Released2024-01-11T00:00:00+00:002024-01-11T00:00:00+00:00https://pactus.org/2024/01/11/release-0-20-0Overview + +

Pactus Blockchain Version 0.20.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

+ +

Validator Stake Management

+ +

The new GUI application enables users to easily Unbond and Withdraw their validator’s stake.

+ +

Withdraw dialog

+ +

Improving Network Connectivity

+ +

Some users have reported that UDP packets are being dropped by their Internet Service Providers. +Therefore, the UDP protocol is disabled by default. +Users can still activate the UDP protocol by configuring the settings in the file if necessary.

+ +

Also, the experimental Node Gossip feature has been removed in this version. +Node gossip could cause some validators to become isolated from the rest of the network.

+ +

Relay service

+ +

This version enables users to turn their node into a relay service. +A relay service node can help users behind NAT to communicate with each other. +It is disabled by default and can be enabled inside the config file. +Please note that it is still in an experimental state.

+ +

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

+ +
    +
  • implement relay service (#931)
  • +
  • HTTP: Integrate AddRowDouble and update tests (#926)
  • +
  • network: making listen address private in config (#921)
  • +
  • http: adding AvailabilityScore to http module (#917)
  • +
  • network: adding ‘enable_udp’ config (#918)
  • +
  • network: removing gossip node service (#916)
  • +
  • gRPC: adding AvailabilityScore to gRPC (#910)
  • +
  • GUI: unbond and withdraw transaction dialogs (#908)
  • +
+ +

Fix

+ +
    +
  • gRPC: adding missing get raw transaction APIs to gRPC gateway (#925)
  • +
  • network: preventing self dial (#924)
  • +
  • fixing time lag on starting node (#923)
  • +
  • network: fixing network deadlock on linux arm64 (#922)
  • +
  • GUI: updating unbond and withdraw dialogs (#911)
  • +
  • fixing gRPC node info issue (#906)
  • +
+ +

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

]]>
Pactus records its IPs in IPMINTER2024-01-10T00:00:00+00:002024-01-10T00:00:00+00:00https://pactus.org/2024/01/10/pactus-records-its-ips-in-ipminterIPMINTER

+ +

In our continuous pursuit of innovation, the recording of our intellectual property is the +cornerstone philosophy of Pactus. Yet, we found traditional patenting methods to be a +slow and expensive hurdle. That is… until we discovered IPMINTER!

+ +

Pactus profile in IPMINTER

+ +

We are ecstatic to announce that the blockchain-based platform by IPMINTER has +revolutionized the way we secure our creations.

+ +

Gone are the days of lengthy processes and hefty fees. With IPMINTER, registering our +intellectual property on the blockchain was a cakewalk – accomplished in a mere 10 minutes! +Plus, the moment we received our exquisite certificate, complete with a QR code directly linking +to our secure blockchain entry, our confidence in this platform soared.

+ +

Our journey with IPMINTER didn’t end there, it became our trusted ally in the ongoing mission +to protect our inventive proposals. The assurance we’ve experienced using their platform has +been unparalleled.

+ +

We’re proud to share our story and to recommend IPMINTER to those on a quest for a straightforward, +economical, and robust IP recording solution. They have our heartfelt endorsement!

+ +

Join us in embracing the future of IP management with IPMINTER. Record what’s yours, the smart way!

]]>
Mainnet announcement2024-01-08T00:00:00+00:002024-01-08T00:00:00+00:00https://pactus.org/2024/01/08/mainnet-announcementThe much-awaited Mainnet Launch of The Pactus Blockchain is finally here! +On January 24, 2024, at 20:24:00 UTC, the first block, known as the Genesis block, +will be minted by four Bootstrap validators. +After that, every 10 seconds, a new block will be added to the blockchain. +Each block contains the committed transactions in the network. +The block finality in the Pactus blockchain is immediate. +It means that there is no need to wait for block confirmation to ensure a transaction is committed.

+ +

Later, more than 2000 community validators will secure the blockchain and make it decentralized. +These validators are Testnet participants who helped test Pactus during our testing period. +The community validators will receive the initial staking coins from a Discord Bot named RoboPac.

+ +

To ensure everything works smoothly on the Mainnet, three different Testnets ( +Testnet0, +Testnet1, and +Testnet2) have been run.

+ +

The Mainnet will never be stopped or interrupted by the core developers of Pactus, +and validators should primarily participate in and maintain the security of the blockchain.

]]>
Pactus 0.19.0 Released2024-01-04T00:00:00+00:002024-01-04T00:00:00+00:00https://pactus.org/2024/01/04/release-0-19-0Overview + +

Pactus Blockchain Version 0.19.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 has improved the overall performance of the blockchain by implementing +PIP-15. +PIP-15 suggests to add caching algorithms to the database for the most frequently used items.

+ +

Additionally, this version has enhanced the connectivity of the nodes in the P2P network.

+ +

Availability Score

+ +

This version comes with the implementation of PIP-19. +PIP-19 suggests assigning the “Availability Score” to each validator based on their activities in the +committee. +Validators with a score less than 0.8 won’t receive the block reward, +as their proposals will be rejected by other validators. +The main reason behind this PIP is to prevent users from downgrading +their node specifications and running Pactus on machines with low resources.

+ +

Breaking change

+ +

The Docker container now contains both daemon and wallet binary files. +Users who use Docker to run Pacts now need to add the entry point to run Pactus.

+ +

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

+ +
    +
  • gRPC: defining network and peers info response’s properly (#898)
  • +
  • implementing pip-19 (#899)
  • +
  • network: disabling GosipSub, only FloodSub (#895)
  • +
  • www: adding change proposer round and value to consensus info votes (#892)
  • +
  • network: adding relay service to dial relay nodes (#887)
  • +
  • implementing pip-15 (#843)
  • +
  • check already running by lock file (#871)
  • +
+ +

Fix

+ +
    +
  • store: use cache to check if public key exists (#902)
  • +
  • executor: not rejecting bond transaction for bootstrap validator (#901)
  • +
  • GUI: removing unnecessary tags in transaction confirm dialog (#893)
  • +
  • network: close relay connection for public node (#891)
  • +
  • network: refining GossipSubParams for Gossiper node (#882)
  • +
  • sync: adding sequence number to the bundle (#881)
  • +
  • network: turn off mesh for gossiper node (#880)
  • +
  • consensus: check voteset for CP strong termination (#879)
  • +
  • adding querier to query messages (#878)
  • +
  • execution: fixing issue #869 (#870)
  • +
  • fixing logger issue on rotating log file (#859)
  • +
+ +

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

]]>
Pactus 0.18.0 Released2023-12-12T00:00:00+00:002023-12-12T00:00:00+00:00https://pactus.org/2023/12/12/release-0-18-0Overview + +

Pactus Blockchain Version 0.18.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 has significantly improved the syncing progress. +The syncing process concurrently requests blocks from 8 different peers and +actively connects to the most optimal peers for downloading the blockchain.

+ +

Additionally, users can now import private keys into their wallet and securely encrypt them using their wallet password.

+ +

Breaking change

+ +

For Unix-based systems, please note that the working directory for root users has changed from /pactus to /root/pactus.

+ +

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.

+ +

+After you update the node, the configuration file will automatically get updated, keeping the old settings. +If you want to return the configuration file to its default settings, +just delete the current config file and restart the node. +

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • implement pip-14 (#841)
  • +
  • sort wallet addresses (#836)
  • +
  • grpc: endpoints for creating raw transaction (#838)
  • +
  • network reachability API (#834)
  • +
  • implement pip-13 (#835)
  • +
  • subscribing to libp2p eventbus (#831)
  • +
  • implement helper methods for wallet address path (#830)
  • +
  • logger: adding rotate log file after days, compress and maxgae for logger config (#822)
  • +
  • enable bandwidth router metric (#819)
  • +
+ +

Fix

+ +
    +
  • network: refining the connection limit (#849)
  • +
  • corrected mistake when retrieving the reward address (#848)
  • +
  • config: restore default config when it is deleted (#847)
  • +
  • cmd: changing home directory for root users (#846)
  • +
  • removing BasicCheck for hash (#845)
  • +
  • disabling libp2p ping protocol (#844)
  • +
  • build docker file (#839)
  • +
  • sync: ignore publishing a block if it is received before (#829)
  • +
  • network: subscribing to the Libp2p event bus (#828)
  • +
  • sync: ignore block request if blocks are already inside the cache (#817)
  • +
+ +

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

]]>
Pactus 0.17.0 Released2023-11-12T00:00:00+00:002023-11-12T00:00:00+00:00https://pactus.org/2023/11/12/release-0-17-0Overview + +

Pactus Blockchain Version 0.17.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 Testnet has been upgraded and all validators must update their nodes.

+ +

This version will address major networking issues, reduce network usage, and improve overall performance.

+ +

A new node type, “Node Gossips”, has been introduced to help broadcast and spread messages across the network. +Node Gossips support the network by delivering messages to non-gossiping nodes. +This gossip option is disabled by default but can be enabled in the configuration file. +If you are running Pactus on a stable and reliable server, we recommend enabling this option for your node. +Please note that this option is still experimental and subject to potential changes in future releases.

+ +

Node gossip in config 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.

+ +

+After updating the node, the configuration file will be overwritten with a new version. +You need to make modifications to the config file if you had customized it prior to the update. +

+ +

Change log

+ +

This version includes several changes and improvements, such as:

+ +

Feat

+ +
    +
  • network: default configs for bootstrap and relay peers (#812)
  • +
  • introducing node gossip type (#811)
  • +
  • sync: adding remote address to the peer info (#804)
  • +
  • network: adding public address to factory (#795)
  • +
  • network: filter private ips (#793)
  • +
+ +

Fix

+ +
    +
  • upgrading Testnet (#814)
  • +
  • sync: prevent opening sessions indefinitely (#813)
  • +
  • execution: fixing mistake on calculating unbonded power (#806)
  • +
  • network: check connection threshold on gater (#803)
  • +
  • network: no transient connection (#799)
  • +
  • not close connection for bootstrap nodes (#792)
  • +
+ +

Refactor

+ +
    +
  • sync: refactoring sync process (#807)
  • +
+ +

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

]]>
Pactus 0.16.0 Released2023-10-29T00:00:00+00:002023-10-29T00:00:00+00:00https://pactus.org/2023/10/29/release-0-16-0Overview + +

Pactus Blockchain Version 0.16.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 allows users to create new addresses for both validators and accounts. +The networking module has been improved, and users can now set limits on the number of connections. +A random crash on the agreement protocol has been fixed in this version.

+ +

New address dialog

+ +

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

+ +
    +
  • gui: display network ID (#780)
  • +
  • create new validator address (CLI and GUI) (#757)
  • +
  • add community bootstrap nodes to testnet config (#764)
  • +
  • network: implementing connection manager (#773)
  • +
  • network: adding bootstrapper mode to the network config (#760)
  • +
+ +

Fix

+ +
    +
  • network: redefine the network limits (#788)
  • +
  • consensus: not increase the vote-box power on duplicated votes (#785)
  • +
  • network: close connection when unable 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)
  • +
  • consensus: strong termination for the binary agreement (#765)
  • +
  • consensus: not increase the voting power on duplicated binary votes (#762)
  • +
+ +

Refactor

+ +
    +
  • network: refactoring peer manager (#787)
  • +
+ +

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 51, +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-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

+ +

In May 2023, we launched Testnet-1. +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

+ +

Major updates

+ +

During Testnet-1, we released three versions(Version +0.11.0, +0.12.0, +0.13.0), and the upgrade process was smooth. +Unfortunately, during Testnet-1, we encountered a consensus failure that may occur at any time in the future. +The consensus failure was resolved by requiring some validators to re-sync their nodes. +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.

+ +

Special 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 PAC coins to set up their validators.

+ +

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.

]]>
\ No newline at end of file diff --git a/zh/index.html b/zh/index.html new file mode 100644 index 000000000..4e0df5e0d --- /dev/null +++ b/zh/index.html @@ -0,0 +1,601 @@ + + + + + + + + + + + + + 主页 | 帕图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + +
+
+
+
+ Pactus - a real Proof-of-Stake blockchain +
+
+
+
+
帕图斯区块链
+
帕图斯是一个由社区运营的区块链技术。
采用了革命性且安全的Solid State Proof of Stake共识机制。
快来加入我们,共同构建去中心化的未来吧!
+
+ +
+
+
+ +
+
+
+


运行节点

+ 下载最新版本的节点程序,创建您的钱包,并开始运行节点。
帕图斯是一款轻量、友好、易于操作的节点程序。 + + +
+
+ <br> 运行节点 +
+
+ +
+
+ <br> 获取代币 +
+
+


获取代币

+ 节点运行之后,您可以质押代币成为验证者。获取方式有多种,比如购买,好友赠送等。也可以加入我们的社区参与贡献获取代币奖励。 + + +
+
+ +
+
+


成为验证者

+ 通过抵押代币,您的节点将升级为验证者节点,验证者节点有机会当选委员会成员,每当您提出一个block时,您将获得 1 个 PAC 代币作为奖励。 + +
+ 资料 +
+
+
+ <br> 成为验证者 +
+
+ +
+
+ <br> 让帕图斯变得更好 +
+
+


让帕图斯变得更好

+ 相信帕图斯在所有验证者和社区贡献者的支持下会变的更好。
让我们一起努力,共同创造属于我们的世界! + + +
+
+
+ +
+
+
+

合作伙伴

+
+
+
+ + Sensifia + +
+
+ + IPMINTER + +
+
+
+
+
+ +
+
+
+

Our Validators

+
+
+
+ + SGTstake + +
+
+ + NodeSync.Top + +
+
+ + CodeBlockLabs + +
+
+ + CoreNode + +
+
+ + CoreNode + +
+
+ + Validator247 + +
+
+ + VNBnode + +
+
+ + Ionode + +
+
+ + dnsarz + +
+
+ + genznodes + +
+
+ + node39 + +
+
+ + tpes + +
+
+ + oshvank + +
+
+ + testnetnodes + +
+
+ + p10node + +
+
+ + kenz + +
+
+ + blocksync + +
+
+ + adora + +
+
+ + ykpbb + +
+
+ + validator-wiki + +
+
+ + nodeops + +
+
+ + catsmile + +
+
+ + str + +
+
+ + tpes + +
+
+
+
+ + + + + +
+ + +
+ + diff --git a/zh/learn/api/grpc/index.html b/zh/learn/api/grpc/index.html new file mode 100644 index 000000000..f947e8ed3 --- /dev/null +++ b/zh/learn/api/grpc/index.html @@ -0,0 +1,3656 @@ + + + + + + + + + + + + + gRPC API Reference | 帕图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

gRPC API Reference

+ +

Each node in the Pactus network can be configured to use the gRPC protocol for communication. +Here you can find the list of all gRPC methods and messages.

+ +

Table of Contents

+ +
+ +
+ +

Transaction Service transaction.proto

+

Transaction service defines various RPC methods for interacting with transactions.

+

GetTransaction rpc

+
Request message: GetTransactionRequest
+
Response message: GetTransactionResponse
+

GetTransaction retrieves transaction details based on the provided request parameters.

+

CalculateFee rpc

+
Request message: CalculateFeeRequest
+
Response message: CalculateFeeResponse
+

CalculateFee calculates the transaction fee based on the specified amount and payload type.

+

BroadcastTransaction rpc

+ + +

BroadcastTransaction broadcasts a signed transaction to the network.

+

GetRawTransferTransaction rpc

+ +
Response message: GetRawTransactionResponse
+

GetRawTransferTransaction retrieves raw details of a transfer transaction.

+

GetRawBondTransaction rpc

+ +
Response message: GetRawTransactionResponse
+

GetRawBondTransaction retrieves raw details of a bond transaction.

+

GetRawUnBondTransaction rpc

+ +
Response message: GetRawTransactionResponse
+

GetRawUnBondTransaction retrieves raw details of an unbond transaction.

+

GetRawWithdrawTransaction rpc

+ +
Response message: GetRawTransactionResponse
+

GetRawWithdrawTransaction retrieves raw details of a withdraw transaction.

+

Blockchain Service blockchain.proto

+

Blockchain service defines RPC methods for interacting with the blockchain.

+

GetBlock rpc

+
Request message: GetBlockRequest
+
Response message: GetBlockResponse
+

GetBlock retrieves information about a block based on the provided request parameters.

+

GetBlockHash rpc

+
Request message: GetBlockHashRequest
+
Response message: GetBlockHashResponse
+

GetBlockHash retrieves the hash of a block at the specified height.

+

GetBlockHeight rpc

+
Request message: GetBlockHeightRequest
+
Response message: GetBlockHeightResponse
+

GetBlockHeight retrieves the height of a block with the specified hash.

+

GetBlockchainInfo rpc

+
Request message: GetBlockchainInfoRequest
+
Response message: GetBlockchainInfoResponse
+

GetBlockchainInfo retrieves general information about the blockchain.

+

GetConsensusInfo rpc

+
Request message: GetConsensusInfoRequest
+
Response message: GetConsensusInfoResponse
+

GetConsensusInfo retrieves information about the consensus instances.

+

GetAccount rpc

+
Request message: GetAccountRequest
+
Response message: GetAccountResponse
+

GetAccount retrieves information about an account based on the provided address.

+

GetValidator rpc

+
Request message: GetValidatorRequest
+
Response message: GetValidatorResponse
+

GetValidator retrieves information about a validator based on the provided address.

+

GetValidatorByNumber rpc

+ +
Response message: GetValidatorResponse
+

GetValidatorByNumber retrieves information about a validator based on the provided number.

+

GetValidatorAddresses rpc

+ + +

GetValidatorAddresses retrieves a list of all validator addresses.

+

GetPublicKey rpc

+
Request message: GetPublicKeyRequest
+
Response message: GetPublicKeyResponse
+

GetPublicKey retrieves the public key of an account based on the provided address.

+

Network Service network.proto

+

Network service provides RPCs for retrieving information about the network.

+

GetNetworkInfo rpc

+
Request message: GetNetworkInfoRequest
+
Response message: GetNetworkInfoResponse
+

GetNetworkInfo retrieves information about the overall network.

+

GetNodeInfo rpc

+
Request message: GetNodeInfoRequest
+
Response message: GetNodeInfoResponse
+

GetNodeInfo retrieves information about a specific node in the network.

+

Wallet Service wallet.proto

+

Define the Wallet service with various RPC methods for wallet management.

+

CreateWallet rpc

+
Request message: CreateWalletRequest
+
Response message: CreateWalletResponse
+

CreateWallet creates a new wallet with the specified parameters.

+

LoadWallet rpc

+
Request message: LoadWalletRequest
+
Response message: LoadWalletResponse
+

LoadWallet loads an existing wallet with the given name.

+

UnloadWallet rpc

+
Request message: UnloadWalletRequest
+
Response message: UnloadWalletResponse
+

UnloadWallet unloads a currently loaded wallet with the specified name.

+

LockWallet rpc

+
Request message: LockWalletRequest
+
Response message: LockWalletResponse
+

LockWallet locks a currently loaded wallet with the provided password and timeout.

+

UnlockWallet rpc

+
Request message: UnlockWalletRequest
+
Response message: UnlockWalletResponse
+

UnlockWallet unlocks a locked wallet with the provided password and timeout.

+

SignRawTransaction rpc

+
Request message: SignRawTransactionRequest
+
Response message: SignRawTransactionResponse
+

SignRawTransaction signs a raw transaction for a specified wallet.

+

GetValidatorAddress rpc

+ +
Response message: GetValidatorAddressResponse
+

GetValidatorAddress retrieves the validator address associated with a public key.

+

Messages and Enums

+

+BroadcastTransactionRequest +msg +

+

Request message for broadcasting a signed transaction.

+ + + + + + + + + + + + +
FieldTypeDescription
signed_raw_transaction + bytes + Signed raw transaction data.
+

+BroadcastTransactionResponse +msg +

+

Response message containing the ID of the broadcasted transaction.

+ + + + + + + + + + + + +
FieldTypeDescription
id + bytes + Transaction ID.
+

+CalculateFeeRequest +msg +

+

Request message for calculating transaction fee.

+ + + + + + + + + + + + + + + + + +
FieldTypeDescription
amount + int64 + Transaction amount.
payloadType + PayloadType + Type of transaction payload.
+

+CalculateFeeResponse +msg +

+

Response message containing the calculated transaction fee.

+ + + + + + + + + + + + +
FieldTypeDescription
fee + int64 + Calculated transaction fee.
+

+GetRawBondTransactionRequest +msg +

+

Request message for retrieving raw details of a bond transaction.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
lock_time + uint32 + Lock time for the transaction.
sender + string + Sender's address.
receiver + string + Receiver's address.
stake + int64 + Stake amount.
public_key + string + Public key of the validator.
fee + int64 + Transaction fee.
memo + string + Transaction memo.
+

+GetRawTransactionResponse +msg +

+

Response message containing raw transaction data.

+ + + + + + + + + + + + +
FieldTypeDescription
raw_transaction + bytes + Raw transaction data.
+

+GetRawTransferTransactionRequest +msg +

+

Request message for retrieving raw details of a transfer transaction.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
lock_time + uint32 + Lock time for the transaction.
sender + string + Sender's address.
receiver + string + Receiver's address.
amount + int64 + Transaction amount.
fee + int64 + Transaction fee.
memo + string + Transaction memo.
+

+GetRawUnBondTransactionRequest +msg +

+

Request message for retrieving raw details of an unbond transaction.

+ + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
lock_time + uint32 + Lock time for the transaction.
validator_address + string + Address of the validator to unbond from.
memo + string + Transaction memo.
+

+GetRawWithdrawTransactionRequest +msg +

+

Request message for retrieving raw details of a withdraw transaction.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
lock_time + uint32 + Lock time for the transaction.
validator_address + string + Address of the validator to withdraw from.
account_address + string + Address of the account to withdraw to.
fee + int64 + Transaction fee.
amount + int64 + Withdrawal amount.
memo + string + Transaction memo.
+

+GetTransactionRequest +msg +

+

Request message for retrieving transaction details.

+ + + + + + + + + + + + + + + + + +
FieldTypeDescription
id + bytes + Transaction ID.
verbosity + TransactionVerbosity + Verbosity level for transaction details.
+

+GetTransactionResponse +msg +

+

Response message containing details of a transaction.

+ + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
block_height + uint32 + Height of the block containing the transaction.
block_time + uint32 + Time of the block containing the transaction.
transaction + TransactionInfo + Information about the transaction.
+

+PayloadBond +msg +

+

Payload for a bond transaction.

+ + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
sender + string + Sender's address.
receiver + string + Receiver's address.
stake + int64 + Stake amount.
+

+PayloadSortition +msg +

+

Payload for a sortition transaction.

+ + + + + + + + + + + + + + + + + +
FieldTypeDescription
address + string + Address associated with the sortition.
proof + bytes + Proof for the sortition.
+

+PayloadTransfer +msg +

+

Payload for a transfer transaction.

+ + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
sender + string + Sender's address.
receiver + string + Receiver's address.
amount + int64 + Transaction amount.
+

+PayloadUnbond +msg +

+

Payload for an unbond transaction.

+ + + + + + + + + + + + +
FieldTypeDescription
validator + string + Address of the validator to unbond from.
+

+PayloadWithdraw +msg +

+

Payload for a withdraw transaction.

+ + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
from + string + Address to withdraw from.
to + string + Address to withdraw to.
amount + int64 + Withdrawal amount.
+

+TransactionInfo +msg +

+

Information about a transaction.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
id + bytes + Transaction ID.
data + bytes + Transaction data.
version + int32 + Transaction version.
lock_time + uint32 + Lock time for the transaction.
value + int64 + Transaction value.
fee + int64 + Transaction fee.
payloadType + PayloadType + Type of transaction payload.
transfer + PayloadTransfer + Transfer payload.
bond + PayloadBond + Bond payload.
sortition + PayloadSortition + Sortition payload.
unbond + PayloadUnbond + Unbond payload.
withdraw + PayloadWithdraw + Withdraw payload.
memo + string + Transaction memo.
public_key + string + Public key associated with the transaction.
signature + bytes + Transaction signature.
+

+AccountInfo +msg +

+

Message containing information about an account.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
hash + bytes + Hash of the account.
data + bytes + Account data.
number + int32 + Account number.
balance + int64 + Account balance.
address + string + Address of the account.
+

+BlockHeaderInfo +msg +

+

Message containing information about the header of a block.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
version + int32 + Block version.
prev_block_hash + bytes + Hash of the previous block.
state_root + bytes + State root of the block.
sortition_seed + bytes + Sortition seed of the block.
proposer_address + string + Address of the proposer of the block.
+

+CertificateInfo +msg +

+

Message containing information about a certificate.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
hash + bytes + Hash of the certificate.
round + int32 + Round of the certificate.
committersrepeated + int32 + List of committers in the certificate.
absenteesrepeated + int32 + List of absentees in the certificate.
signature + bytes + Certificate signature.
+

+ConsensusInfo +msg +

+

Message containing information about consensus.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
address + string + Address of the consensus instance.
Active + bool + Whether the consensus instance is active.
height + uint32 + Height of the consensus instance.
round + int32 + Round of the consensus instance.
votesrepeated + VoteInfo + List of votes in the consensus instance.
+

+GetAccountRequest +msg +

+

Message to request account information based on an address.

+ + + + + + + + + + + + +
FieldTypeDescription
address + string + Address of the account.
+

+GetAccountResponse +msg +

+

Message containing the response with account information.

+ + + + + + + + + + + + +
FieldTypeDescription
account + AccountInfo + Account information.
+

+GetBlockHashRequest +msg +

+

Message to request block hash based on height.

+ + + + + + + + + + + + +
FieldTypeDescription
height + uint32 + Height of the block.
+

+GetBlockHashResponse +msg +

+

Message containing the response with the block hash.

+ + + + + + + + + + + + +
FieldTypeDescription
hash + bytes + Hash of the block.
+

+GetBlockHeightRequest +msg +

+

Message to request block height based on hash.

+ + + + + + + + + + + + +
FieldTypeDescription
hash + bytes + Hash of the block.
+

+GetBlockHeightResponse +msg +

+

Message containing the response with the block height.

+ + + + + + + + + + + + +
FieldTypeDescription
height + uint32 + Height of the block.
+

+GetBlockRequest +msg +

+

Message to request block information based on height and verbosity.

+ + + + + + + + + + + + + + + + + +
FieldTypeDescription
height + uint32 + Height of the block.
verbosity + BlockVerbosity + Verbosity level for block information.
+

+GetBlockResponse +msg +

+

Message containing the response with block information.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
height + uint32 + Height of the block.
hash + bytes + Hash of the block.
data + bytes + Block data.
block_time + uint32 + Block timestamp.
header + BlockHeaderInfo + Block header information.
prev_cert + CertificateInfo + Certificate information of the previous block.
txsrepeated + TransactionInfo + List of transactions in the block.
+

+GetBlockchainInfoRequest +msg +

+

Message to request general information about the blockchain.

+

Message has no fields.

+

+GetBlockchainInfoResponse +msg +

+

Message containing the response with general blockchain information.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
last_block_height + uint32 + Height of the last block.
last_block_hash + bytes + Hash of the last block.
total_accounts + int32 + Total number of accounts.
total_validators + int32 + Total number of validators.
total_power + int64 + Total power in the blockchain.
committee_power + int64 + Power of the committee.
committee_validatorsrepeated + ValidatorInfo + List of committee validators.
+

+GetConsensusInfoRequest +msg +

+

Message to request consensus information.

+

Message has no fields.

+

+GetConsensusInfoResponse +msg +

+

Message containing the response with consensus information.

+ + + + + + + + + + + + +
FieldTypeDescription
instancesrepeated + ConsensusInfo + List of consensus instances.
+

+GetPublicKeyRequest +msg +

+

Message to request public key based on an address.

+ + + + + + + + + + + + +
FieldTypeDescription
address + string + Address for which public key is requested.
+

+GetPublicKeyResponse +msg +

+

Message containing the response with the public key.

+ + + + + + + + + + + + +
FieldTypeDescription
public_key + string + Public key of the account.
+

+GetValidatorAddressesRequest +msg +

+

Message to request validator addresses.

+

Message has no fields.

+

+GetValidatorAddressesResponse +msg +

+

Message containing the response with a list of validator addresses.

+ + + + + + + + + + + + +
FieldTypeDescription
addressesrepeated + string + List of validator addresses.
+

+GetValidatorByNumberRequest +msg +

+

Message to request validator information based on a validator number.

+ + + + + + + + + + + + +
FieldTypeDescription
number + int32 + Validator number.
+

+GetValidatorRequest +msg +

+

Message to request validator information based on an address.

+ + + + + + + + + + + + +
FieldTypeDescription
address + string + Address of the validator.
+

+GetValidatorResponse +msg +

+

Message containing the response with validator information.

+ + + + + + + + + + + + +
FieldTypeDescription
validator + ValidatorInfo + Validator information.
+

+ValidatorInfo +msg +

+

Message containing information about a validator.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
hash + bytes + Hash of the validator.
data + bytes + Validator data.
public_key + string + Public key of the validator.
number + int32 + Validator number.
stake + int64 + Validator stake.
last_bonding_height + uint32 + Last bonding height.
last_sortition_height + uint32 + Last sortition height.
unbonding_height + uint32 + Unbonding height.
address + string + Address of the validator.
availability_score + double + Availability score of the validator.
+

+VoteInfo +msg +

+

Message containing information about a vote.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
type + VoteType + Type of the vote.
voter + string + Voter's address.
block_hash + bytes + Hash of the block being voted on.
round + int32 + Round of the vote.
cp_round + int32 + Consensus round of the vote.
cp_value + int32 + Consensus value of the vote.
+

+GetNetworkInfoRequest +msg +

+

Request message for retrieving overall network information.

+

Message has no fields.

+

+GetNetworkInfoResponse +msg +

+

Response message containing information about the overall network.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
network_name + string + Name of the network.
total_sent_bytes + uint32 + Total bytes sent across the network.
total_received_bytes + uint32 + Total bytes received across the network.
connected_peers_count + uint32 + Number of connected peers.
connected_peersrepeated + PeerInfo + List of connected peers.
sent_bytesrepeated + GetNetworkInfoResponse.SentBytesEntry + Bytes sent per peer ID.
received_bytesrepeated + GetNetworkInfoResponse.ReceivedBytesEntry + Bytes received per peer ID.
+

+GetNetworkInfoResponse.ReceivedBytesEntry +msg +

+

+ + + + + + + + + + + + + + + + + +
FieldTypeDescription
key + uint32 +
value + uint64 +
+

+GetNetworkInfoResponse.SentBytesEntry +msg +

+

+ + + + + + + + + + + + + + + + + +
FieldTypeDescription
key + uint32 +
value + uint64 +
+

+GetNodeInfoRequest +msg +

+

Request message for retrieving information about a specific node in the network.

+

Message has no fields.

+

+GetNodeInfoResponse +msg +

+

Response message containing information about a specific node in the network.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
moniker + string + Moniker of the node.
agent + string + Agent information of the node.
peer_id + bytes + Peer ID of the node.
started_at + uint64 + Timestamp when the node started.
reachability + string + Reachability status of the node.
servicesrepeated + int32 + List of services provided by the node.
services_namesrepeated + string + Names of services provided by the node.
addrsrepeated + string + List of addresses associated with the node.
protocolsrepeated + string + List of protocols supported by the node.
+

+PeerInfo +msg +

+

Information about a peer in the network.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
status + int32 + Status of the peer.
moniker + string + Moniker of the peer.
agent + string + Agent information of the peer.
peer_id + bytes + Peer ID of the peer.
consensus_keysrepeated + string + Consensus keys used by the peer.
consensus_addressrepeated + string + Consensus address of the peer.
services + uint32 + Services provided by the peer.
last_block_hash + bytes + Hash of the last block the peer knows.
height + uint32 + Height of the peer in the blockchain.
received_messages + int32 + Count of received messages.
invalid_messages + int32 + Count of invalid messages received.
last_sent + int64 + Timestamp of the last sent message.
last_received + int64 + Timestamp of the last received message.
sent_bytesrepeated + PeerInfo.SentBytesEntry + Bytes sent per message type.
received_bytesrepeated + PeerInfo.ReceivedBytesEntry + Bytes received per message type.
address + string + Network address of the peer.
direction + string + Direction of connection with the peer.
protocolsrepeated + string + List of protocols supported by the peer.
total_sessions + int32 + Total sessions with the peer.
completed_sessions + int32 + Completed sessions with the peer.
+

+PeerInfo.ReceivedBytesEntry +msg +

+

+ + + + + + + + + + + + + + + + + +
FieldTypeDescription
key + int32 +
value + int64 +
+

+PeerInfo.SentBytesEntry +msg +

+

+ + + + + + + + + + + + + + + + + +
FieldTypeDescription
key + int32 +
value + int64 +
+

+CreateWalletRequest +msg +

+

Request message for creating a new wallet.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
wallet_name + string + Name of the new wallet.
mnemonic + string + Mnemonic for wallet recovery.
language + string + Language for the mnemonic.
password + string + Password for securing the wallet.
+

+CreateWalletResponse +msg +

+

Response message containing the name of the created wallet.

+ + + + + + + + + + + + +
FieldTypeDescription
wallet_name + string + Name of the created wallet.
+

+GetValidatorAddressRequest +msg +

+

Request message for obtaining the validator address associated with a public key.

+ + + + + + + + + + + + +
FieldTypeDescription
public_key + string + Public key for which the validator address is requested.
+

+GetValidatorAddressResponse +msg +

+

Response message containing the validator address corresponding to a public key.

+ + + + + + + + + + + + +
FieldTypeDescription
address + string + Validator address associated with the public key.
+

+LoadWalletRequest +msg +

+

Request message for loading an existing wallet.

+ + + + + + + + + + + + +
FieldTypeDescription
wallet_name + string + Name of the wallet to load.
+

+LoadWalletResponse +msg +

+

Response message containing the name of the loaded wallet.

+ + + + + + + + + + + + +
FieldTypeDescription
wallet_name + string + Name of the loaded wallet.
+

+LockWalletRequest +msg +

+

Request message for locking a currently loaded wallet.

+ + + + + + + + + + + + +
FieldTypeDescription
wallet_name + string + Name of the wallet to lock.
+

+LockWalletResponse +msg +

+

Response message containing the name of the locked wallet.

+ + + + + + + + + + + + +
FieldTypeDescription
wallet_name + string + Name of the locked wallet.
+

+SignRawTransactionRequest +msg +

+

Request message for signing a raw transaction.

+ + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
wallet_name + string + Name of the wallet used for signing.
raw_transaction + bytes + Raw transaction data to be signed.
password + string + Password for unlocking the wallet for signing.
+

+SignRawTransactionResponse +msg +

+

Response message containing the transaction ID and signed raw transaction.

+ + + + + + + + + + + + + + + + + +
FieldTypeDescription
transaction_id + bytes + ID of the signed transaction.
signed_raw_transaction + bytes + Signed raw transaction data.
+

+UnloadWalletRequest +msg +

+

Request message for unloading a currently loaded wallet.

+ + + + + + + + + + + + +
FieldTypeDescription
wallet_name + string + Name of the wallet to unload.
+

+UnloadWalletResponse +msg +

+

Response message containing the name of the unloaded wallet.

+ + + + + + + + + + + + +
FieldTypeDescription
wallet_name + string + Name of the unloaded wallet.
+

+UnlockWalletRequest +msg +

+

Request message for unlocking a wallet.

+ + + + + + + + + + + + + + + + + + + + + + +
FieldTypeDescription
wallet_name + string + Name of the wallet to unlock.
password + string + Password for unlocking the wallet.
timeout + int32 + Timeout duration for the unlocked state.
+

+UnlockWalletResponse +msg +

+

Response message containing the name of the unlocked wallet.

+ + + + + + + + + + + + +
FieldTypeDescription
wallet_name + string + Name of the unlocked wallet.
+ +

+PayloadType +enum +

+

Enumeration for different types of transaction payloads.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameNumberDescription
UNKNOWN0Unknown payload type.
TRANSFER_PAYLOAD1Transfer payload type.
BOND_PAYLOAD2Bond payload type.
SORTITION_PAYLOAD3Sortition payload type.
UNBOND_PAYLOAD4Unbond payload type.
WITHDRAW_PAYLOAD5Withdraw payload type.
+

+TransactionVerbosity +enum +

+

Enumeration for verbosity level when requesting transaction details.

+ + + + + + + + + + + + + + + + + + + +
NameNumberDescription
TRANSACTION_DATA0Request only transaction data.
TRANSACTION_INFO1Request detailed transaction information.
+

+BlockVerbosity +enum +

+

Enumeration for verbosity level when requesting block information.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameNumberDescription
BLOCK_DATA0Request block data only.
BLOCK_INFO1Request block information only.
BLOCK_TRANSACTIONS2Request block transactions only.
+

+VoteType +enum +

+

Enumeration for types of votes.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameNumberDescription
VOTE_UNKNOWN0Unknown vote type.
VOTE_PREPARE1Prepare vote type.
VOTE_PRECOMMIT2Precommit vote type.
VOTE_CHANGE_PROPOSER3Change proposer vote type.
+ +

Scalar Value Types

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
.proto TypeC++JavaPythonGoC#PHP
doubledoubledoublefloatfloat64doublefloat
floatfloatfloatfloatfloat32floatfloat
int32int32intintint32intinteger
int64int64longint/longint64longinteger/string
uint32uint32intint/longuint32uintinteger
uint64uint64longint/longuint64ulonginteger/string
sint32int32intintint32intinteger
sint64int64longint/longint64longinteger/string
fixed32uint32intintuint32uintinteger
fixed64uint64longint/longuint64ulonginteger/string
sfixed32int32intintint32intinteger
sfixed64int64longint/longint64longinteger/string
boolboolbooleanbooleanboolboolboolean
stringstringStringstr/unicodestringstringstring
bytesstringByteStringstr[]byteByteStringstring
+ +
+
+
+ + + + + diff --git a/zh/learn/blockchain/account/index.html b/zh/learn/blockchain/account/index.html new file mode 100644 index 000000000..14e17f5a2 --- /dev/null +++ b/zh/learn/blockchain/account/index.html @@ -0,0 +1,663 @@ + + + + + + + + + + + + + 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 in the Pactus blockchain that holds 21 million coins at the genesis time. +The treasury address is defined as: 000000000000000000000000000000000000000000. +The address type is 0, and therefore, +it doesn’t have any key pair associated with it. +Every time a block is created, one coin from the Treasury account transfers to the proposer account as a block reward.

+ +
+
+
+ + + + + diff --git a/zh/learn/blockchain/address/index.html b/zh/learn/blockchain/address/index.html new file mode 100644 index 000000000..649ab529d --- /dev/null +++ b/zh/learn/blockchain/address/index.html @@ -0,0 +1,670 @@ + + + + + + + + + + + + + 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..3309707da --- /dev/null +++ b/zh/learn/blockchain/block/index.html @@ -0,0 +1,786 @@ + + + + + + + + + + + + + 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..965a7b3e1 --- /dev/null +++ b/zh/learn/blockchain/cryptography/index.html @@ -0,0 +1,649 @@ + + + + + + + + + + + + + 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..8645b91d2 --- /dev/null +++ b/zh/learn/blockchain/genesis/index.html @@ -0,0 +1,671 @@ + + + + + + + + + + + + + Genesis | 帕图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Genesis

+ +

The Pactus blockchain starts from scratch, with no pre-existing accounts or pre-allocated coins. +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 51 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 +holds 21 million coins at the genesis time. Each coin is divided into 1 billion units.
  • +
  • Reserved Accounts: Reserved account are defined at the Genesis time and at total they have 21 milion coins. +These coins are reserved and the main purpise is to support the project over time.
  • +
  • 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..bac4a163c --- /dev/null +++ b/zh/learn/blockchain/incentive/index.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + Incentive | 帕图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Incentive

+ +
+

The incentive may help encourage nodes to stay honest.

+ +

Satoshi Nakamoto

+
+ +

In Pactus, rewards are given to validators for collecting valid transactions and creating new blocks. +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 42,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..353c18d83 --- /dev/null +++ b/zh/learn/blockchain/serialization/index.html @@ -0,0 +1,774 @@ + + + + + + + + + + + + + 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..f4fc3932e --- /dev/null +++ b/zh/learn/blockchain/state-hash/index.html @@ -0,0 +1,681 @@ + + + + + + + + + + + + + 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..2e3df2035 --- /dev/null +++ b/zh/learn/blockchain/validator/index.html @@ -0,0 +1,677 @@ + + + + + + + + + + + + + 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..6e63c97db --- /dev/null +++ b/zh/learn/consensus/committee/index.html @@ -0,0 +1,765 @@ + + + + + + + + + + + + + Committee | 帕图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Committee

+ +

The committee is a group of 51 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 51 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 51. +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 51 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%51357\(3.34 \times 10^{-14}\)
15%996714\(1.41 \times 10^{-24}\)
10%21152\(3.39 \times 10^{-09}\)
10%51355\(1.90 \times 10^{-18}\)
10%99679\(2.91 \times 10^{-35}\)
5%21151\(2.81 \times 10^{-13}\)
5%51352\(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..7118bfe93 --- /dev/null +++ b/zh/learn/consensus/parameters/index.html @@ -0,0 +1,663 @@ + + + + + + + + + + + + + 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 51 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..b5e40a3b8 --- /dev/null +++ b/zh/learn/consensus/proof-of-stake/index.html @@ -0,0 +1,684 @@ + + + + + + + + + + + + + Solid State Proof of Stake | 帕图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Solid State 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..f34212767 --- /dev/null +++ b/zh/learn/consensus/protocol/index.html @@ -0,0 +1,885 @@ + + + + + + + + + + + + + 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+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..470c46a12 --- /dev/null +++ b/zh/learn/consensus/sortition/index.html @@ -0,0 +1,781 @@ + + + + + + + + + + + + + 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..460e8ac8d --- /dev/null +++ b/zh/learn/consensus/specification/index.html @@ -0,0 +1,661 @@ + + + + + + + + + + + + + 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..a83402a71 --- /dev/null +++ b/zh/learn/index.html @@ -0,0 +1,502 @@ + + + + + + + + + + + + + 资料 | 帕图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+

资料

+ +

在这里,您可以找到帕图斯项目的技术文档。

+ +

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..d01001fa0 --- /dev/null +++ b/zh/learn/smart-contract/storage/index.html @@ -0,0 +1,738 @@ + + + + + + + + + + + + + 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..2e2232cac --- /dev/null +++ b/zh/learn/transaction/bond/index.html @@ -0,0 +1,669 @@ + + + + + + + + + + + + + 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
VariantAmount
+ +
    +
  • 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..42b9a8db7 --- /dev/null +++ b/zh/learn/transaction/fee/index.html @@ -0,0 +1,671 @@ + + + + + + + + + + + + + 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..c970bbc90 --- /dev/null +++ b/zh/learn/transaction/format/index.html @@ -0,0 +1,708 @@ + + + + + + + + + + + + + Transaction Format | 帕图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

Transaction Format

+ +

Transactions in Pactus consists the following fields:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SizeField
1 byteVersion
4 bytesLock Time
VariantFee
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..8017cb81d --- /dev/null +++ b/zh/learn/transaction/sortition/index.html @@ -0,0 +1,659 @@ + + + + + + + + + + + + + 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..93b0bf10a --- /dev/null +++ b/zh/learn/transaction/transfer/index.html @@ -0,0 +1,673 @@ + + + + + + + + + + + + + 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
VariantAmount
+ +
    +
  • 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..83630f0c8 --- /dev/null +++ b/zh/learn/transaction/unbond/index.html @@ -0,0 +1,650 @@ + + + + + + + + + + + + + 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..daa13fd9a --- /dev/null +++ b/zh/learn/transaction/withdraw/index.html @@ -0,0 +1,659 @@ + + + + + + + + + + + + + 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
VariantAmount
+ +
    +
  • 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..0c9b8774d --- /dev/null +++ b/zh/sitemap.xml @@ -0,0 +1,272 @@ + + + +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/29/release-0-16-0.html +2023-10-29T00:00:00+00:00 + + +https://pactus.org/2023/11/12/release-0-17-0.html +2023-11-12T00:00:00+00:00 + + +https://pactus.org/2023/12/12/release-0-18-0.html +2023-12-12T00:00:00+00:00 + + +https://pactus.org/2024/01/04/release-0-19-0.html +2024-01-04T00:00:00+00:00 + + +https://pactus.org/2024/01/08/mainnet-announcement.html +2024-01-08T00:00:00+00:00 + + +https://pactus.org/2024/01/10/pactus-records-its-ips-in-ipminter.html +2024-01-10T00:00:00+00:00 + + +https://pactus.org/2024/01/11/release-0-20-0.html +2024-01-11T00:00:00+00:00 + + +https://pactus.org/2024/01/22/testnet-2-concluded.html +2024-01-22T00:00:00+00:00 + + +https://pactus.org/2024/01/24/mainnet-launched.html +2024-01-24T20:24:00+00:00 + + +https://pactus.org/2024/01/31/release-1-0-0.html +2024-01-31T00:00:00+00:00 + + +https://pactus.org/2024/02/10/release-1-0-1.html +2024-02-10T00:00:00+00:00 + + +https://pactus.org/2024/02/18/release-1-0-2.html +2024-02-18T00:00:00+00:00 + + +https://pactus.org/blog/ + + +https://pactus.org/ + + +https://pactus.org/community/ + + +https://pactus.org/contributing/ + + +https://pactus.org/user-guides/run-pactus-docker/ + + +https://pactus.org/user-guides/send-transactions-gui/ + + +https://pactus.org/user-guides/grpc-sign-transactions/ + + +https://pactus.org/user-guides/reduce-network/ + + +https://pactus.org/user-guides/run-pactus-cli/ + + +https://pactus.org/user-guides/run-pactus-metrics/ + + +https://pactus.org/user-guides/run-pactus-gui/ + + +https://pactus.org/user-guides/use-wallet-cli/ + + +https://pactus.org/user-guides/ + + +https://pactus.org/download/ + + +https://pactus.org/term-of-use/ + + +https://pactus.org/about/what-is-pactus/ + + +https://pactus.org/about/roadmap/ + + +https://pactus.org/about/faq/ + + +https://pactus.org/learn/blockchain/block/ + + +https://pactus.org/learn/blockchain/state-hash/ + + +https://pactus.org/learn/blockchain/account/ + + +https://pactus.org/learn/blockchain/genesis/ + + +https://pactus.org/learn/blockchain/validator/ + + +https://pactus.org/learn/blockchain/cryptography/ + + +https://pactus.org/learn/blockchain/address/ + + +https://pactus.org/learn/blockchain/incentive/ + + +https://pactus.org/learn/blockchain/serialization/ + + +https://pactus.org/learn/consensus/specification/ + + +https://pactus.org/learn/consensus/proof-of-stake/ + + +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/smart-contract/storage/ + + +https://pactus.org/learn/transaction/transfer/ + + +https://pactus.org/learn/transaction/fee/ + + +https://pactus.org/learn/transaction/withdraw/ + + +https://pactus.org/learn/transaction/unbond/ + + +https://pactus.org/learn/transaction/bond/ + + +https://pactus.org/learn/transaction/format/ + + +https://pactus.org/learn/transaction/sortition/ + + +https://pactus.org/learn/api/grpc/ + + +https://pactus.org/learn/ + + diff --git a/zh/term-of-use/index.html b/zh/term-of-use/index.html new file mode 100644 index 000000000..c34d5c6d1 --- /dev/null +++ b/zh/term-of-use/index.html @@ -0,0 +1,560 @@ + + + + + + + + + + + + + Term of Use | 帕图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+

Terms of Use

+ +

Welcome to Pactus.

+ +

By using our website or services, you agree to these Terms of Use (“Terms”). +Please review them carefully. +If you do not accept the Terms, please do not use our website or services.

+ +

We may update the Terms occasionally. +Your continued use of our website or services after any changes means you accept the updates. +If you do not agree to the updates, please stop using our website and services.

+ +

“We,” “us,” “our,” and “Pactus” refer to the Pactus Blockchain Project. “You” refers to each user of our +website or services.

+ +

Website Access and Modifications

+ +

We strive to provide continuous website access but cannot guarantee uninterrupted or error-free service. +Pactus is not liable for any inaccessible features or website unavailability.

+ +

We may modify, expand, limit, or discontinue any part of the website or +services at any time to accommodate users or for other reasons, without notice. +We reserve the right to suspend website access temporarily or permanently, at our discretion, without notice.

+ +

Users may need to update their computer hardware or software to access some website content or features. +Pactus is not responsible for any inability to access the website or services due to user systems, +internet networks, or other causes.

+ +

Age Limit

+ +

Our website and services are not intended for those under 18. +If you are under 18, you may only use this website with the supervision of a parent, guardian, or other responsible adult.

+ +

No Personalized Advice

+ +

This website does not provide individualized legal, tax, financial, or investment advice. +Since everyone’s situation is different, we recommend consulting a qualified professional for financial decisions.

+ +

PAC coin is meant to be used as a medium of exchange. +Nothing on this website should be considered investment advice or a solicitation to +buy, hold, invest in, own, or use PAC coin.

+ +

No Content Guarantees

+ +

We cannot guarantee the accuracy, completeness, or quality of the information on this website. +All content is provided on an “as is” and “as available” basis, and use is at your own risk.

+ +

The content may be sourced from third parties. +Pactus is not responsible for any errors, omissions, or inaccuracies. +The information may not suit everyone and may only apply to certain regions.

+ +

It is your responsibility to evaluate if the information and services are technically and legally suitable for +your intended use and comply with applicable laws. +Always verify any information before using it for personal, financial, or business purposes.

+ +

We may modify website content and services at any time without notice. +We are not obligated to inform you of any changes or corrections.

+ +

External Content

+ +

Any testimonials, opinions, advice, offers, or other third party content on this website reflect the views +and intentions of those parties/people only. +They do not represent the views of Pactus.

+ +

We do not guarantee the accuracy, completeness, reliability, or usefulness of external content. +Users are responsible for assessing external content. +Pactus is not liable for any damage or loss from relying on or using third party content.

+ +

User Generated Content

+ +

By posting or submitting any material to this website, including the forum, you grant Pactus a +worldwide, fully paid-up, non-exclusive license to edit and display your materials on our website and +social media platforms as we deem appropriate.

+ +

You agree to indemnify and hold harmless Pactus and its Users from any third-party claims arising from +your materials. +You also represent that you own or have the right to post the materials, that they are +accurate, their use on the Pactus website complies with laws, and they will not cause harm to any +person.

+ +

Pactus has the right to remove any materials we deem objectionable, offensive, illegal, harmful, or in +violation of these Terms. +We may disclose user information if legally required.

+ +

Please contact info@pactus.org to request the removal of your posted content for reasons such as +privacy concerns, copyright issues, or no longer wanting your content to appear publicly. +We will review removal requests on a case-by-case basis.

+ +

File Safety and Security

+ +

Pactus implements measures to protect downloadable files on our website but cannot guarantee they +are free of infections, viruses, or harmful code.

+ +

We are also not responsible if users’ devices are infected by visiting our website or downloading files in +the event of a security breach.

+ +

If uncertain, users should consider compiling Pactus from the provided source code. +Users are responsible for meeting their own security requirements.

+ + + +

Pactus works with reputable partners, but does not endorse or take responsibility for sponsored content claims. +We do not review, recommend, or endorse any products or services promoted on our site.

+ +

Pactus is not liable for damages from misuse of personal information given to sponsors. +We are also not responsible for losses from using sponsor links or services on our site.

+ + + +

For user convenience, our website may contain links to external sites and resources. +However, we do not control these external sites and are not responsible for +their content, products, services, or information.

+ +

Link inclusion does not imply Pactus endorsement or affiliation. +Users should be aware they may leave our website by clicking links. +External site terms of use may differ from ours.Pactus is not responsible for +losses from users following links to external sites. +We encourage caution and reviewing external sites’ terms and policies before transacting or engaging.

+ +

Electronic Communications

+ +

Our website responses and email communications will be delivered electronically. +Pactus reserves the right to disclose any user emails or objectionable material +to comply with legal processes or protect the +rights and property of Pactus, its customers, suppliers, and users.

+ +

No Financial Services

+ +

This website does not engage in storing, selling, buying, sending, or receiving Pactus coins. +All activities related to owning and transferring Pactus coins occur on the DEX/CEX/decentralized Pactus network. +This website does not actively participate in that network.

+ +

No Liability

+ +

Pactus assumes no liability for any damages, claims, or losses related to using Pactus. +This includes third party actions or inactions and events.

+ +

It includes but is not limited to: security issues when using Pactus software/services, technical problems +when using Pactus software/services, software or data corruption when using Pactus software/services, +or user errors when using Pactus software/services.

+ +

Disclaimer of Warranties

+ +

Pactus expressly disclaims all warranties, representations, and conditions, whether express or implied, +including but not limited to the implied warranties and conditions of merchantability, fitness for a +particular purpose, and non-infringement.

+ +

This disclaimer extends to the use of this website and its services, as well as the accuracy, completeness, +timeliness, or currentness of its content, in any manner and for any purpose.

+ +

No Consequential Damages

+ +

Under no circumstances will Pactus be liable for any incidental, special, consequential, exemplary, +indirect, or other damages arising from use of this website, its services, or content. +This includes but is not limited to data loss, even if advised of such damage possibilities.

+ +

This disclaimer applies whether based on contract, tort, negligence, product liability, strict liability, or otherwise. +It extends to all potential scenarios and circumstances.

+ +

General

+ +

These Terms of Use (TOU) and any applicable Terms of Service are the full agreement for website use by +users and Pactus. They replace previous agreements.

+ +

If Pactus or a user does not exercise a TOU right, this does not waive the right. If a TOU provision is +invalid, the rest remain valid.

+ +

The TOU and Terms of Service are intentionally in English, the governing language for Pactus and users.

+ + + +

Attributed Content

+ +

Logos for operating systems, platforms, and sponsors we support are copyrighted by their respective owners. +Pactus does not own these copyrights but uses the logos with permission or in a clear, non- harmful way.

+ +

Privacy Policy

+ +

Data Collection and Use

+ +

We collect standard server logs from our website. +This data helps provide site statistics, improve content and information flow, analyze errors, and diagnose dead links. +A segment of server logs gathers download statistics to better understand user needs.

+ +
    +
  • Last update: 25 January 2024
  • +
+ +
+
+
+
+ + + + + diff --git a/zh/user-guides/grpc-sign-transactions/index.html b/zh/user-guides/grpc-sign-transactions/index.html new file mode 100644 index 000000000..9f0fce63c --- /dev/null +++ b/zh/user-guides/grpc-sign-transactions/index.html @@ -0,0 +1,523 @@ + + + + + + + + + + + + + How to sign transaction using gRPC? | 帕图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

How to sign transaction using gRPC?

+ +

Preface

+ +

The Pactus Blockchain provides a gRPC interface that allows users to interact with the blockchain and native wallet. +This is ideal for merchants and users who want to create, sign, and broadcast transactions using their local node. +This tutorial will guide you step-by-step on how to use gRPC to sign transactions.

+ +

Setup node

+ +

Initialize the node

+ +

To follow along with this tutorial, you’ll first need to set up and run a localnet blockchain, which is suitable for testing:

+ +
./build/pactus-daemon init \
+  --localnet \
+  --working-dir ./pactus-localnet \
+  --password "super-secret-password" \
+  --val-num 7 \
+  --restore "fish cool avoid history kitten quick olive purchase blossom grocery cool treat"
+
+ +

This command initializes a Pactus blockchain as a localnet. +The purpose of this network is for testing. +The above command actually restores a node from the given mnemonic. +This helps you to create the same wallet with this tutorial. The first two addresses in this wallet are:

+ +
tpc1zhv2hq30rnu9lkjusgwqk4f5qfdr72sd2mndnn6
+tpc1zsrvuvn0j80vc3we5q44apjrv8j7ta5807z7xc7
+
+ +

We are going to transfer 1 PAC from the first account to the second one.

+ +

Run the node

+ +

Now you can run the node simply with this command:

+ +
./build/pactus-daemon start \
+  --working-dir ./pactus-localnet \
+  --password "super-secret-password"
+
+ +

By running the node, you will see that it starts creating blocks, and +therefore the reward account address will be rewarded locally. +We can use this balance for testing purposes.

+ +

Interact with the node

+ +

Open another terminal and run the following command:

+ +
./pactus-ctl --server-addr localhost:50052 \
+  blockchain get-blockchain-info
+
+ +

It should print information about the localnet blockchain. +The pactus-ctl application uses gRPC to interact with the blockchain. +In this tutorial, we use pactus-ctl to interact with the blockchain. +You can either use gRPC-gateway REST APIs or make direct gRPC calls to interact with the node. +They are more or less similar and all interact with the node using gRPC endpoints.

+ +

Signing Transitions

+ +

Create raw transaction

+ +

To sign a transaction, we first need to create a raw transaction and then sign it. +We can use the get_raw_transfer_transaction method to create a raw transfer transaction. +Similar methods can be used to create raw bond, unbond, and withdraw transactions.

+ +
./pactus-ctl --server-addr localhost:50052 \
+  transaction get-raw-transfer-transaction \
+    --sender tpc1zhv2hq30rnu9lkjusgwqk4f5qfdr72sd2mndnn6 \
+    --receiver tpc1zsrvuvn0j80vc3we5q44apjrv8j7ta5807z7xc7 \
+    --amount 1
+{
+  "rawTransaction":  "AgGWBQAA6AcAAQK7FXBF458L+0uQQ4FqpoBLR+VBqgKA2cZN8jvZiLs0BWvQyGw8vL7Q7wE="
+}
+
+ +

The sender account is the first reward address in the wallet, therefore it should have some coins in its account.

+ +

Please note that the amount here is in atomic units. +There is a Working-In-Progress PR to accept and return all amounts in PAC units (10^9).

+ +

Sign transaction

+ +

Now you can sign this raw transaction. To sign a transaction, first, we need to load a wallet. +At the time of writing this document, Pactus only supports the “default_wallet”. +Soon, creating wallets through gRPC and loading them will be supported.

+ +
./pactus-ctl --server-addr localhost:50052 \
+  wallet load-wallet --wallet-name "default_wallet"
+{
+  "walletName":  "default_wallet"
+}
+
+ +

Now that the “default_wallet” is loaded, we can proceed to sign the raw transaction:

+ +
./pactus-ctl --server-addr localhost:50052 \
+  wallet sign-raw-transaction \
+    --wallet-name "default_wallet" \
+    --password "super-secret-password" \
+    --raw-transaction "AgGWBQAA6AcAAQK7FXBF458L+0uQQ4FqpoBLR+VBqgKA2cZN8jvZiLs0BWvQyGw8vL7Q7wE="
+{
+  "transactionId": "JZqOnVq87eWBd67LvF1bYIYiXjy/orru/vSmrir9iGA=",
+  "signedRawTransaction": "AAGWBQAA6AcAAQK7FXBF458L+0uQQ4FqpoBLR+VBqgKA2cZN8jvZiLs0BWvQyGw8vL7Q7wG0VVIZZ6CfW7J91B0lcw8Ji7+hgRbB88uT8pWyxf9cTqWGLL3sIbnNA1zQol+GtO6C645tYQYi6FWxtOcgYuurrsTapgSa911ZBuToQxJ8D5hj/BPqBiAtfMFwSWlXXbUKr4CGOCCPsA+IEAY0zVpxFa/bl3VMcZF4mgeAoJLZ3hcjz2leLJG9oVvNdwqvu0U="
+}
+
+ +

Transaction successfully signed.

+ +

Broadcast signed transaction

+ +

Now you can broadcast the signed transaction:

+ +
./pactus-ctl --server-addr localhost:50052 \
+  transaction broadcast-transaction \
+    --signed-raw-transaction "AAGWBQAA6AcAAQK7FXBF458L+0uQQ4FqpoBLR+VBqgKA2cZN8jvZiLs0BWvQyGw8vL7Q7wG0VVIZZ6CfW7J91B0lcw8Ji7+hgRbB88uT8pWyxf9cTqWGLL3sIbnNA1zQol+GtO6C645tYQYi6FWxtOcgYuurrsTapgSa911ZBuToQxJ8D5hj/BPqBiAtfMFwSWlXXbUKr4CGOCCPsA+IEAY0zVpxFa/bl3VMcZF4mgeAoJLZ3hcjz2leLJG9oVvNdwqvu0U="
+{
+  "id": "JZqOnVq87eWBd67LvF1bYIYiXjy/orru/vSmrir9iGA="
+}
+
+ +

Transaction successfully broadcasted.

+ +

Production Security Considerations

+ +

In this tutorial, we utilized a localnet version of Pactus. +For production purposes, you’ll need to set up the node for the Mainnet and synchronize it with the network. +Additionally, in production, the wallet service is disabled by default. +You can enable the wallet service in the configuration file.

+ +

When signing transactions in production, you need to prioritize the security of the wallet. +Make sure you have set a strong password for the native wallet. +Ensure that it is called on localhost for safety. +If you intend to call it on a remote server, there are several security measures to consider:

+ +
    +
  • Ensure SSL is installed using Nginx to secure the connections.
  • +
  • Secure the API using a password (currently under development; see here: PIP-20).
  • +
+ + + + + +
+
+
+
+ + + + + diff --git a/zh/user-guides/index.html b/zh/user-guides/index.html new file mode 100644 index 000000000..87bf6297a --- /dev/null +++ b/zh/user-guides/index.html @@ -0,0 +1,387 @@ + + + + + + + + + + + + + 用户指南 | 帕图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + diff --git a/zh/user-guides/reduce-network/index.html b/zh/user-guides/reduce-network/index.html new file mode 100644 index 000000000..e04084a56 --- /dev/null +++ b/zh/user-guides/reduce-network/index.html @@ -0,0 +1,418 @@ + + + + + + + + + + + + + How to reduce the network usage? | 帕图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

How to reduce the network usage?

+ +

Preface

+ +

Pactus is designed for low traffic usage. +However, some users still face bandwidth limitations imposed by their Internet Service Providers (ISPs). +This guide will explore effective ways to reduce networking usage for a Pactus node.

+ +

Reducing the number of connection

+ +

By default, Pactus attempts to maintain 64 open connections with other nodes, +split into 32 inbound and 32 outbound connections. +To reduce networking usage, you can decrease this maximum number of connections. +However, it’s important to remember that more connections with +peers usually enable the node to function more effectively and securely. +The max_connections setting in the config file can be adjusted to manage the maximum number of connections.

+ +

Disabling Relay

+ +

A relay connection is a type of connection that can be established between two peers, +usually behind a NAT, by a third-party peer known as a relay. +This is especially helpful when users run Pactus on a private network like home internet. +However, the relay connection is not as stable as a direct connection. +Disabling the relay connection may reduce network usage. +If you have a reliable and public IP address, you can disable the relay connection. +The relay connection is enabled by default. To disable the relay connection, +set enable_relay to false inside the config file.

+ +

Disabling Node-Network service

+ +

A node-network is a type of node that provides historical data, such as blocks, +to other nodes so they can sync with the network. +By default, this service is enabled. +Disabling this service helps reduce traffic usage. +Keep in mind that new nodes rely on other nodes to be able to sync. +To disable the node-network service, set node_network to false.

+ + + + + +
+
+
+
+ + + + + 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..573777a10 --- /dev/null +++ b/zh/user-guides/run-pactus-cli/index.html @@ -0,0 +1,546 @@ + + + + + + + + + + + + + 如何以命令行模式运行帕图斯? | 帕图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

如何以命令行模式运行帕图斯?

+ + +

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..8295d834d --- /dev/null +++ b/zh/user-guides/run-pactus-docker/index.html @@ -0,0 +1,559 @@ + + + + + + + + + + + + + 如何使用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..dee6ba6eb 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..6049db3bd --- /dev/null +++ b/zh/user-guides/run-pactus-gui/index.html @@ -0,0 +1,514 @@ + + + + + + + + + + + + + 如何以图形模式运行帕图斯? | 帕图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

如何以图形模式运行帕图斯?

+ + +

序言

+ +

Pactus 可以在不同的模式下运行,包括命令行界面 (CLI) 和图形用户界面 (GUI)。 +本教程将指导您完成在 GUI 模式下运行 Pactus,适合初学者到高级用户。

+ +

符合条件

+ +

在继续执行以下步骤之前,请确保您具备以下条件:

+ +
    +
  • 运行 Windows、macOS 或 Linux 的计算机。
  • +
  • 互联网连接。
  • +
+ +

下载

+ +

从以下链接下载 Pactus GUI 安装程序。 +下链.

+ +

代码证书警告

+ +

Windows 和 macOS 用户可能会遇到一条警告消息,指出 Pactus 是不受信任的应用程序。 +这是因为 Pactus 没有代码签名证书

+ +

Code certificate issue

+ +

代码证书是验证软件发行者的身份和真实性的数字签名。然而,获得代码证书的过程复杂且昂贵,需要注册公司并 +通过认识你的客户(KYC)检查。

+ +

由于 Pactus 是一个开源且基于社区的应用程序,所以我们还没有代码证书。 +因此,您可以安全地忽略警告消息并继续安装 Pactus。

+ +

安装

+ +

要安装 Pactus GUI,只需按照安装程序提供的说明步骤进行操作即可。该过程非常简单,与在计算机上安装任何其他应用程序类似。

+ +

Installing Pactus

+ +

初始化

+ +

当您第一次运行Pactus时,将出现一个向导界面,指导您完成钱包创建和初始化过程。这个过程由几个步骤组成:

+ +

初始化模式

+ +

在第一页上,您会被询问您要如何创建钱包。选择“开始创建新钱包” 选项,然后进入下一页。

+ +

Initialize mode

+ +

钱包助记词

+ +

下一页将显示您的钱包助记词,由12个单词组成。安全备份此助记词至关重要,因为钱包恢复需要它以防您的计算机丢失、损坏或被盗。

+ +

Wallet seed

+ +

警告: 确保您的钱包助记词的私密性和安全性。 +如果其他人获得了您的助记词,他们就可以控制您的钱包和资金。

+ +

助记词确认

+ +

在此步骤中,系统将要求您确认助记词。 +将您在上一步中收到的12个单词输入到对话框中。 +如果助记词输入正确,您将能够进入下一页。

+ +

Seed confirmation

+ +

钱包密码

+ +

在此页面上,您将被要求为您的钱包设置密码。 +在第一个对话框中输入强密码,并在第二个对话框中再输入同样密码确认。 +该密码将用于加密您的钱包并防止未经授权的访问。

+ +

Set wallet password

+ +

注意:选择一个强密码并妥善保管。 +如果您忘记或丢失密码,您将需要助记词才能重新访问您的钱包。

+ +

验证者数量

+ +

Pactus 区块链中的每个节点最多可以运行32个验证器,每个验证器最多可以质押1000代币。在这里,您可以定义要为节点创建多少个验证器。 +根据您想要质押的代币数量选择验证器的数量。

+ +

Number of validators

+ +

如果你想质押超过32,000个代币,你需要建立一个新节点。

+ +

节点信息

+ +

初始化过程的最后一页显示节点信息,例如工作目录、验证器地址、 +以及奖励地址。查看此信息并单击“关闭”以完成初始化过程。

+ +

Node information

+ +

关闭向导界面后,您的 Pactus 节点将开始运行。您现在已准备好在GUI模式下使用 Pactus。

+ +

运行 Pactus 节点

+ +

完成初始化过程后,您就可以运行 Pactus 节点了。运行 Pactus 节点允许您与网络同步,使您能够查看和管理您的钱包和 +发送交易。

+ +

网络同步

+ +

当 Pactus 节点开始运行时,它开始与网络同步。这个过程可能需要一些时间, +因为您的节点需要下载并验证整个区块链历史记录。 +您的节点同步时请耐心等待。

+ +

Syncing progress

+ +

默认钱包

+ +

您可以检查“默认钱包”选项来访问您的钱包信息。请注意,显示的信息在同步完成之前可能不准确。

+ +

Default Wallet tab

+ +

在“默认钱包”选项中,您可以查看您的帐户详细信息,包括您的余额和 +地址信息,例如验证器和奖励地址。 +当您的计算机充当节点,您的验证器地址是被用来网络识别。 +奖励地址是您领取参与共识算法、提出新区块后所获得的奖励 +奖励 的账户地址。

+ +

成为验证者并参与共识算法要获得奖励,你首先需要 +质押 一些代币. 下一个 +教程, +我们将教导如何发送契约交易以成为验证者。

+ +
+ +

通过运行 Pactus 节点,您可以为 Pactus 区块链网络的去中心化和安全性做出贡献。 +感谢您的参与!

+ + + + + +
+
+
+
+ + + + + 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..0f9f69d90 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..d11797b50 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/run-pactus-metrics/index.html b/zh/user-guides/run-pactus-metrics/index.html new file mode 100644 index 000000000..dc3ba1c8f --- /dev/null +++ b/zh/user-guides/run-pactus-metrics/index.html @@ -0,0 +1,520 @@ + + + + + + + + + + + + + How to run Pactus Metrics? | 帕图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

How to run Pactus Metrics?

+ +

Preface

+ +

Pactus can be run with metrics, providing you with the ability to monitor your node. +This tutorial will guide you through the steps to run Pactus with metrics, suitable for advanced users.

+ +

Prerequisites

+ +

Before proceeding with the steps below, ensure that you have the following:

+ + + +

Configure Pactus Node for Metrics

+ +

To Configure the Pactus Node for Metrics, navigate to the Pactus directory; by default, it’s located at the following path.

+ +
/home/YourUsername/pactus
+
+ +

There’s a file named config.toml that contains all the configurations for your node. +There are two parameters that you should enable for metrics: the first is enable_metrics, +and the second is enable http. After editing the config.toml you should restart your node. +The metrics now can be accessed at http://localhost:80/metrics/prometheus (this url going to be use by prometheus).

+ +
+ +if you are running Pactus with docker image, make sure to expose :80 port. + +
+ +
+ +

Configure Grafana And Prometheus

+ +

You should run Grafana and Prometheus for gathering metrics and displaying them in charts. +First, create a directory named prometheus-grafana. Inside the directory, +create a docker-compose.yml file and paste the code below.

+ +
services:
+  prometheus:
+    image: prom/prometheus
+    container_name: prometheus
+    command:
+      - "--config.file=/etc/prometheus/prometheus.yml"
+    ports:
+      - 9090:9090
+    restart: unless-stopped
+    volumes:
+      - ./prometheus:/etc/prometheus
+      - prom_data:/prometheus
+  grafana:
+    image: grafana/grafana
+    container_name: grafana
+    ports:
+      - 3000:3000
+    restart: unless-stopped
+    environment:
+      - GF_SECURITY_ADMIN_USER=admin
+      - GF_SECURITY_ADMIN_PASSWORD=admin
+    volumes:
+      - ./grafana:/etc/grafana/provisioning/datasources
+volumes: prom_data
+
+ +

You can change the default username and password of Grafana by modifying the values of GF_SECURITY_ADMIN_USER and GF_SECURITY_ADMIN_PASSWORD. +Now, save the file. Then, in the current directory (meaning you are inside the prometheus-grafana directory), +create another directory named grafana. Then, go to the directory. So now you’re in the path /prometheus-grafana/grafana/. +In the current directory, create a file named datasource.yml and paste the code below there.

+ +
apiVersion: 1
+
+datasources:
+  - name: Prometheus
+    type: prometheus
+    url: http://prometheus:9090
+    isDefault: true
+    access: proxy
+    editable: true
+
+ +

Then save the file and exit. +Now, we should go up one directory level from the current directory and navigate to the /prometheus-grafana directory. +In the current directory, which is /prometheus-grafana, create another directory named prometheus, +then go into the directory.In the prometheus directory create a file named prometheus.yml and paste below code there.

+ +
global:
+  scrape_interval: 15s
+  scrape_timeout: 10s
+  evaluation_interval: 15s
+alerting:
+  alertmanagers:
+    - static_configs:
+        - targets: []
+      scheme: http
+      timeout: 10s
+      api_version: v1
+scrape_configs:
+  - job_name: prometheus
+    honor_timestamps: true
+    scrape_interval: 15s
+    scrape_timeout: 10s
+    metrics_path: /metrics/prometheus
+    scheme: http
+    static_configs:
+      - targets:
+          - 127.0.0.1
+
+ +

Then save the file and exit.

+ +
+ +Tip: In the last section of the code, you will see the targets section where I’ve written 127.0.0.1. +You can change it based on your localhost IP or your website domain. +Please be aware that your target should match with your node http port. +The default http port of pactus node is 80. + +
+ +

Run Grafana and Prometheus

+ +

Go to the /prometheus-grafana directory where the docker-compose.yml is located and run the command below.

+ +
docker compose up -d
+
+ +

Congratulations! Grafana and Prometheus are now up and accessible at ports 3000 and 9090 respectively.

+ +

Import Pactus Metrics to Grafana Dashboard

+ +

As Pactus uses libp2p for its peer-to-peer network, we should import libp2p metrics that you can find here. +Download one of the metrics config and then Import it into Grafana Dashboard.

+ +

Congratulations! You did it. Now, you can perform the same operations for other configurations.

+ + + + + +
+
+
+
+ + + + + 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..c2d605a75 --- /dev/null +++ b/zh/user-guides/send-transactions-gui/index.html @@ -0,0 +1,421 @@ + + + + + + + + + + + + + 如何在图形模式下发送交易? | 帕图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

如何在图形模式下发送交易?

+ + +

序言

+ +

Pactus 区块链提供了一个图形用户界面 (GUI), 带有内置钱包来创建, 签署并广播交易。 +本教程旨在逐步指导您如何使用 GUI 应用程序将交易发送到 Pactus 区块链。 +无论您是初学者还是高级用户, 本教程都适合您。

+ +

符合条件

+ +

在开始之前, 您需要运行 Pactus GUI 应用程序并确保它与网络同步。 +您可以在此教程中学习如何运行Pactus GUI。

+ +

发送转账交易

+ +

如要发送转账交易, 点击“交易”菜单并选择“转账”。 +这将打开一个新窗口, 您可以在其中选择您希望发送转账的 +账户地址, 以及收款人的帐户地址和您希望发送的金额。

+ +

审核交易详情并确保其正确后, 单击“发送”按钮签署交易并将其广播到 Pactus 区块链。

+ +

Transfer Transaction Dialog

+ +

需要注意的是, 交易费用将根据您发送的金额进行计算。

+ +

发送契约交易

+ +

如要发送契约交易, 点击“交易”菜单并选择“契约”。

+ +

点击后将出现一个新窗口, 您可以在其中选择您希望发送转账的账户地址, 以及验证器地址和您希望发送的质押金额。

+ +

如果验证器地址尚未在 Pactus 区块链上注册,您将需要提供验证器的公钥作为第一笔质押交易。这将在 Pactus 区块链上创建及验证您的验证器。 +要获取公钥, 您可以钱包中右键单击验证者地址并选择“详细信息”。

+ +

Bond Transaction Dialog

+ +

需要注意的是, 交易费用将根据您发送的金额进行计算。

+ + + + + +
+
+
+
+ + + + + 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..5d959de81 --- /dev/null +++ b/zh/user-guides/use-wallet-cli/index.html @@ -0,0 +1,1146 @@ + + + + + + + + + + + + + 如何在命令行模式下使用钱包? | 帕图斯区块链 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+
+
+

如何在命令行模式下使用钱包?

+ + +

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 tx bond --pub <PUBLIC_KEY> <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\wallet_1 tx bond --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 withdraw <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +
./pactus-wallet ~/pactus/wallets/wallet_1 tx withdraw <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ +
pactus-wallet.exe c:\pactus\wallets\wallet_1 tx withdraw <FROM> <TO> <AMOUNT>
+
+ + +
+ +
+ + + + + +
+
+
+
+ + + + +