diff --git a/.env b/.env
index 996bb6e6b..63e027764 100644
--- a/.env
+++ b/.env
@@ -15,35 +15,37 @@ ASYNC_STD_THREAD_COUNT=1
PROVER_RAYON_NUM_THREADS=2
# Internal port inside container
-ESPRESSO_CDN_SERVER_PORT=40000
+ESPRESSO_CDN_SERVER_PORT=30000
ESPRESSO_CDN_SERVER_METRICS_PORT=9090
-ESPRESSO_ORCHESTRATOR_PORT=40001
+ESPRESSO_ORCHESTRATOR_PORT=30001
ESPRESSO_ORCHESTRATOR_NUM_NODES=5
ESPRESSO_ORCHESTRATOR_START_DELAY=5s
-ESPRESSO_ORCHESTRATOR_NEXT_VIEW_TIMEOUT=30s
+ESPRESSO_ORCHESTRATOR_NEXT_VIEW_TIMEOUT=12s
ESPRESSO_ORCHESTRATOR_BUILDER_TIMEOUT=2s
ESPRESSO_SEQUENCER_CDN_ENDPOINT=marshal-0:${ESPRESSO_CDN_SERVER_PORT}
ESPRESSO_SEQUENCER_ORCHESTRATOR_URL=http://orchestrator:${ESPRESSO_ORCHESTRATOR_PORT}
-ESPRESSO_SEQUENCER_API_PORT=44000
-ESPRESSO_SEQUENCER_HOTSHOT_EVENT_STREAMING_API_PORT=42000
-ESPRESSO_SEQUENCER1_API_PORT=44001
-ESPRESSO_SEQUENCER2_API_PORT=44002
-ESPRESSO_SEQUENCER3_API_PORT=44003
-ESPRESSO_SEQUENCER4_API_PORT=44004
-ESPRESSO_SEQUENCER_MAX_BLOCK_SIZE=10kb
-ESPRESSO_SEQUENCER_BASE_FEE=1
+ESPRESSO_SEQUENCER_API_PORT=24000
+ESPRESSO_SEQUENCER_HOTSHOT_EVENT_STREAMING_API_PORT=22000
+ESPRESSO_SEQUENCER1_API_PORT=24001
+ESPRESSO_SEQUENCER2_API_PORT=24002
+ESPRESSO_SEQUENCER3_API_PORT=24003
+ESPRESSO_SEQUENCER4_API_PORT=24004
ESPRESSO_SEQUENCER_URL=http://sequencer0:${ESPRESSO_SEQUENCER_API_PORT}
+ESPRESSO_SEQUENCER_MAX_CONNECTIONS=25
ESPRESSO_SEQUENCER_STORAGE_PATH=/store/sequencer
+ESPRESSO_SEQUENCER_GENESIS_FILE=/genesis/demo.toml
ESPRESSO_SEQUENCER_L1_PORT=8545
ESPRESSO_SEQUENCER_L1_WS_PORT=8546
ESPRESSO_SEQUENCER_L1_PROVIDER=http://demo-l1-network:${ESPRESSO_SEQUENCER_L1_PORT}
+# Only allow 1 block to be processed for events at a time, simulating a very bad L1 provider.
+ESPRESSO_SEQUENCER_L1_EVENTS_MAX_BLOCK_RANGE=1
ESPRESSO_SEQUENCER_ETH_MNEMONIC="test test test test test test test test test test test junk"
-# The first account is the permission less builder, the last are sequencer0 to 4
-ESPRESSO_SEQUENCER_PREFUNDED_BUILDER_ACCOUNTS=0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f
-ESPRESSO_COMMITMENT_TASK_PORT=60000
-ESPRESSO_SEQUENCER_DB_PORT=5432
-ESPRESSO_STATE_RELAY_SERVER_PORT=40004
+ESPRESSO_COMMITMENT_TASK_PORT=30010
+ESPRESSO_SEQUENCER0_DB_PORT=5432
+ESPRESSO_SEQUENCER1_DB_PORT=5433
+ESPRESSO_STATE_RELAY_SERVER_PORT=30011
ESPRESSO_STATE_RELAY_SERVER_URL=http://state-relay-server:${ESPRESSO_STATE_RELAY_SERVER_PORT}
+ESPRESSO_BLOCK_EXPLORER_PORT=3000
# Ethereum accounts (note 11-15 are used by the sequencer nodes)
ESPRESSO_SEQUENCER_HOTSHOT_ACCOUNT_INDEX=5
@@ -52,8 +54,8 @@ ESPRESSO_BUILDER_ETH_ACCOUNT_INDEX=8
ESPRESSO_DEPLOYER_ACCOUNT_INDEX=9
# Contracts
-ESPRESSO_SEQUENCER_HOTSHOT_ADDRESS=0x700b6a60ce7eaaea56f065753d8dcb9653dbad35
-ESPRESSO_SEQUENCER_LIGHT_CLIENT_PROXY_ADDRESS=0xe1aa25618fa0c7a1cfdab5d6b456af611873b629
+ESPRESSO_SEQUENCER_HOTSHOT_ADDRESS=0xb19b36b1456e65e3a6d514d3f715f204bd59f431
+ESPRESSO_SEQUENCER_LIGHT_CLIENT_PROXY_ADDRESS=0x0c8e79f3534b00d9a3d4a856b665bf4ebc22f2ba
ESPRESSO_SEQUENCER_LIGHTCLIENT_ADDRESS=$ESPRESSO_SEQUENCER_LIGHT_CLIENT_PROXY_ADDRESS
# Example sequencer demo private keys
@@ -76,6 +78,9 @@ ESPRESSO_DEMO_SEQUENCER_LIBP2P_PORT_2=7002
ESPRESSO_DEMO_SEQUENCER_LIBP2P_PORT_3=7003
ESPRESSO_DEMO_SEQUENCER_LIBP2P_PORT_4=7004
+# The demo uses the mock stake table contract, only capacity 10 is supported.
+ESPRESSO_SEQUENCER_STAKE_TABLE_CAPACITY=10
+
# Foundry
# The mnemonic used by foundry to deploy contracts.
MNEMONIC="test test test test test test test test test test test junk"
@@ -86,31 +91,34 @@ ETHERSCAN_API_KEY="placeholder"
# Temporary flags for state relay server, should remove after integrating with stake table
# Related issue: [https://github.com/EspressoSystems/espresso-sequencer/issues/1022]
-ESPRESSO_STATE_SIGNATURE_WEIGHT_THRESHOLD=3
+ESPRESSO_STATE_SIGNATURE_TOTAL_STAKE=5
# Prover service
-ESPRESSO_PROVER_SERVICE_PORT=40050
-ESPRESSO_STATE_PROVER_UPDATE_INTERVAL=10m
+ESPRESSO_PROVER_SERVICE_PORT=30050
+ESPRESSO_STATE_PROVER_UPDATE_INTERVAL=20s
# Builder service
ESPRESSO_BUILDER_L1_PROVIDER=${ESPRESSO_SEQUENCER_L1_PROVIDER}
ESPRESSO_BUILDER_ETH_MNEMONIC=${ESPRESSO_SEQUENCER_ETH_MNEMONIC}
-ESPRESSO_BUILDER_SERVER_PORT=41003
-ESPRESSO_BUILDER_CHANNEL_CAPACITY=1024
+ESPRESSO_BUILDER_SERVER_PORT=31003
+ESPRESSO_BUILDER_TX_CHANNEL_CAPACITY=4096
+ESPRESSO_BUILDER_EVENT_CHANNEL_CAPACITY=128
+ESPRESSO_BUILDER_INIT_NODE_COUNT=$ESPRESSO_ORCHESTRATOR_NUM_NODES
ESPRESSO_BUILDER_BOOTSTRAPPED_VIEW=0
-ESPRESSO_BUILDER_WEBSERVER_RESPONSE_TIMEOUT_DURATION=1s
-ESPRESSO_BUILDER_BUFFER_VIEW_NUM_COUNT=15
+ESPRESSO_BUILDER_WEBSERVER_RESPONSE_TIMEOUT_DURATION=1500ms
+ESPRESSO_BUILDER_BUFFER_VIEW_NUM_COUNT=50
+ESPRESSO_BUILDER_GENESIS_FILE=$ESPRESSO_SEQUENCER_GENESIS_FILE
# Load generator
ESPRESSO_SUBMIT_TRANSACTIONS_DELAY=2s
-ESPRESSO_SUBMIT_TRANSACTIONS_PUBLIC_PORT=44010
-ESPRESSO_SUBMIT_TRANSACTIONS_PRIVATE_PORT=44020
+ESPRESSO_SUBMIT_TRANSACTIONS_PUBLIC_PORT=24010
+ESPRESSO_SUBMIT_TRANSACTIONS_PRIVATE_PORT=24020
-# Query service stress test
-ESPRESSO_NASTY_CLIENT_PORT=44011
+# Query service fetch requests rate limit
+ESPRESSO_SEQUENCER_FETCH_RATE_LIMIT=25
# Query service stress test
-ESPRESSO_NASTY_CLIENT_PORT=44011
+ESPRESSO_NASTY_CLIENT_PORT=24011
# Openzeppelin Defender Deployment Profile
DEFENDER_KEY=
@@ -120,3 +128,12 @@ LIGHT_CLIENT_SALT=12
FEE_CONTRACT_UPGRADE_NAME="FeeContract.sol"
LIGHT_CLIENT_UPGRADE_NAME="LightClientV2.sol"
FOUNDRY_OUT=contracts/out
+
+# The Ethereum address of the safe multisig wallet used to deploy and operate the contracts.
+SAFE_MULTISIG_ADDRESS=
+# The Ethereum private key of the wallet used for the proposing multisig transactions.
+SAFE_ORCHESTRATOR_PRIVATE_KEY=
+
+# Light Client
+LIGHT_CLIENT_PROXY_CONTRACT_ADDRESS=
+APPROVED_PROVER_ADDRESS=
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 8191c0344..49b9f68a7 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -52,6 +52,11 @@ jobs:
run: |
cargo build --locked --release --workspace
+ - name: Build Espresso Dev Node
+ # Espresso Dev Node currently requires testing feature, so it is built separately.
+ run: |
+ cargo build --locked --release --features testing --bin espresso-dev-node
+
- name: Upload artifacts
uses: actions/upload-artifact@v3
with:
@@ -72,7 +77,9 @@ jobs:
target/release/keygen
target/release/permissionless-builder
target/release/nasty-client
+ target/release/espresso-dev-node
target/release/pub-key
+ target/release/espresso-bridge
build-arm:
runs-on: buildjet-4vcpu-ubuntu-2204-arm
@@ -96,6 +103,11 @@ jobs:
run: |
cargo build --locked --release --workspace
+ - name: Build Espresso Dev Node
+ # Espresso Dev Node currently requires testing feature, so it is built separately.
+ run: |
+ cargo build --locked --release --features testing --bin espresso-dev-node
+
- name: Upload artifacts
uses: actions/upload-artifact@v3
with:
@@ -116,7 +128,9 @@ jobs:
target/release/keygen
target/release/permissionless-builder
target/release/nasty-client
+ target/release/espresso-dev-node
target/release/pub-key
+ target/release/espresso-bridge
build-dockers:
runs-on: ubuntu-latest
@@ -134,6 +148,8 @@ jobs:
deploy-tag: ${{ steps.deploy.outputs.tags }}
builder-tag: ${{ steps.builder.outputs.tags }}
nasty-client-tag: ${{ steps.nasty-client.outputs.tags }}
+ espresso-dev-node-tag: ${{ steps.espresso-dev-node.outputs.tags }}
+ bridge-tag: ${{ steps.bridge.outputs.tags }}
steps:
- name: Checkout Repository
uses: actions/checkout@v4
@@ -235,8 +251,20 @@ jobs:
with:
images: ghcr.io/espressosystems/espresso-sequencer/nasty-client
+ - name: Generate espresso-dev-node metadata
+ uses: docker/metadata-action@v5
+ id: espresso-dev-node
+ with:
+ images: ghcr.io/espressosystems/espresso-sequencer/espresso-dev-node
+
+ - name: Generate bridge metadata
+ uses: docker/metadata-action@v5
+ id: bridge
+ with:
+ images: ghcr.io/espressosystems/espresso-sequencer/bridge
+
- name: Build and push sequencer docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/sequencer.Dockerfile
@@ -246,7 +274,7 @@ jobs:
labels: ${{ steps.sequencer.outputs.labels }}
- name: Build and push cdn-broker docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/cdn-broker.Dockerfile
@@ -256,7 +284,7 @@ jobs:
labels: ${{ steps.cdn-broker.outputs.labels }}
- name: Build and push cdn-marshal docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/cdn-marshal.Dockerfile
@@ -266,7 +294,7 @@ jobs:
labels: ${{ steps.cdn-marshal.outputs.labels }}
- name: Build and push cdn-whitelist docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/cdn-whitelist.Dockerfile
@@ -276,7 +304,7 @@ jobs:
labels: ${{ steps.cdn-whitelist.outputs.labels }}
- name: Build and push state-relay-server docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/state-relay-server.Dockerfile
@@ -286,7 +314,7 @@ jobs:
labels: ${{ steps.state-relay-server.outputs.labels }}
- name: Build and push prover-service docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/prover-service.Dockerfile
@@ -296,7 +324,7 @@ jobs:
labels: ${{ steps.prover-service.outputs.labels }}
- name: Build and push orchestrator docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/orchestrator.Dockerfile
@@ -306,7 +334,7 @@ jobs:
labels: ${{ steps.orchestrator.outputs.labels }}
- name: Build and push commitment-task docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/commitment-task.Dockerfile
@@ -316,7 +344,7 @@ jobs:
labels: ${{ steps.commitment-task.outputs.labels }}
- name: Build and push submit-transactions docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/submit-transactions.Dockerfile
@@ -326,7 +354,7 @@ jobs:
labels: ${{ steps.submit-transactions.outputs.labels }}
- name: Build and push deploy docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/deploy.Dockerfile
@@ -336,7 +364,7 @@ jobs:
labels: ${{ steps.deploy.outputs.labels }}
- name: Build and push builder docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/permissionless-builder.Dockerfile
@@ -346,7 +374,7 @@ jobs:
labels: ${{ steps.builder.outputs.labels }}
- name: Build and push nasty-client docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/nasty-client.Dockerfile
@@ -355,6 +383,25 @@ jobs:
tags: ${{ steps.nasty-client.outputs.tags }}
labels: ${{ steps.nasty-client.outputs.labels }}
+ - name: Build and push espresso-dev-node docker
+ uses: docker/build-push-action@v6
+ with:
+ context: ./
+ file: ./docker/espresso-dev-node.Dockerfile
+ platforms: linux/amd64,linux/arm64
+ push: ${{ github.event_name != 'pull_request' }}
+ tags: ${{ steps.espresso-dev-node.outputs.tags }}
+ labels: ${{ steps.espresso-dev-node.outputs.labels }}
+ - name: Build and push bridge docker
+ uses: docker/build-push-action@v6
+ with:
+ context: ./
+ file: ./docker/espresso-bridge.Dockerfile
+ platforms: linux/amd64,linux/arm64
+ push: ${{ github.event_name != 'pull_request' }}
+ tags: ${{ steps.bridge.outputs.tags }}
+ labels: ${{ steps.bridge.outputs.labels }}
+
test-demo:
if: ${{ github.event_name != 'pull_request' }}
runs-on: ubuntu-latest
@@ -382,6 +429,7 @@ jobs:
docker pull ${{ needs.build-dockers.outputs.deploy-tag }}
docker pull ${{ needs.build-dockers.outputs.builder-tag }}
docker pull ${{ needs.build-dockers.outputs.nasty-client-tag }}
+ docker pull ${{ needs.build-dockers.outputs.bridge-tag }}
- name: Tag new docker images
run: |
docker tag ${{ needs.build-dockers.outputs.sequencer-tag }} ghcr.io/espressosystems/espresso-sequencer/sequencer:main
@@ -396,8 +444,9 @@ jobs:
docker tag ${{ needs.build-dockers.outputs.deploy-tag }} ghcr.io/espressosystems/espresso-sequencer/deploy:main
docker tag ${{ needs.build-dockers.outputs.builder-tag }} ghcr.io/espressosystems/espresso-sequencer/builder:main
docker tag ${{ needs.build-dockers.outputs.nasty-client-tag }} ghcr.io/espressosystems/espresso-sequencer/nasty-client:main
+ docker tag ${{ needs.build-dockers.outputs.bridge-tag }} ghcr.io/espressosystems/espresso-sequencer/bridge:main
- name: Test docker demo
run: |
just demo &
- timeout 600 scripts/smoke-test-demo
+ timeout -v 600 scripts/smoke-test-demo | sed -e 's/^/smoke-test: /;'
diff --git a/.github/workflows/build_static.yml b/.github/workflows/build_static.yml
index e0727ca09..0d533fd38 100644
--- a/.github/workflows/build_static.yml
+++ b/.github/workflows/build_static.yml
@@ -43,10 +43,10 @@ jobs:
uses: actions/checkout@v4
- name: Install Nix
- uses: cachix/install-nix-action@v26
+ uses: cachix/install-nix-action@V27
- name: Enable Cachix
- uses: cachix/cachix-action@v14
+ uses: cachix/cachix-action@v15
# If PR is from a non-collaborator (e. g. dependabot) the secrets are missing and the login to cachix fails.
continue-on-error: true
with:
@@ -89,6 +89,8 @@ jobs:
${{ env.CARGO_TARGET_DIR }}/${{ env.TARGET_TRIPLET }}/release/deploy
${{ env.CARGO_TARGET_DIR }}/${{ env.TARGET_TRIPLET }}/release/keygen
${{ env.CARGO_TARGET_DIR }}/${{ env.TARGET_TRIPLET }}/release/pub-key
+ ${{ env.CARGO_TARGET_DIR }}/${{ env.TARGET_TRIPLET }}/release/espresso-bridge
+ ${{ env.CARGO_TARGET_DIR }}/${{ env.TARGET_TRIPLET }}/release/espresso-dev-node
static-dockers:
runs-on: ubuntu-latest
@@ -192,8 +194,22 @@ jobs:
images: ghcr.io/espressosystems/espresso-sequencer/deploy
flavor: suffix=musl
+ - name: Generate espresso-dev-node metadata
+ uses: docker/metadata-action@v5
+ id: espresso-dev-node
+ with:
+ images: ghcr.io/espressosystems/espresso-sequencer/espresso-dev-node
+ flavor: suffix=musl
+
+ - name: Generate bridge metadata
+ uses: docker/metadata-action@v5
+ id: bridge
+ with:
+ images: ghcr.io/espressosystems/espresso-sequencer/bridge
+ flavor: suffix=musl
+
- name: Build and push sequencer docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/sequencer.Dockerfile
@@ -203,7 +219,7 @@ jobs:
labels: ${{ steps.sequencer.outputs.labels }}
- name: Build and push cdn-broker docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/cdn-broker.Dockerfile
@@ -213,7 +229,7 @@ jobs:
labels: ${{ steps.cdn-broker.outputs.labels }}
- name: Build and push cdn-marshal docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/cdn-marshal.Dockerfile
@@ -223,7 +239,7 @@ jobs:
labels: ${{ steps.cdn-marshal.outputs.labels }}
- name: Build and push cdn-whitelist docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/cdn-whitelist.Dockerfile
@@ -233,7 +249,7 @@ jobs:
labels: ${{ steps.cdn-whitelist.outputs.labels }}
- name: Build and push state-relay-server docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/state-relay-server.Dockerfile
@@ -243,7 +259,7 @@ jobs:
labels: ${{ steps.state-relay-server.outputs.labels }}
- name: Build and push prover-service docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/prover-service.Dockerfile
@@ -253,7 +269,7 @@ jobs:
labels: ${{ steps.prover-service.outputs.labels }}
- name: Build and push orchestrator docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/orchestrator.Dockerfile
@@ -263,7 +279,7 @@ jobs:
labels: ${{ steps.orchestrator.outputs.labels }}
- name: Build and push commitment-task docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/commitment-task.Dockerfile
@@ -273,7 +289,7 @@ jobs:
labels: ${{ steps.commitment-task.outputs.labels }}
- name: Build and push submit-transactions docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/submit-transactions.Dockerfile
@@ -283,7 +299,7 @@ jobs:
labels: ${{ steps.submit-transactions.outputs.labels }}
- name: Build and push deploy docker
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: ./
file: ./docker/deploy.Dockerfile
@@ -291,3 +307,23 @@ jobs:
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.deploy.outputs.tags }}
labels: ${{ steps.deploy.outputs.labels }}
+
+ - name: Build and push dev node docker
+ uses: docker/build-push-action@v6
+ with:
+ context: ./
+ file: ./docker/espresso-dev-node.Dockerfile
+ platforms: linux/amd64,linux/arm64
+ push: ${{ github.event_name != 'pull_request' }}
+ tags: ${{ steps.espresso-dev-node.outputs.tags }}
+ labels: ${{ steps.espresso-dev-node.outputs.labels }}
+
+ - name: Build and push bridge docker
+ uses: docker/build-push-action@v6
+ with:
+ context: ./
+ file: ./docker/espresso-bridge.Dockerfile
+ platforms: linux/amd64,linux/arm64
+ push: ${{ github.event_name != 'pull_request' }}
+ tags: ${{ steps.bridge.outputs.tags }}
+ labels: ${{ steps.bridge.outputs.labels }}
diff --git a/.github/workflows/contracts.yml b/.github/workflows/contracts.yml
index 0847511f7..0d5fad542 100644
--- a/.github/workflows/contracts.yml
+++ b/.github/workflows/contracts.yml
@@ -25,10 +25,10 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Install Nix
- uses: cachix/install-nix-action@v26
+ uses: cachix/install-nix-action@V27
- name: Enable Cachix
- uses: cachix/cachix-action@v14
+ uses: cachix/cachix-action@v15
# If PR is from a non-collaborator (e. g. dependabot) the secrets are missing and the login to cachix fails.
continue-on-error: true
with:
diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml
new file mode 100644
index 000000000..2f4449213
--- /dev/null
+++ b/.github/workflows/doc.yml
@@ -0,0 +1,49 @@
+name: Documentation
+on:
+ push:
+ branches:
+ - "main"
+ - "release-*"
+ pull_request:
+ schedule:
+ - cron: "0 0 * * 1"
+ workflow_dispatch:
+
+concurrency:
+ group: ${{ github.workflow }}-${{ (github.ref == 'refs/heads/main' && github.run_number) || github.ref }}
+ cancel-in-progress: true
+
+env:
+ RUSTFLAGS: --cfg async_executor_impl="async-std" --cfg async_channel_impl="async-std"
+ RUSTDOCFLAGS: --cfg async_executor_impl="async-std" --cfg async_channel_impl="async-std"
+
+jobs:
+ doc:
+ runs-on: ubuntu-24.04
+ steps:
+ - name: Checkout Repository
+ uses: actions/checkout@v4
+
+ - name: Install Just
+ run: sudo apt-get install -y just
+
+ - uses: Swatinem/rust-cache@v2
+ name: Enable Rust Caching
+
+ - name: Build Docs
+ run: |
+ just doc
+
+ - name: Create documentation
+ if: ${{ github.ref == 'refs/heads/main' }}
+ run: |
+ cp -R target/doc public
+ echo '' > public/index.html
+
+ - name: Deploy
+ uses: peaceiris/actions-gh-pages@v4
+ if: ${{ github.ref == 'refs/heads/main' }}
+ with:
+ github_token: ${{ secrets.GITHUB_TOKEN }}
+ publish_dir: ./public
+ cname: sequencer.docs.espressosys.com
diff --git a/.github/workflows/test-demo-native.yml b/.github/workflows/test-demo-native.yml
index 90666c366..ab85b1a75 100644
--- a/.github/workflows/test-demo-native.yml
+++ b/.github/workflows/test-demo-native.yml
@@ -29,7 +29,7 @@ jobs:
uses: foundry-rs/foundry-toolchain@v1
- name: Install Nix
- uses: cachix/install-nix-action@v26
+ uses: cachix/install-nix-action@V27
- name: Install process-compose
run: |
@@ -50,4 +50,4 @@ jobs:
run: |
export PATH="$PWD/target/release:$PATH"
scripts/demo-native --tui=false &
- timeout -v 600 scripts/smoke-test-demo
+ timeout -v 600 scripts/smoke-test-demo | sed -e 's/^/smoke-test: /;'
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 37c4c45fd..b50fdfece 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -55,4 +55,4 @@ jobs:
cargo build --locked --bin diff-test --release
cargo test --locked --release --workspace --all-features --no-run
cargo test --locked --release --workspace --all-features --verbose -- --test-threads 1 --nocapture
- timeout-minutes: 30
+ timeout-minutes: 40
diff --git a/.github/workflows/update_nix.yml b/.github/workflows/update_nix.yml
index a2783722c..f7dfd33f6 100644
--- a/.github/workflows/update_nix.yml
+++ b/.github/workflows/update_nix.yml
@@ -17,9 +17,9 @@ jobs:
uses: actions/checkout@v4
- name: Install Nix
- uses: cachix/install-nix-action@v26
+ uses: cachix/install-nix-action@V27
- - uses: cachix/cachix-action@v14
+ - uses: cachix/cachix-action@v15
with:
name: espresso-systems-private
authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"
diff --git a/.gitignore b/.gitignore
index fac0a2025..4503c6c73 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,9 +14,7 @@ target/
# Jetbrains editor
.idea
-
-# vscode stuff
-.vscode/settings.json
+.vscode/ltex.dictionary*
node_modules/
@@ -26,3 +24,20 @@ node_modules/
cache
**/*.bin
+
+
+yarn.lock
+
+# wake files
+.wake
+.env
+pytypes
+__pycache__/
+*.py[cod]
+.hypothesis/
+wake-coverage.cov
+!data/*.bin
+
+# generated by failing serialization tests
+data/*-actual.json
+data/*-actual.bin
diff --git a/.gitmodules b/.gitmodules
index 3b02eb512..7dd4348e2 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -19,7 +19,7 @@
[submodule "contracts/lib/openzeppelin-foundry-upgrades"]
path = contracts/lib/openzeppelin-foundry-upgrades
url = https://github.com/OpenZeppelin/openzeppelin-foundry-upgrades
- branch = 0.1.0
+ branch = 0.2.3
[submodule "contracts/lib/openzeppelin-contracts-upgradeable"]
path = contracts/lib/openzeppelin-contracts-upgradeable
url = https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable
diff --git a/.typos.toml b/.typos.toml
index 71189ef29..53cdcf235 100644
--- a/.typos.toml
+++ b/.typos.toml
@@ -1,7 +1,7 @@
[files]
extend-exclude = [
+ "*.json",
"doc/*.svg",
- "geth-config/*.json",
"contracts/lib",
"contract-bindings",
]
diff --git a/.vscode/ltex.dictionary.en-US.txt b/.vscode/ltex.dictionary.en-US.txt
new file mode 100644
index 000000000..12589cd69
--- /dev/null
+++ b/.vscode/ltex.dictionary.en-US.txt
@@ -0,0 +1,4 @@
+Multisig
+OpenZeppelin
+multisig
+Metamask
diff --git a/.vscode/settings.json.example b/.vscode/settings.json
similarity index 100%
rename from .vscode/settings.json.example
rename to .vscode/settings.json
diff --git a/Cargo.lock b/Cargo.lock
index 8efc37181..8e420445e 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -122,7 +122,7 @@ version = "0.7.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9"
dependencies = [
- "getrandom 0.2.14",
+ "getrandom 0.2.15",
"once_cell",
"version_check",
]
@@ -134,7 +134,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011"
dependencies = [
"cfg-if",
- "getrandom 0.2.14",
+ "getrandom 0.2.15",
"once_cell",
"version_check",
"zerocopy",
@@ -172,47 +172,48 @@ dependencies = [
[[package]]
name = "anstream"
-version = "0.6.13"
+version = "0.6.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb"
+checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b"
dependencies = [
"anstyle",
"anstyle-parse",
"anstyle-query",
"anstyle-wincon",
"colorchoice",
+ "is_terminal_polyfill",
"utf8parse",
]
[[package]]
name = "anstyle"
-version = "1.0.6"
+version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc"
+checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b"
[[package]]
name = "anstyle-parse"
-version = "0.2.3"
+version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c"
+checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4"
dependencies = [
"utf8parse",
]
[[package]]
name = "anstyle-query"
-version = "1.0.2"
+version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648"
+checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391"
dependencies = [
"windows-sys 0.52.0",
]
[[package]]
name = "anstyle-wincon"
-version = "3.0.2"
+version = "3.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7"
+checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19"
dependencies = [
"anstyle",
"windows-sys 0.52.0",
@@ -220,9 +221,9 @@ dependencies = [
[[package]]
name = "anyhow"
-version = "1.0.82"
+version = "1.0.86"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519"
+checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da"
[[package]]
name = "arbitrary"
@@ -401,17 +402,6 @@ dependencies = [
"syn 1.0.109",
]
-[[package]]
-name = "ark-pallas"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "760ecac12a00211188c9101b63bd284b80da5abcc5d97d9d2b3803bca1f63a52"
-dependencies = [
- "ark-ec",
- "ark-ff",
- "ark-std",
-]
-
[[package]]
name = "ark-poly"
version = "0.4.2"
@@ -547,9 +537,9 @@ dependencies = [
[[package]]
name = "asn1-rs"
-version = "0.5.2"
+version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f6fd5ddaf0351dff5b8da21b2fb4ff8e08ddd02857f0bf69c47639106c0fff0"
+checksum = "22ad1373757efa0f70ec53939aabc7152e1591cb485208052993070ac8d2429d"
dependencies = [
"asn1-rs-derive",
"asn1-rs-impl",
@@ -563,25 +553,25 @@ dependencies = [
[[package]]
name = "asn1-rs-derive"
-version = "0.4.0"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c"
+checksum = "7378575ff571966e99a744addeff0bff98b8ada0dedf1956d59e634db95eaac1"
dependencies = [
"proc-macro2",
"quote",
- "syn 1.0.109",
- "synstructure 0.12.6",
+ "syn 2.0.68",
+ "synstructure 0.13.1",
]
[[package]]
name = "asn1-rs-impl"
-version = "0.1.0"
+version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed"
+checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7"
dependencies = [
"proc-macro2",
"quote",
- "syn 1.0.109",
+ "syn 2.0.68",
]
[[package]]
@@ -602,12 +592,12 @@ dependencies = [
[[package]]
name = "async-broadcast"
-version = "0.7.0"
+version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "258b52a1aa741b9f09783b2d86cf0aeeb617bbf847f6933340a39644227acbdb"
+checksum = "20cd0e2e25ea8e5f7e9df04578dc6cf5c83577fd09b1a46aaf5c85e1c33f2a7e"
dependencies = [
- "event-listener 5.3.0",
- "event-listener-strategy 0.5.2",
+ "event-listener 5.3.1",
+ "event-listener-strategy",
"futures-core",
"pin-project-lite 0.2.14",
]
@@ -625,28 +615,27 @@ dependencies = [
[[package]]
name = "async-channel"
-version = "2.2.1"
+version = "2.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "136d4d23bcc79e27423727b36823d86233aad06dfea531837b038394d11e9928"
+checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a"
dependencies = [
"concurrent-queue",
- "event-listener 5.3.0",
- "event-listener-strategy 0.5.2",
+ "event-listener-strategy",
"futures-core",
"pin-project-lite 0.2.14",
]
[[package]]
name = "async-compatibility-layer"
-version = "1.1.0"
+version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b7d24a8f9d6fec5b9313ceebbd82133ae87cf94944c362e8169d7ec735c88a23"
+checksum = "2c928880329566b45c159fca61fbc2a1d301a7e5fd2a0e94c17476bb1a3ea526"
dependencies = [
- "async-lock 3.3.0",
+ "async-lock 3.4.0",
"async-std",
"async-trait",
"color-eyre",
- "console-subscriber",
+ "console-subscriber 0.2.0",
"flume 0.11.0",
"futures",
"tokio",
@@ -662,15 +651,15 @@ version = "1.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7c2886ab563af5038f79ec016dd7b87947ed138b794e8dd64992962c9cca0411"
dependencies = [
- "async-lock 3.3.0",
+ "async-lock 3.4.0",
"futures-io",
]
[[package]]
name = "async-executor"
-version = "1.11.0"
+version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b10202063978b3351199d68f8b22c4e47e4b1b822f8d43fd862d5ea8c006b29a"
+checksum = "c8828ec6e544c02b0d6691d21ed9f9218d0384a82542855073c2a3f58304aaf0"
dependencies = [
"async-task",
"concurrent-queue",
@@ -697,10 +686,10 @@ version = "2.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c"
dependencies = [
- "async-channel 2.2.1",
+ "async-channel 2.3.1",
"async-executor",
- "async-io 2.3.2",
- "async-lock 3.3.0",
+ "async-io 2.3.3",
+ "async-lock 3.4.0",
"blocking",
"futures-lite 2.3.0",
"once_cell",
@@ -746,17 +735,17 @@ dependencies = [
[[package]]
name = "async-io"
-version = "2.3.2"
+version = "2.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dcccb0f599cfa2f8ace422d3555572f47424da5648a4382a9dd0310ff8210884"
+checksum = "0d6baa8f0178795da0e71bc42c9e5d13261aac7ee549853162e66a241ba17964"
dependencies = [
- "async-lock 3.3.0",
+ "async-lock 3.4.0",
"cfg-if",
"concurrent-queue",
"futures-io",
"futures-lite 2.3.0",
"parking",
- "polling 3.7.0",
+ "polling 3.7.2",
"rustix 0.38.34",
"slab",
"tracing",
@@ -774,12 +763,12 @@ dependencies = [
[[package]]
name = "async-lock"
-version = "3.3.0"
+version = "3.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b"
+checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18"
dependencies = [
- "event-listener 4.0.3",
- "event-listener-strategy 0.4.0",
+ "event-listener 5.3.1",
+ "event-listener-strategy",
"pin-project-lite 0.2.14",
]
@@ -831,12 +820,12 @@ dependencies = [
[[package]]
name = "async-signal"
-version = "0.2.6"
+version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "afe66191c335039c7bb78f99dc7520b0cbb166b3a1cb33a03f53d8a1c6f2afda"
+checksum = "794f185324c2f00e771cd9f1ae8b5ac68be2ca7abb129a87afd6e86d228bc54d"
dependencies = [
- "async-io 2.3.2",
- "async-lock 3.3.0",
+ "async-io 2.3.3",
+ "async-lock 3.4.0",
"atomic-waker",
"cfg-if",
"futures-core",
@@ -923,7 +912,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.68",
]
[[package]]
@@ -953,7 +942,7 @@ checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.68",
]
[[package]]
@@ -1056,14 +1045,14 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.68",
]
[[package]]
name = "autocfg"
-version = "1.2.0"
+version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80"
+checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
[[package]]
name = "automod"
@@ -1073,7 +1062,7 @@ checksum = "edf3ee19dbc0a46d740f6f0926bde8c50f02bdbc7b536842da28f6ac56513a8b"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.68",
]
[[package]]
@@ -1089,7 +1078,7 @@ dependencies = [
"futures-util",
"http 0.2.12",
"http-body 0.4.6",
- "hyper 0.14.28",
+ "hyper 0.14.29",
"itoa",
"matchit",
"memchr",
@@ -1098,7 +1087,7 @@ dependencies = [
"pin-project-lite 0.2.14",
"rustversion",
"serde",
- "sync_wrapper",
+ "sync_wrapper 0.1.2",
"tower",
"tower-layer",
"tower-service",
@@ -1162,9 +1151,9 @@ checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
[[package]]
name = "base64"
-version = "0.22.0"
+version = "0.22.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51"
+checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
[[package]]
name = "base64-bytes"
@@ -1172,7 +1161,7 @@ version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ce54e4e485fa0eed9c3aa5348162be09168f75bb5be7bc6587bcf2a65ee1386"
dependencies = [
- "base64 0.22.0",
+ "base64 0.22.1",
"serde",
]
@@ -1229,9 +1218,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "bitflags"
-version = "2.5.0"
+version = "2.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1"
+checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
dependencies = [
"serde",
]
@@ -1291,12 +1280,11 @@ dependencies = [
[[package]]
name = "blocking"
-version = "1.6.0"
+version = "1.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "495f7104e962b7356f0aeb34247aca1fe7d2e783b346582db7f2904cb5717e88"
+checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea"
dependencies = [
- "async-channel 2.2.1",
- "async-lock 3.3.0",
+ "async-channel 2.3.1",
"async-task",
"futures-io",
"futures-lite 2.3.0",
@@ -1305,9 +1293,9 @@ dependencies = [
[[package]]
name = "blst"
-version = "0.3.11"
+version = "0.3.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c94087b935a822949d3291a9989ad2b2051ea141eda0fd4e478a75f6aa3e604b"
+checksum = "62dc83a094a71d43eeadd254b1ec2d24cb6a0bb6cadce00df51f0db594711a32"
dependencies = [
"cc",
"glob",
@@ -1346,23 +1334,27 @@ dependencies = [
"hotshot-builder-api",
"hotshot-builder-core",
"hotshot-events-service",
+ "hotshot-example-types",
"hotshot-orchestrator",
"hotshot-stake-table",
"hotshot-state-prover",
"hotshot-types",
- "jf-primitives 0.4.4",
+ "jf-merkle-tree",
+ "jf-signature",
+ "libp2p",
"portpicker",
"rand 0.8.5",
"sequencer",
"serde",
- "snafu 0.8.2",
+ "snafu 0.8.3",
"surf",
"surf-disco",
- "tagged-base64 0.4.0",
+ "tagged-base64",
"tide-disco",
"tracing",
"url",
"vbs",
+ "vec1",
]
[[package]]
@@ -1449,22 +1441,31 @@ dependencies = [
[[package]]
name = "camino"
-version = "1.1.6"
+version = "1.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c"
+checksum = "e0ec6b951b160caa93cc0c7b209e5a3bff7aae9062213451ac99493cd844c239"
dependencies = [
"serde",
]
[[package]]
name = "capnp"
-version = "0.19.3"
+version = "0.19.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b11832e6fb7a695c4a63cc42bd97bd2cda7165cd850caf5aff9a3d0e617720ed"
+checksum = "de71387912cac7dd3cb7c219e09628411620a18061bba58c71453c26ae7bf66a"
dependencies = [
"embedded-io",
]
+[[package]]
+name = "capnpc"
+version = "0.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c75ba30e0f08582d53c2f3710cf4bb65ff562614b1ba86906d7391adffe189ec"
+dependencies = [
+ "capnp",
+]
+
[[package]]
name = "cargo-platform"
version = "0.1.8"
@@ -1482,7 +1483,7 @@ checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037"
dependencies = [
"camino",
"cargo-platform",
- "semver 1.0.22",
+ "semver 1.0.23",
"serde",
"serde_json",
"thiserror",
@@ -1499,9 +1500,9 @@ dependencies = [
[[package]]
name = "cc"
-version = "1.0.95"
+version = "1.0.104"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d32a725bc159af97c3e629873bb9f88fb8cf8a4867175f76dc987815ea07c83b"
+checksum = "74b6a57f98764a267ff415d50a25e6e166f3831a5071af4995296ea97d210490"
dependencies = [
"jobserver",
"libc",
@@ -1510,18 +1511,20 @@ dependencies = [
[[package]]
name = "cdn-broker"
-version = "0.1.0"
-source = "git+https://github.com/EspressoSystems/Push-CDN?tag=0.2.4#31a2f7f97ba32f8b2894fae4e7d3e5c484eb3675"
+version = "0.4.0"
+source = "git+https://github.com/EspressoSystems/Push-CDN?tag=0.4.0#fdcf88863147173fb270e830abbbb24308268087"
dependencies = [
"async-std",
- "cdn-proto 0.1.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.2.4)",
+ "cdn-proto 0.4.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.4.0)",
"clap",
- "dashmap",
+ "console-subscriber 0.3.0",
+ "dashmap 5.5.3",
"derivative",
- "jf-primitives 0.4.0-pre.0",
+ "jf-signature",
"lazy_static",
"local-ip-address",
"parking_lot",
+ "portpicker",
"prometheus",
"rand 0.8.5",
"rkyv",
@@ -1532,18 +1535,20 @@ dependencies = [
[[package]]
name = "cdn-broker"
-version = "0.1.0"
-source = "git+https://github.com/EspressoSystems/Push-CDN?tag=0.2.6#9e494917ff46732ac669ce07c5dcb8a989bbc03a"
+version = "0.4.0"
+source = "git+https://github.com/EspressoSystems/Push-CDN?tag=0.4.2#09389360284c51dd44a3dae1f1c3b395125abe82"
dependencies = [
"async-std",
- "cdn-proto 0.1.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.2.6)",
+ "cdn-proto 0.4.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.4.2)",
"clap",
- "dashmap",
+ "console-subscriber 0.3.0",
+ "dashmap 5.5.3",
"derivative",
- "jf-primitives 0.4.0-pre.0",
+ "jf-signature",
"lazy_static",
"local-ip-address",
"parking_lot",
+ "portpicker",
"prometheus",
"rand 0.8.5",
"rkyv",
@@ -1554,13 +1559,13 @@ dependencies = [
[[package]]
name = "cdn-client"
-version = "0.1.0"
-source = "git+https://github.com/EspressoSystems/Push-CDN?tag=0.2.4#31a2f7f97ba32f8b2894fae4e7d3e5c484eb3675"
+version = "0.4.0"
+source = "git+https://github.com/EspressoSystems/Push-CDN?tag=0.4.0#fdcf88863147173fb270e830abbbb24308268087"
dependencies = [
"async-std",
- "cdn-proto 0.1.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.2.4)",
+ "cdn-proto 0.4.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.4.0)",
"clap",
- "jf-primitives 0.4.0-pre.0",
+ "jf-signature",
"rand 0.8.5",
"tokio",
"tracing",
@@ -1569,13 +1574,13 @@ dependencies = [
[[package]]
name = "cdn-marshal"
-version = "0.1.0"
-source = "git+https://github.com/EspressoSystems/Push-CDN?tag=0.2.4#31a2f7f97ba32f8b2894fae4e7d3e5c484eb3675"
+version = "0.4.0"
+source = "git+https://github.com/EspressoSystems/Push-CDN?tag=0.4.0#fdcf88863147173fb270e830abbbb24308268087"
dependencies = [
"async-std",
- "cdn-proto 0.1.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.2.4)",
+ "cdn-proto 0.4.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.4.0)",
"clap",
- "jf-primitives 0.4.0-pre.0",
+ "jf-signature",
"tokio",
"tracing",
"tracing-subscriber 0.3.18",
@@ -1583,13 +1588,13 @@ dependencies = [
[[package]]
name = "cdn-marshal"
-version = "0.1.0"
-source = "git+https://github.com/EspressoSystems/Push-CDN?tag=0.2.6#9e494917ff46732ac669ce07c5dcb8a989bbc03a"
+version = "0.4.0"
+source = "git+https://github.com/EspressoSystems/Push-CDN?tag=0.4.2#09389360284c51dd44a3dae1f1c3b395125abe82"
dependencies = [
"async-std",
- "cdn-proto 0.1.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.2.6)",
+ "cdn-proto 0.4.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.4.2)",
"clap",
- "jf-primitives 0.4.0-pre.0",
+ "jf-signature",
"tokio",
"tracing",
"tracing-subscriber 0.3.18",
@@ -1597,31 +1602,33 @@ dependencies = [
[[package]]
name = "cdn-proto"
-version = "0.1.0"
-source = "git+https://github.com/EspressoSystems/Push-CDN?tag=0.2.4#31a2f7f97ba32f8b2894fae4e7d3e5c484eb3675"
+version = "0.4.0"
+source = "git+https://github.com/EspressoSystems/Push-CDN?tag=0.4.0#fdcf88863147173fb270e830abbbb24308268087"
dependencies = [
"anyhow",
"ark-serialize",
"async-trait",
"capnp",
+ "capnpc",
"derivative",
- "jf-primitives 0.4.0-pre.0",
+ "jf-signature",
"kanal",
"lazy_static",
"mnemonic",
- "mockall",
- "parking_lot",
+ "num_enum",
"pem 3.0.4",
"prometheus",
"quinn",
"rand 0.8.5",
- "rcgen 0.12.1",
+ "rcgen 0.13.1",
"redis",
"rkyv",
- "rustls 0.21.12",
+ "rustls 0.23.10",
+ "rustls-pki-types",
"sqlx",
"thiserror",
"tokio",
+ "tokio-rustls 0.26.0",
"tracing",
"url",
"warp",
@@ -1629,31 +1636,33 @@ dependencies = [
[[package]]
name = "cdn-proto"
-version = "0.1.0"
-source = "git+https://github.com/EspressoSystems/Push-CDN?tag=0.2.6#9e494917ff46732ac669ce07c5dcb8a989bbc03a"
+version = "0.4.0"
+source = "git+https://github.com/EspressoSystems/Push-CDN?tag=0.4.2#09389360284c51dd44a3dae1f1c3b395125abe82"
dependencies = [
"anyhow",
"ark-serialize",
"async-trait",
"capnp",
+ "capnpc",
"derivative",
- "jf-primitives 0.4.0-pre.0",
+ "jf-signature",
"kanal",
"lazy_static",
"mnemonic",
- "mockall",
- "parking_lot",
+ "num_enum",
"pem 3.0.4",
"prometheus",
"quinn",
"rand 0.8.5",
- "rcgen 0.12.1",
+ "rcgen 0.13.1",
"redis",
"rkyv",
- "rustls 0.21.12",
+ "rustls 0.23.10",
+ "rustls-pki-types",
"sqlx",
"thiserror",
"tokio",
+ "tokio-rustls 0.26.0",
"tracing",
"url",
"warp",
@@ -1726,9 +1735,9 @@ dependencies = [
[[package]]
name = "clap"
-version = "4.5.4"
+version = "4.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0"
+checksum = "84b3edb18336f4df585bc9aa31dd99c036dfa5dc5e9a2939a722a188f3a8970d"
dependencies = [
"clap_builder",
"clap_derive",
@@ -1736,33 +1745,33 @@ dependencies = [
[[package]]
name = "clap_builder"
-version = "4.5.2"
+version = "4.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4"
+checksum = "c1c09dd5ada6c6c78075d6fd0da3f90d8080651e2d6cc8eb2f1aaa4034ced708"
dependencies = [
"anstream",
"anstyle",
"clap_lex",
- "strsim 0.11.1",
+ "strsim",
]
[[package]]
name = "clap_derive"
-version = "4.5.4"
+version = "4.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64"
+checksum = "2bac35c6dafb060fd4d275d9a4ffae97917c13a6327903a8be2153cd964f7085"
dependencies = [
"heck 0.5.0",
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.68",
]
[[package]]
name = "clap_lex"
-version = "0.7.0"
+version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce"
+checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70"
[[package]]
name = "cld"
@@ -1851,9 +1860,9 @@ dependencies = [
[[package]]
name = "colorchoice"
-version = "1.0.0"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7"
+checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422"
[[package]]
name = "combine"
@@ -1884,7 +1893,7 @@ dependencies = [
"hex",
"serde",
"sha3",
- "tagged-base64 0.4.0",
+ "tagged-base64",
]
[[package]]
@@ -1925,7 +1934,20 @@ dependencies = [
"futures-core",
"prost",
"prost-types",
- "tonic",
+ "tonic 0.10.2",
+ "tracing-core",
+]
+
+[[package]]
+name = "console-api"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a257c22cd7e487dd4a13d413beabc512c5052f0bc048db0da6a84c3d8a6142fd"
+dependencies = [
+ "futures-core",
+ "prost",
+ "prost-types",
+ "tonic 0.11.0",
"tracing-core",
]
@@ -1935,19 +1957,44 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7481d4c57092cd1c19dd541b92bdce883de840df30aa5d03fd48a3935c01842e"
dependencies = [
- "console-api",
+ "console-api 0.6.0",
+ "crossbeam-channel",
+ "crossbeam-utils",
+ "futures-task",
+ "hdrhistogram",
+ "humantime",
+ "prost-types",
+ "serde",
+ "serde_json",
+ "thread_local",
+ "tokio",
+ "tokio-stream",
+ "tonic 0.10.2",
+ "tracing",
+ "tracing-core",
+ "tracing-subscriber 0.3.18",
+]
+
+[[package]]
+name = "console-subscriber"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "31c4cc54bae66f7d9188996404abdf7fdfa23034ef8e43478c8810828abad758"
+dependencies = [
+ "console-api 0.7.0",
"crossbeam-channel",
"crossbeam-utils",
"futures-task",
"hdrhistogram",
"humantime",
+ "prost",
"prost-types",
"serde",
"serde_json",
"thread_local",
"tokio",
"tokio-stream",
- "tonic",
+ "tonic 0.11.0",
"tracing",
"tracing-core",
"tracing-subscriber 0.3.18",
@@ -1955,9 +2002,9 @@ dependencies = [
[[package]]
name = "const-hex"
-version = "1.11.3"
+version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ba00838774b4ab0233e355d26710fbfc8327a05c017f6dc4873f876d1f79f78"
+checksum = "94fb8a24a26d37e1ffd45343323dc9fe6654ceea44c12f2fcb3d7ac29e610bc6"
dependencies = [
"cfg-if",
"cpufeatures",
@@ -1987,7 +2034,7 @@ version = "0.1.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e"
dependencies = [
- "getrandom 0.2.14",
+ "getrandom 0.2.15",
"once_cell",
"tiny-keccak",
]
@@ -2101,9 +2148,9 @@ dependencies = [
[[package]]
name = "crc-any"
-version = "2.4.4"
+version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c01a5e1f881f6fb6099a7bdf949e946719fd4f1fefa56264890574febf0eb6d0"
+checksum = "a62ec9ff5f7965e4d7280bd5482acd20aadb50d632cf6c1d74493856b011fa73"
[[package]]
name = "crc-catalog"
@@ -2113,18 +2160,18 @@ checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5"
[[package]]
name = "crc32fast"
-version = "1.4.0"
+version = "1.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
dependencies = [
"cfg-if",
]
[[package]]
name = "crossbeam-channel"
-version = "0.5.12"
+version = "0.5.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95"
+checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2"
dependencies = [
"crossbeam-utils",
]
@@ -2159,9 +2206,9 @@ dependencies = [
[[package]]
name = "crossbeam-utils"
-version = "0.8.19"
+version = "0.8.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345"
+checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80"
[[package]]
name = "crunchy"
@@ -2212,18 +2259,6 @@ dependencies = [
"subtle",
]
-[[package]]
-name = "crypto_kx"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "704722d1d929489c8528bb1882805700f1ba20f54325704973e786352320b1ed"
-dependencies = [
- "blake2",
- "curve25519-dalek",
- "rand_core 0.6.4",
- "serdect",
-]
-
[[package]]
name = "csv"
version = "1.3.0"
@@ -2291,9 +2326,9 @@ dependencies = [
[[package]]
name = "curl-sys"
-version = "0.4.72+curl-8.6.0"
+version = "0.4.73+curl-8.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "29cbdc8314c447d11e8fd156dcdd031d9e02a7a976163e396b548c03153bc9ea"
+checksum = "450ab250ecf17227c39afb9a2dd9261dc0035cb80f2612472fc0c4aac2dcb84d"
dependencies = [
"cc",
"libc",
@@ -2307,16 +2342,15 @@ dependencies = [
[[package]]
name = "curve25519-dalek"
-version = "4.1.2"
+version = "4.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348"
+checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be"
dependencies = [
"cfg-if",
"cpufeatures",
"curve25519-dalek-derive",
"digest 0.10.7",
"fiat-crypto",
- "platforms",
"rustc_version 0.4.0",
"subtle",
"zeroize",
@@ -2330,7 +2364,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.68",
]
[[package]]
@@ -2372,15 +2406,15 @@ dependencies = [
"itertools 0.12.1",
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.68",
"synstructure 0.13.1",
]
[[package]]
name = "darling"
-version = "0.20.8"
+version = "0.20.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391"
+checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1"
dependencies = [
"darling_core",
"darling_macro",
@@ -2388,27 +2422,27 @@ dependencies = [
[[package]]
name = "darling_core"
-version = "0.20.8"
+version = "0.20.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f"
+checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120"
dependencies = [
"fnv",
"ident_case",
"proc-macro2",
"quote",
- "strsim 0.10.0",
- "syn 2.0.60",
+ "strsim",
+ "syn 2.0.68",
]
[[package]]
name = "darling_macro"
-version = "0.20.8"
+version = "0.20.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f"
+checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178"
dependencies = [
"darling_core",
"quote",
- "syn 2.0.60",
+ "syn 2.0.68",
]
[[package]]
@@ -2424,6 +2458,20 @@ dependencies = [
"parking_lot_core",
]
+[[package]]
+name = "dashmap"
+version = "6.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "804c8821570c3f8b70230c2ba75ffa5c0f9a4189b9a432b6656c536712acae28"
+dependencies = [
+ "cfg-if",
+ "crossbeam-utils",
+ "hashbrown 0.14.5",
+ "lock_api",
+ "once_cell",
+ "parking_lot_core",
+]
+
[[package]]
name = "data-encoding"
version = "2.6.0"
@@ -2463,9 +2511,9 @@ dependencies = [
[[package]]
name = "der-parser"
-version = "8.2.0"
+version = "9.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dbd676fbbab537128ef0278adb5576cf363cff6aa22a7b24effe97347cfab61e"
+checksum = "5cd0a5c643689626bec213c4d8bd4d96acc8ffdb4ad4bb6bc16abf27d5f4b553"
dependencies = [
"asn1-rs",
"displaydoc",
@@ -2504,7 +2552,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.68",
]
[[package]]
@@ -2525,7 +2573,7 @@ dependencies = [
"darling",
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.68",
]
[[package]]
@@ -2535,22 +2583,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "206868b8242f27cecce124c19fd88157fbd0dd334df2587f36417bafbc85097b"
dependencies = [
"derive_builder_core",
- "syn 2.0.60",
+ "syn 2.0.68",
]
[[package]]
name = "derive_more"
-version = "0.99.17"
+version = "0.99.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321"
+checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce"
dependencies = [
"convert_case 0.4.0",
"proc-macro2",
"quote",
"rustc_version 0.4.0",
- "syn 1.0.109",
+ "syn 2.0.68",
]
+[[package]]
+name = "diff"
+version = "0.1.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8"
+
[[package]]
name = "diff-test-bn254"
version = "0.1.0"
@@ -2585,10 +2639,11 @@ dependencies = [
"hotshot-state-prover",
"hotshot-types",
"itertools 0.12.1",
+ "jf-pcs",
"jf-plonk",
- "jf-primitives 0.4.4",
- "jf-relation 0.4.4",
- "jf-utils 0.4.4",
+ "jf-relation",
+ "jf-signature",
+ "jf-utils",
"sha3",
]
@@ -2672,13 +2727,13 @@ checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0"
[[package]]
name = "displaydoc"
-version = "0.2.4"
+version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d"
+checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.68",
]
[[package]]
@@ -2702,12 +2757,6 @@ version = "0.15.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b"
-[[package]]
-name = "downcast"
-version = "0.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1"
-
[[package]]
name = "downcast-rs"
version = "1.2.1"
@@ -2778,15 +2827,15 @@ dependencies = [
[[package]]
name = "edit-distance"
-version = "2.1.0"
+version = "2.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbbaaaf38131deb9ca518a274a45bfdb8771f139517b073b16c2d3d32ae5037b"
+checksum = "853fc7035888bd1c9320f3a05bfe7f344f49b8766a4bb4209b1ac5f0503d9577"
[[package]]
name = "either"
-version = "1.11.0"
+version = "1.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2"
+checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
dependencies = [
"serde",
]
@@ -2818,9 +2867,9 @@ checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d"
[[package]]
name = "ena"
-version = "0.14.2"
+version = "0.14.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c533630cf40e9caa44bd91aadc88a75d75a4c3a12b4cfde353cbed41daa1e1f1"
+checksum = "3d248bdd43ce613d87415282f69b9bb99d947d290b10962dd6c56233312c2ad5"
dependencies = [
"log",
]
@@ -2861,7 +2910,7 @@ dependencies = [
"heck 0.4.1",
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.68",
]
[[package]]
@@ -2872,18 +2921,19 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
[[package]]
name = "erased-serde"
-version = "0.4.4"
+version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b73807008a3c7f171cc40312f37d95ef0396e048b5848d775f54b1a4dd4a0d3"
+checksum = "24e2389d65ab4fab27dc2a5de7b191e1f6617d1f1c8855c0dc569c94a4cbb18d"
dependencies = [
"serde",
+ "typeid",
]
[[package]]
name = "errno"
-version = "0.3.8"
+version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245"
+checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba"
dependencies = [
"libc",
"windows-sys 0.52.0",
@@ -2897,6 +2947,18 @@ dependencies = [
"vbs",
]
+[[package]]
+name = "escargot"
+version = "0.5.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "650eb5f6eeda986377996e9ed570cbc20cc16d30440696f82f129c863e4e3e83"
+dependencies = [
+ "log",
+ "once_cell",
+ "serde",
+ "serde_json",
+]
+
[[package]]
name = "espresso-macros"
version = "0.1.0"
@@ -3064,7 +3126,7 @@ dependencies = [
"reqwest 0.11.27",
"serde",
"serde_json",
- "syn 2.0.60",
+ "syn 2.0.68",
"toml",
"walkdir",
]
@@ -3082,7 +3144,7 @@ dependencies = [
"proc-macro2",
"quote",
"serde_json",
- "syn 2.0.60",
+ "syn 2.0.68",
]
[[package]]
@@ -3108,7 +3170,7 @@ dependencies = [
"serde",
"serde_json",
"strum",
- "syn 2.0.60",
+ "syn 2.0.68",
"tempfile",
"thiserror",
"tiny-keccak",
@@ -3125,7 +3187,7 @@ dependencies = [
"ethers-core",
"ethers-solc",
"reqwest 0.11.27",
- "semver 1.0.22",
+ "semver 1.0.23",
"serde",
"serde_json",
"thiserror",
@@ -3234,7 +3296,7 @@ dependencies = [
"path-slash",
"rayon",
"regex",
- "semver 1.0.22",
+ "semver 1.0.23",
"serde",
"serde_json",
"solang-parser",
@@ -3266,43 +3328,22 @@ dependencies = [
[[package]]
name = "event-listener"
-version = "4.0.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e"
-dependencies = [
- "concurrent-queue",
- "parking",
- "pin-project-lite 0.2.14",
-]
-
-[[package]]
-name = "event-listener"
-version = "5.3.0"
+version = "5.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d9944b8ca13534cdfb2800775f8dd4902ff3fc75a50101466decadfdf322a24"
+checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba"
dependencies = [
"concurrent-queue",
"parking",
"pin-project-lite 0.2.14",
]
-[[package]]
-name = "event-listener-strategy"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3"
-dependencies = [
- "event-listener 4.0.3",
- "pin-project-lite 0.2.14",
-]
-
[[package]]
name = "event-listener-strategy"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1"
dependencies = [
- "event-listener 5.3.0",
+ "event-listener 5.3.1",
"pin-project-lite 0.2.14",
]
@@ -3349,15 +3390,9 @@ dependencies = [
[[package]]
name = "fiat-crypto"
-version = "0.2.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38793c55593b33412e3ae40c2c9781ffaa6f438f6f8c10f24e71846fbd7ae01e"
-
-[[package]]
-name = "finl_unicode"
-version = "1.2.0"
+version = "0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6"
+checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d"
[[package]]
name = "fixed-hash"
@@ -3387,6 +3422,16 @@ dependencies = [
"miniz_oxide",
]
+[[package]]
+name = "fluent-asserter"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62cd2a1243f15c8c9d37acc8ab4ba837e50823561cb124af8406a6f676d04341"
+dependencies = [
+ "lazy_static",
+ "num",
+]
+
[[package]]
name = "flume"
version = "0.9.2"
@@ -3440,12 +3485,6 @@ dependencies = [
"percent-encoding",
]
-[[package]]
-name = "fragile"
-version = "2.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa"
-
[[package]]
name = "fs2"
version = "0.4.3"
@@ -3479,9 +3518,9 @@ dependencies = [
[[package]]
name = "futures-bounded"
-version = "0.2.3"
+version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e1e2774cc104e198ef3d3e1ff4ab40f86fa3245d6cb6a3a46174f21463cee173"
+checksum = "91f328e7fb845fc832912fb6a34f40cf6d1888c92f974d1893a54e97b5ff542e"
dependencies = [
"futures-timer",
"futures-util",
@@ -3578,7 +3617,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.68",
]
[[package]]
@@ -3591,6 +3630,17 @@ dependencies = [
"rustls 0.21.12",
]
+[[package]]
+name = "futures-rustls"
+version = "0.26.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8f2f12607f92c69b12ed746fabf9ca4f5c482cba46679c1a75b874ed7c26adb"
+dependencies = [
+ "futures-io",
+ "rustls 0.23.10",
+ "rustls-pki-types",
+]
+
[[package]]
name = "futures-sink"
version = "0.3.30"
@@ -3659,7 +3709,7 @@ dependencies = [
"hotshot-contract-adapter",
"hotshot-stake-table",
"hotshot-state-prover",
- "jf-primitives 0.4.4",
+ "jf-pcs",
]
[[package]]
@@ -3687,9 +3737,9 @@ dependencies = [
[[package]]
name = "getrandom"
-version = "0.2.14"
+version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c"
+checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
dependencies = [
"cfg-if",
"js-sys",
@@ -3774,15 +3824,15 @@ dependencies = [
[[package]]
name = "h2"
-version = "0.4.4"
+version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "816ec7294445779408f36fe57bc5b7fc1cf59664059096c65f905c1c61f58069"
+checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab"
dependencies = [
+ "atomic-waker",
"bytes 1.6.0",
"fnv",
"futures-core",
"futures-sink",
- "futures-util",
"http 1.1.0",
"indexmap 2.2.6",
"slab",
@@ -3895,6 +3945,12 @@ version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
+[[package]]
+name = "hermit-abi"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc"
+
[[package]]
name = "hex"
version = "0.4.3"
@@ -4040,8 +4096,8 @@ dependencies = [
[[package]]
name = "hotshot"
-version = "0.5.43"
-source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.46#f02711daca9ce18ecc86443fa054cafff76464f0"
+version = "0.5.60"
+source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.60#24597f75f7ddb439959e4aff584ec934dcdc1388"
dependencies = [
"anyhow",
"async-broadcast",
@@ -4052,12 +4108,13 @@ dependencies = [
"bimap",
"bincode",
"blake3",
- "cdn-broker 0.1.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.2.4)",
+ "cdn-broker 0.4.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.4.0)",
"cdn-client",
- "cdn-marshal 0.1.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.2.4)",
+ "cdn-marshal 0.4.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.4.0)",
+ "chrono",
"committable",
"custom_debug 0.5.1",
- "dashmap",
+ "dashmap 6.0.1",
"derive_more",
"either",
"ethereum-types",
@@ -4066,16 +4123,16 @@ dependencies = [
"hotshot-task",
"hotshot-task-impls",
"hotshot-types",
- "hotshot-web-server",
- "jf-primitives 0.4.4",
+ "jf-signature",
"libp2p-identity",
"libp2p-networking",
"lru 0.12.3",
+ "num_enum",
"portpicker",
"rand 0.8.5",
"serde",
"sha2 0.10.8",
- "snafu 0.8.2",
+ "snafu 0.8.3",
"surf-disco",
"time 0.3.36",
"tokio",
@@ -4086,7 +4143,7 @@ dependencies = [
[[package]]
name = "hotshot-builder-api"
version = "0.1.7"
-source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.46#f02711daca9ce18ecc86443fa054cafff76464f0"
+source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.60#24597f75f7ddb439959e4aff584ec934dcdc1388"
dependencies = [
"async-trait",
"clap",
@@ -4095,8 +4152,8 @@ dependencies = [
"futures",
"hotshot-types",
"serde",
- "snafu 0.8.2",
- "tagged-base64 0.4.0",
+ "snafu 0.8.3",
+ "tagged-base64",
"tide-disco",
"toml",
"vbs",
@@ -4104,9 +4161,10 @@ dependencies = [
[[package]]
name = "hotshot-builder-core"
-version = "0.1.14"
-source = "git+https://github.com/EspressoSystems/hotshot-builder-core?tag=0.1.14#2e873a3775a9f412bb084afef25e419e8ecd1773"
+version = "0.1.26"
+source = "git+https://github.com/EspressoSystems/hotshot-builder-core?tag=rc-0.1.31-patch-1#b0bdbd6fac8c969ac52d56c1a1c17a0cc5d1d441"
dependencies = [
+ "anyhow",
"async-broadcast",
"async-compatibility-layer",
"async-lock 2.8.0",
@@ -4114,6 +4172,7 @@ dependencies = [
"async-trait",
"clap",
"committable",
+ "derivative",
"futures",
"hotshot",
"hotshot-builder-api",
@@ -4121,10 +4180,11 @@ dependencies = [
"hotshot-types",
"serde",
"sha2 0.10.8",
- "snafu 0.8.2",
+ "snafu 0.8.3",
"surf-disco",
- "tagged-base64 0.4.0",
+ "tagged-base64",
"tide-disco",
+ "tokio",
"tracing",
"vbs",
]
@@ -4145,17 +4205,17 @@ dependencies = [
"diff-test-bn254",
"ethers",
"hotshot-types",
+ "jf-pcs",
"jf-plonk",
- "jf-primitives 0.4.4",
- "jf-utils 0.4.4",
+ "jf-utils",
"num-bigint",
"num-traits",
]
[[package]]
name = "hotshot-events-service"
-version = "0.1.15"
-source = "git+https://github.com/EspressoSystems/hotshot-events-service.git?tag=0.1.16#dc8d019f7f487ad2bbb87cc934498d0abfc4af13"
+version = "0.1.27"
+source = "git+https://github.com/EspressoSystems/hotshot-events-service.git?tag=rc-0.1.31#2c89a146adf5c3a8e887314f07a013d5d11b6483"
dependencies = [
"async-broadcast",
"async-compatibility-layer",
@@ -4169,8 +4229,8 @@ dependencies = [
"futures",
"hotshot-types",
"serde",
- "snafu 0.8.2",
- "tagged-base64 0.4.0",
+ "snafu 0.8.3",
+ "tagged-base64",
"tide-disco",
"toml",
"tracing",
@@ -4179,8 +4239,8 @@ dependencies = [
[[package]]
name = "hotshot-example-types"
-version = "0.5.43"
-source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.46#f02711daca9ce18ecc86443fa054cafff76464f0"
+version = "0.5.60"
+source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.60#24597f75f7ddb439959e4aff584ec934dcdc1388"
dependencies = [
"anyhow",
"async-broadcast",
@@ -4201,27 +4261,29 @@ dependencies = [
"serde",
"sha2 0.10.8",
"sha3",
- "snafu 0.8.2",
+ "snafu 0.8.3",
"time 0.3.36",
"tokio",
"tracing",
+ "url",
+ "vbs",
]
[[package]]
name = "hotshot-macros"
-version = "0.5.43"
-source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.46#f02711daca9ce18ecc86443fa054cafff76464f0"
+version = "0.5.60"
+source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.60#24597f75f7ddb439959e4aff584ec934dcdc1388"
dependencies = [
"derive_builder",
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.68",
]
[[package]]
name = "hotshot-orchestrator"
-version = "0.5.43"
-source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.46#f02711daca9ce18ecc86443fa054cafff76464f0"
+version = "0.5.60"
+source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.60#24597f75f7ddb439959e4aff584ec934dcdc1388"
dependencies = [
"anyhow",
"async-compatibility-layer",
@@ -4245,24 +4307,24 @@ dependencies = [
"toml",
"tracing",
"vbs",
+ "vec1",
]
[[package]]
name = "hotshot-query-service"
-version = "0.1.14"
-source = "git+https://github.com/EspressoSystems/hotshot-query-service?tag=0.1.14#4a10a39e34888afd8b56705bf0991a391a7d35c9"
+version = "0.1.39"
+source = "git+https://github.com/EspressoSystems/hotshot-query-service?tag=rc-0.1.43#4206e5c2f52cde19a9b503d2f8e7b4fe26aa9a04"
dependencies = [
"anyhow",
"ark-serialize",
"async-compatibility-layer",
+ "async-lock 3.4.0",
"async-std",
"async-trait",
"atomic_store",
"bincode",
"bit-vec",
"chrono",
- "clap",
- "cld",
"committable",
"custom_debug 0.6.1",
"derivative",
@@ -4276,7 +4338,8 @@ dependencies = [
"hotshot-types",
"include_dir",
"itertools 0.12.1",
- "jf-primitives 0.4.4",
+ "jf-merkle-tree",
+ "jf-vid",
"native-tls",
"portpicker",
"postgres-native-tls",
@@ -4285,10 +4348,10 @@ dependencies = [
"refinery",
"serde",
"serde_json",
- "snafu 0.8.2",
+ "snafu 0.8.3",
"spin_sleep",
"surf-disco",
- "tagged-base64 0.4.0",
+ "tagged-base64",
"tempfile",
"tide-disco",
"time 0.3.36",
@@ -4298,13 +4361,15 @@ dependencies = [
"tracing",
"trait-variant",
"typenum",
+ "url",
"vbs",
+ "vec1",
]
[[package]]
name = "hotshot-stake-table"
-version = "0.5.43"
-source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.46#f02711daca9ce18ecc86443fa054cafff76464f0"
+version = "0.5.60"
+source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.60#24597f75f7ddb439959e4aff584ec934dcdc1388"
dependencies = [
"ark-bn254",
"ark-ed-on-bn254",
@@ -4314,10 +4379,12 @@ dependencies = [
"digest 0.10.7",
"ethereum-types",
"hotshot-types",
- "jf-primitives 0.4.4",
- "jf-utils 0.4.4",
+ "jf-crhf",
+ "jf-rescue",
+ "jf-signature",
+ "jf-utils",
"serde",
- "tagged-base64 0.4.0",
+ "tagged-base64",
]
[[package]]
@@ -4349,16 +4416,20 @@ dependencies = [
"hotshot-stake-table",
"hotshot-types",
"itertools 0.12.1",
+ "jf-crhf",
+ "jf-pcs",
"jf-plonk",
- "jf-primitives 0.4.4",
- "jf-relation 0.4.4",
- "jf-utils 0.4.4",
+ "jf-relation",
+ "jf-rescue",
+ "jf-signature",
+ "jf-utils",
"rand_chacha 0.3.1",
+ "reqwest 0.12.5",
"sequencer-utils",
"serde",
- "snafu 0.8.2",
+ "snafu 0.8.3",
"surf-disco",
- "tagged-base64 0.3.4",
+ "tagged-base64",
"tide-disco",
"time 0.3.36",
"toml",
@@ -4369,12 +4440,14 @@ dependencies = [
[[package]]
name = "hotshot-task"
-version = "0.5.43"
-source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.46#f02711daca9ce18ecc86443fa054cafff76464f0"
+version = "0.5.60"
+source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.60#24597f75f7ddb439959e4aff584ec934dcdc1388"
dependencies = [
+ "anyhow",
"async-broadcast",
"async-compatibility-layer",
"async-std",
+ "async-trait",
"futures",
"tokio",
"tracing",
@@ -4382,8 +4455,8 @@ dependencies = [
[[package]]
name = "hotshot-task-impls"
-version = "0.5.43"
-source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.46#f02711daca9ce18ecc86443fa054cafff76464f0"
+version = "0.5.60"
+source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.60#24597f75f7ddb439959e4aff584ec934dcdc1388"
dependencies = [
"anyhow",
"async-broadcast",
@@ -4393,6 +4466,7 @@ dependencies = [
"async-trait",
"bincode",
"bitvec",
+ "cdn-proto 0.4.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.4.0)",
"chrono",
"committable",
"either",
@@ -4400,13 +4474,14 @@ dependencies = [
"hotshot-builder-api",
"hotshot-task",
"hotshot-types",
- "jf-primitives 0.4.4",
+ "jf-signature",
+ "jf-vid",
"rand 0.8.5",
"serde",
"sha2 0.10.8",
- "snafu 0.8.2",
+ "snafu 0.8.3",
"surf-disco",
- "tagged-base64 0.4.0",
+ "tagged-base64",
"time 0.3.36",
"tokio",
"tracing",
@@ -4415,9 +4490,10 @@ dependencies = [
[[package]]
name = "hotshot-testing"
-version = "0.5.43"
-source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.46#f02711daca9ce18ecc86443fa054cafff76464f0"
+version = "0.5.60"
+source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.60#24597f75f7ddb439959e4aff584ec934dcdc1388"
dependencies = [
+ "anyhow",
"async-broadcast",
"async-compatibility-layer",
"async-lock 2.8.0",
@@ -4437,25 +4513,27 @@ dependencies = [
"hotshot-task",
"hotshot-task-impls",
"hotshot-types",
- "jf-primitives 0.4.4",
+ "jf-signature",
+ "jf-vid",
"lru 0.12.3",
"portpicker",
"rand 0.8.5",
"serde",
"sha2 0.10.8",
"sha3",
- "snafu 0.8.2",
- "tagged-base64 0.4.0",
+ "snafu 0.8.3",
+ "tagged-base64",
"tide-disco",
"tokio",
"tracing",
"vbs",
+ "vec1",
]
[[package]]
name = "hotshot-types"
version = "0.1.11"
-source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.46#f02711daca9ce18ecc86443fa054cafff76464f0"
+source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.60#24597f75f7ddb439959e4aff584ec934dcdc1388"
dependencies = [
"anyhow",
"ark-bls12-381",
@@ -4473,7 +4551,7 @@ dependencies = [
"bincode",
"bitvec",
"blake3",
- "cdn-proto 0.1.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.2.4)",
+ "cdn-proto 0.4.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.4.0)",
"committable",
"custom_debug 0.5.1",
"derivative",
@@ -4485,42 +4563,25 @@ dependencies = [
"ethereum-types",
"futures",
"generic-array",
- "jf-plonk",
- "jf-primitives 0.4.4",
- "jf-utils 0.4.4",
+ "jf-pcs",
+ "jf-signature",
+ "jf-utils",
+ "jf-vid",
"lazy_static",
"memoize",
"rand 0.8.5",
"rand_chacha 0.3.1",
"serde",
"sha2 0.10.8",
- "snafu 0.8.2",
- "tagged-base64 0.4.0",
+ "snafu 0.8.3",
+ "tagged-base64",
"time 0.3.36",
"tokio",
"tracing",
"typenum",
"url",
"vbs",
-]
-
-[[package]]
-name = "hotshot-web-server"
-version = "0.5.43"
-source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.46#f02711daca9ce18ecc86443fa054cafff76464f0"
-dependencies = [
- "async-compatibility-layer",
- "async-lock 2.8.0",
- "async-std",
- "clap",
- "futures",
- "hotshot-types",
- "rand 0.8.5",
- "tide-disco",
- "tokio",
- "toml",
- "tracing",
- "vbs",
+ "vec1",
]
[[package]]
@@ -4568,12 +4629,12 @@ dependencies = [
[[package]]
name = "http-body-util"
-version = "0.1.1"
+version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d"
+checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f"
dependencies = [
"bytes 1.6.0",
- "futures-core",
+ "futures-util",
"http 1.1.0",
"http-body 1.0.0",
"pin-project-lite 0.2.14",
@@ -4617,9 +4678,9 @@ dependencies = [
[[package]]
name = "httparse"
-version = "1.8.0"
+version = "1.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
+checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9"
[[package]]
name = "httpdate"
@@ -4635,9 +4696,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
[[package]]
name = "hyper"
-version = "0.14.28"
+version = "0.14.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80"
+checksum = "f361cde2f109281a220d4307746cdfd5ee3f410da58a70377762396775634b33"
dependencies = [
"bytes 1.6.0",
"futures-channel",
@@ -4659,14 +4720,14 @@ dependencies = [
[[package]]
name = "hyper"
-version = "1.3.1"
+version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d"
+checksum = "c4fe55fb7a772d59a5ff1dfbff4fe0258d19b89fec4b233e75d35d5d2316badc"
dependencies = [
"bytes 1.6.0",
"futures-channel",
"futures-util",
- "h2 0.4.4",
+ "h2 0.4.5",
"http 1.1.0",
"http-body 1.0.0",
"httparse",
@@ -4685,10 +4746,27 @@ checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590"
dependencies = [
"futures-util",
"http 0.2.12",
- "hyper 0.14.28",
+ "hyper 0.14.29",
"rustls 0.21.12",
"tokio",
- "tokio-rustls",
+ "tokio-rustls 0.24.1",
+]
+
+[[package]]
+name = "hyper-rustls"
+version = "0.27.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155"
+dependencies = [
+ "futures-util",
+ "http 1.1.0",
+ "hyper 1.4.0",
+ "hyper-util",
+ "rustls 0.23.10",
+ "rustls-pki-types",
+ "tokio",
+ "tokio-rustls 0.26.0",
+ "tower-service",
]
[[package]]
@@ -4697,7 +4775,7 @@ version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1"
dependencies = [
- "hyper 0.14.28",
+ "hyper 0.14.29",
"pin-project-lite 0.2.14",
"tokio",
"tokio-io-timeout",
@@ -4711,7 +4789,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0"
dependencies = [
"bytes 1.6.0",
"http-body-util",
- "hyper 1.3.1",
+ "hyper 1.4.0",
"hyper-util",
"native-tls",
"tokio",
@@ -4721,16 +4799,16 @@ dependencies = [
[[package]]
name = "hyper-util"
-version = "0.1.3"
+version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa"
+checksum = "3ab92f4f49ee4fb4f997c784b7a2e0fa70050211e0b6a287f898c3c9785ca956"
dependencies = [
"bytes 1.6.0",
"futures-channel",
"futures-util",
"http 1.1.0",
"http-body 1.0.0",
- "hyper 1.3.1",
+ "hyper 1.4.0",
"pin-project-lite 0.2.14",
"socket2 0.5.7",
"tokio",
@@ -4750,7 +4828,7 @@ dependencies = [
"iana-time-zone-haiku",
"js-sys",
"wasm-bindgen",
- "windows-core",
+ "windows-core 0.52.0",
]
[[package]]
@@ -4804,7 +4882,7 @@ version = "3.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d6b0422c86d7ce0e97169cc42e04ae643caf278874a7a3c87b8150a220dc7e1e"
dependencies = [
- "async-io 2.3.2",
+ "async-io 2.3.3",
"core-foundation",
"fnv",
"futures",
@@ -4829,7 +4907,7 @@ dependencies = [
"bytes 1.6.0",
"futures",
"http 0.2.12",
- "hyper 0.14.28",
+ "hyper 0.14.29",
"log",
"rand 0.8.5",
"tokio",
@@ -4877,18 +4955,18 @@ dependencies = [
[[package]]
name = "include_dir"
-version = "0.7.3"
+version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "18762faeff7122e89e0857b02f7ce6fcc0d101d5e9ad2ad7846cc01d61b7f19e"
+checksum = "923d117408f1e49d914f1a379a309cffe4f18c05cf4e3d12e613a15fc81bd0dd"
dependencies = [
"include_dir_macros",
]
[[package]]
name = "include_dir_macros"
-version = "0.7.3"
+version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b139284b5cf57ecfa712bcc66950bb635b31aff41c188e8a4cfc758eca374a3f"
+checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75"
dependencies = [
"proc-macro2",
"quote",
@@ -4948,9 +5026,9 @@ dependencies = [
[[package]]
name = "instant"
-version = "0.1.12"
+version = "0.1.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
+checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222"
dependencies = [
"cfg-if",
]
@@ -4961,7 +5039,7 @@ version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2"
dependencies = [
- "hermit-abi",
+ "hermit-abi 0.3.9",
"libc",
"windows-sys 0.48.0",
]
@@ -4984,6 +5062,12 @@ version = "2.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3"
+[[package]]
+name = "is_terminal_polyfill"
+version = "1.70.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800"
+
[[package]]
name = "isahc"
version = "0.9.14"
@@ -5050,126 +5134,111 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
[[package]]
-name = "jf-plonk"
-version = "0.4.4"
-source = "git+https://github.com/EspressoSystems/jellyfish?tag=0.4.4#8f48813ca52d964090dbf0de62f07f5e0c7e22c6"
+name = "jf-commitment"
+version = "0.1.0"
+source = "git+https://github.com/EspressoSystems/jellyfish?tag=0.4.5#7d71dbeff14f1a501b0b0dc391f1dffa1b8374fb"
+dependencies = [
+ "ark-std",
+]
+
+[[package]]
+name = "jf-crhf"
+version = "0.1.0"
+source = "git+https://github.com/EspressoSystems/jellyfish?tag=0.4.5#7d71dbeff14f1a501b0b0dc391f1dffa1b8374fb"
dependencies = [
+ "ark-serialize",
+ "ark-std",
+]
+
+[[package]]
+name = "jf-merkle-tree"
+version = "0.1.0"
+source = "git+https://github.com/EspressoSystems/jellyfish?tag=0.4.5#7d71dbeff14f1a501b0b0dc391f1dffa1b8374fb"
+dependencies = [
+ "ark-bls12-377",
+ "ark-bls12-381",
+ "ark-bn254",
"ark-ec",
"ark-ff",
- "ark-poly",
"ark-serialize",
"ark-std",
"derivative",
+ "digest 0.10.7",
"displaydoc",
- "downcast-rs",
- "dyn-clone 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)",
- "espresso-systems-common 0.4.0",
"hashbrown 0.14.5",
"itertools 0.12.1",
- "jf-primitives 0.4.4",
- "jf-relation 0.4.4",
- "jf-utils 0.4.4",
- "merlin",
+ "jf-relation",
+ "jf-rescue",
+ "jf-utils",
"num-bigint",
- "rand_chacha 0.3.1",
- "rayon",
+ "num-traits",
"serde",
"sha3",
- "tagged-base64 0.4.0",
+ "tagged-base64",
]
[[package]]
-name = "jf-primitives"
-version = "0.4.0-pre.0"
-source = "git+https://github.com/EspressoSystems/jellyfish?tag=0.4.2#f85f9024ef42ab8be95b2c81bd15fd6cbadeafbf"
+name = "jf-pcs"
+version = "0.1.0"
+source = "git+https://github.com/EspressoSystems/jellyfish?tag=0.4.5#7d71dbeff14f1a501b0b0dc391f1dffa1b8374fb"
dependencies = [
- "anyhow",
- "ark-bls12-377",
- "ark-bls12-381",
- "ark-bn254",
- "ark-bw6-761",
- "ark-crypto-primitives",
"ark-ec",
- "ark-ed-on-bls12-377",
- "ark-ed-on-bls12-381",
- "ark-ed-on-bn254",
"ark-ff",
- "ark-pallas",
"ark-poly",
"ark-serialize",
"ark-std",
- "blst",
- "chacha20poly1305",
- "crypto_kx",
"derivative",
- "digest 0.10.7",
"displaydoc",
- "espresso-systems-common 0.4.0",
- "generic-array",
- "hashbrown 0.14.5",
"itertools 0.12.1",
- "jf-relation 0.4.0-pre.0",
- "jf-utils 0.4.0-pre.0",
+ "jf-utils",
"merlin",
- "num-bigint",
- "num-traits",
- "rand_chacha 0.3.1",
- "serde",
- "sha2 0.10.8",
- "sha3",
- "tagged-base64 0.3.4",
- "typenum",
- "zeroize",
+ "rayon",
]
[[package]]
-name = "jf-primitives"
+name = "jf-plonk"
version = "0.4.4"
-source = "git+https://github.com/EspressoSystems/jellyfish?tag=0.4.4#8f48813ca52d964090dbf0de62f07f5e0c7e22c6"
+source = "git+https://github.com/EspressoSystems/jellyfish?tag=0.4.5#7d71dbeff14f1a501b0b0dc391f1dffa1b8374fb"
dependencies = [
- "anyhow",
- "ark-bls12-377",
- "ark-bls12-381",
- "ark-bn254",
- "ark-bw6-761",
- "ark-crypto-primitives",
"ark-ec",
- "ark-ed-on-bls12-377",
- "ark-ed-on-bls12-381",
- "ark-ed-on-bn254",
"ark-ff",
- "ark-pallas",
"ark-poly",
"ark-serialize",
"ark-std",
- "blst",
- "chacha20poly1305",
- "crypto_kx",
"derivative",
- "digest 0.10.7",
"displaydoc",
+ "downcast-rs",
+ "dyn-clone 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)",
"espresso-systems-common 0.4.0",
- "generic-array",
"hashbrown 0.14.5",
"itertools 0.12.1",
- "jf-relation 0.4.4",
- "jf-utils 0.4.4",
+ "jf-crhf",
+ "jf-pcs",
+ "jf-relation",
+ "jf-rescue",
+ "jf-utils",
"merlin",
"num-bigint",
- "num-traits",
"rand_chacha 0.3.1",
"rayon",
"serde",
- "sha2 0.10.8",
"sha3",
- "tagged-base64 0.4.0",
- "zeroize",
+ "tagged-base64",
+]
+
+[[package]]
+name = "jf-prf"
+version = "0.1.0"
+source = "git+https://github.com/EspressoSystems/jellyfish?tag=0.4.5#7d71dbeff14f1a501b0b0dc391f1dffa1b8374fb"
+dependencies = [
+ "ark-serialize",
+ "ark-std",
]
[[package]]
name = "jf-relation"
-version = "0.4.0-pre.0"
-source = "git+https://github.com/EspressoSystems/jellyfish?tag=0.4.2#f85f9024ef42ab8be95b2c81bd15fd6cbadeafbf"
+version = "0.4.4"
+source = "git+https://github.com/EspressoSystems/jellyfish?tag=0.4.5#7d71dbeff14f1a501b0b0dc391f1dffa1b8374fb"
dependencies = [
"ark-bls12-377",
"ark-bls12-381",
@@ -5186,66 +5255,108 @@ dependencies = [
"dyn-clone 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)",
"hashbrown 0.14.5",
"itertools 0.12.1",
- "jf-utils 0.4.0-pre.0",
+ "jf-utils",
"num-bigint",
"rand_chacha 0.3.1",
+ "rayon",
]
[[package]]
-name = "jf-relation"
-version = "0.4.4"
-source = "git+https://github.com/EspressoSystems/jellyfish?tag=0.4.4#8f48813ca52d964090dbf0de62f07f5e0c7e22c6"
+name = "jf-rescue"
+version = "0.1.0"
+source = "git+https://github.com/EspressoSystems/jellyfish?tag=0.4.5#7d71dbeff14f1a501b0b0dc391f1dffa1b8374fb"
dependencies = [
"ark-bls12-377",
"ark-bls12-381",
"ark-bn254",
"ark-bw6-761",
+ "ark-crypto-primitives",
+ "ark-ed-on-bls12-377",
+ "ark-ed-on-bls12-381",
+ "ark-ed-on-bn254",
+ "ark-ff",
+ "ark-std",
+ "displaydoc",
+ "itertools 0.12.1",
+ "jf-commitment",
+ "jf-crhf",
+ "jf-prf",
+ "jf-relation",
+ "jf-utils",
+]
+
+[[package]]
+name = "jf-signature"
+version = "0.1.0"
+source = "git+https://github.com/EspressoSystems/jellyfish?tag=0.4.5#7d71dbeff14f1a501b0b0dc391f1dffa1b8374fb"
+dependencies = [
+ "ark-bls12-381",
+ "ark-bn254",
"ark-ec",
"ark-ff",
- "ark-poly",
"ark-serialize",
"ark-std",
+ "blst",
"derivative",
+ "digest 0.10.7",
"displaydoc",
- "downcast-rs",
- "dyn-clone 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)",
"hashbrown 0.14.5",
"itertools 0.12.1",
- "jf-utils 0.4.4",
+ "jf-crhf",
+ "jf-relation",
+ "jf-rescue",
+ "jf-utils",
"num-bigint",
- "rand_chacha 0.3.1",
- "rayon",
+ "num-traits",
+ "serde",
+ "sha3",
+ "tagged-base64",
+ "zeroize",
]
[[package]]
name = "jf-utils"
-version = "0.4.0-pre.0"
-source = "git+https://github.com/EspressoSystems/jellyfish?tag=0.4.2#f85f9024ef42ab8be95b2c81bd15fd6cbadeafbf"
+version = "0.4.4"
+source = "git+https://github.com/EspressoSystems/jellyfish?tag=0.4.5#7d71dbeff14f1a501b0b0dc391f1dffa1b8374fb"
dependencies = [
"ark-ec",
+ "ark-ed-on-bls12-377",
+ "ark-ed-on-bls12-381",
"ark-ff",
+ "ark-poly",
"ark-serialize",
"ark-std",
"digest 0.10.7",
+ "displaydoc",
+ "rand_chacha 0.3.1",
+ "rayon",
"serde",
"sha2 0.10.8",
- "tagged-base64 0.3.4",
+ "tagged-base64",
]
[[package]]
-name = "jf-utils"
-version = "0.4.4"
-source = "git+https://github.com/EspressoSystems/jellyfish?tag=0.4.4#8f48813ca52d964090dbf0de62f07f5e0c7e22c6"
+name = "jf-vid"
+version = "0.1.0"
+source = "git+https://github.com/EspressoSystems/jellyfish?tag=0.4.5#7d71dbeff14f1a501b0b0dc391f1dffa1b8374fb"
dependencies = [
+ "anyhow",
"ark-ec",
"ark-ff",
+ "ark-poly",
"ark-serialize",
"ark-std",
+ "derivative",
"digest 0.10.7",
+ "displaydoc",
+ "generic-array",
+ "itertools 0.12.1",
+ "jf-merkle-tree",
+ "jf-pcs",
+ "jf-utils",
"rayon",
"serde",
- "sha2 0.10.8",
- "tagged-base64 0.4.0",
+ "tagged-base64",
]
[[package]]
@@ -5346,7 +5457,7 @@ dependencies = [
"lalrpop-util",
"petgraph",
"regex",
- "regex-syntax 0.8.3",
+ "regex-syntax 0.8.4",
"string_cache",
"term",
"tiny-keccak",
@@ -5360,23 +5471,23 @@ version = "0.20.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "507460a910eb7b32ee961886ff48539633b788a36b65692b95f225b844c82553"
dependencies = [
- "regex-automata 0.4.6",
+ "regex-automata 0.4.7",
]
[[package]]
name = "lazy_static"
-version = "1.4.0"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
dependencies = [
- "spin 0.5.2",
+ "spin 0.9.8",
]
[[package]]
name = "libc"
-version = "0.2.153"
+version = "0.2.155"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd"
+checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c"
[[package]]
name = "libm"
@@ -5404,7 +5515,7 @@ dependencies = [
"either",
"futures",
"futures-timer",
- "getrandom 0.2.14",
+ "getrandom 0.2.15",
"instant",
"libp2p-allow-block-list",
"libp2p-autonat",
@@ -5565,7 +5676,7 @@ dependencies = [
"fnv",
"futures",
"futures-ticker",
- "getrandom 0.2.14",
+ "getrandom 0.2.15",
"hex_fmt",
"instant",
"libp2p-core",
@@ -5585,9 +5696,9 @@ dependencies = [
[[package]]
name = "libp2p-identify"
-version = "0.44.1"
+version = "0.44.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "20499a945d2f0221fdc6269b3848892c0f370d2ee3e19c7f65a29d8f860f6126"
+checksum = "b5d635ebea5ca0c3c3e77d414ae9b67eccf2a822be06091b9c1a0d13029a1e2f"
dependencies = [
"asynchronous-codec 0.7.0",
"either",
@@ -5608,9 +5719,9 @@ dependencies = [
[[package]]
name = "libp2p-identity"
-version = "0.2.8"
+version = "0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "999ec70441b2fb35355076726a6bc466c932e9bdc66f6a11c6c0aa17c7ab9be0"
+checksum = "55cca1eb2bc1fd29f099f3daaab7effd01e1a54b7c577d0ed082521034d912e8"
dependencies = [
"asn1_der",
"bs58",
@@ -5663,7 +5774,7 @@ version = "0.45.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49007d9a339b3e1d7eeebc4d67c05dbf23d300b7d091193ec2d3f26802d7faf2"
dependencies = [
- "async-io 2.3.2",
+ "async-io 2.3.3",
"async-std",
"data-encoding",
"futures",
@@ -5702,14 +5813,15 @@ dependencies = [
[[package]]
name = "libp2p-networking"
-version = "0.5.43"
-source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.46#f02711daca9ce18ecc86443fa054cafff76464f0"
+version = "0.5.60"
+source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.60#24597f75f7ddb439959e4aff584ec934dcdc1388"
dependencies = [
"anyhow",
"async-compatibility-layer",
"async-lock 2.8.0",
"async-std",
"async-trait",
+ "bincode",
"blake3",
"custom_debug 0.5.1",
"derive_builder",
@@ -5724,11 +5836,10 @@ dependencies = [
"serde",
"serde_bytes",
"serde_json",
- "snafu 0.8.2",
+ "snafu 0.8.3",
"tokio",
"tokio-stream",
"tracing",
- "vbs",
"void",
]
@@ -5760,9 +5871,9 @@ dependencies = [
[[package]]
name = "libp2p-ping"
-version = "0.44.0"
+version = "0.44.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "76b94ee41bd8c294194fe608851e45eb98de26fe79bc7913838cbffbfe8c7ce2"
+checksum = "a1de5a6cf64fba7f7e8f2102711c9c6c043a8e56b86db8cd306492c517da3fb3"
dependencies = [
"either",
"futures",
@@ -5808,9 +5919,9 @@ dependencies = [
[[package]]
name = "libp2p-quic"
-version = "0.10.2"
+version = "0.10.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a0375cdfee57b47b313ef1f0fdb625b78aed770d33a40cf1c294a371ff5e6666"
+checksum = "c67296ad4e092e23f92aea3d2bdb6f24eab79c0929ed816dfb460ea2f4567d2b"
dependencies = [
"async-std",
"bytes 1.6.0",
@@ -5823,8 +5934,8 @@ dependencies = [
"parking_lot",
"quinn",
"rand 0.8.5",
- "ring 0.16.20",
- "rustls 0.21.12",
+ "ring 0.17.8",
+ "rustls 0.23.10",
"socket2 0.5.7",
"thiserror",
"tokio",
@@ -5833,9 +5944,9 @@ dependencies = [
[[package]]
name = "libp2p-relay"
-version = "0.17.1"
+version = "0.17.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0aadb213ffc8e1a6f2b9c48dcf0fc07bf370f2ea4db7981813d45e50671c8d9d"
+checksum = "4d1c667cfabf3dd675c8e3cea63b7b98434ecf51721b7894cbb01d29983a6a9b"
dependencies = [
"asynchronous-codec 0.7.0",
"bytes 1.6.0",
@@ -5843,7 +5954,6 @@ dependencies = [
"futures",
"futures-bounded",
"futures-timer",
- "instant",
"libp2p-core",
"libp2p-identity",
"libp2p-swarm",
@@ -5854,6 +5964,7 @@ dependencies = [
"thiserror",
"tracing",
"void",
+ "web-time",
]
[[package]]
@@ -5882,9 +5993,9 @@ dependencies = [
[[package]]
name = "libp2p-request-response"
-version = "0.26.1"
+version = "0.26.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e12823250fe0c45bdddea6eefa2be9a609aff1283ff4e1d8a294fdbb89572f6f"
+checksum = "c314fe28368da5e3a262553fb0ad575c1c8934c461e10de10265551478163836"
dependencies = [
"async-trait",
"cbor4ii",
@@ -5904,9 +6015,9 @@ dependencies = [
[[package]]
name = "libp2p-swarm"
-version = "0.44.1"
+version = "0.44.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e92532fc3c4fb292ae30c371815c9b10103718777726ea5497abc268a4761866"
+checksum = "80cae6cb75f89dbca53862f9ebe0b9f463aa7b302762fcfaafb9e51dcc9b0f7e"
dependencies = [
"async-std",
"either",
@@ -5917,6 +6028,7 @@ dependencies = [
"libp2p-core",
"libp2p-identity",
"libp2p-swarm-derive",
+ "lru 0.12.3",
"multistream-select",
"once_cell",
"rand 0.8.5",
@@ -5928,14 +6040,14 @@ dependencies = [
[[package]]
name = "libp2p-swarm-derive"
-version = "0.34.1"
+version = "0.34.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b644268b4acfdaa6a6100b31226ee7a36d96ab4c43287d113bfd2308607d8b6f"
+checksum = "5daceb9dd908417b6dfcfe8e94098bc4aac54500c282e78120b885dadc09b999"
dependencies = [
- "heck 0.4.1",
+ "heck 0.5.0",
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.68",
]
[[package]]
@@ -5958,17 +6070,17 @@ dependencies = [
[[package]]
name = "libp2p-tls"
-version = "0.3.0"
+version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "93ce7e3c2e7569d685d08ec795157981722ff96e9e9f9eae75df3c29d02b07a5"
+checksum = "251b17aebdd29df7e8f80e4d94b782fae42e934c49086e1a81ba23b60a8314f2"
dependencies = [
"futures",
- "futures-rustls",
+ "futures-rustls 0.26.0",
"libp2p-core",
"libp2p-identity",
"rcgen 0.11.3",
- "ring 0.16.20",
- "rustls 0.21.12",
+ "ring 0.17.8",
+ "rustls 0.23.10",
"rustls-webpki 0.101.7",
"thiserror",
"x509-parser",
@@ -5988,9 +6100,9 @@ dependencies = [
[[package]]
name = "libp2p-upnp"
-version = "0.2.1"
+version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b49cc89949bf0e06869297cd4fe2c132358c23fe93e76ad43950453df4da3d35"
+checksum = "cccf04b0e3ff3de52d07d5fd6c3b061d0e7f908ffc683c32d9638caedce86fc8"
dependencies = [
"futures",
"futures-timer",
@@ -6010,7 +6122,7 @@ checksum = "f4846d51afd08180e164291c3754ba30dd4fbac6fac65571be56403c16431a5e"
dependencies = [
"either",
"futures",
- "futures-rustls",
+ "futures-rustls 0.24.0",
"libp2p-core",
"libp2p-identity",
"parking_lot",
@@ -6034,7 +6146,7 @@ dependencies = [
"thiserror",
"tracing",
"yamux 0.12.1",
- "yamux 0.13.1",
+ "yamux 0.13.3",
]
[[package]]
@@ -6043,7 +6155,7 @@ version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d"
dependencies = [
- "bitflags 2.5.0",
+ "bitflags 2.6.0",
"libc",
]
@@ -6108,9 +6220,9 @@ dependencies = [
[[package]]
name = "libz-sys"
-version = "1.1.16"
+version = "1.1.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e143b5e666b2695d28f6bca6497720813f699c9602dd7f5cac91008b8ada7f9"
+checksum = "c15da26e5af7e25c90b37a2d75cdbf940cf4a55316de9d84c679c9b8bfabf82e"
dependencies = [
"cc",
"libc",
@@ -6132,9 +6244,9 @@ checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519"
[[package]]
name = "linux-raw-sys"
-version = "0.4.13"
+version = "0.4.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c"
+checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
[[package]]
name = "local-ip-address"
@@ -6160,9 +6272,9 @@ dependencies = [
[[package]]
name = "log"
-version = "0.4.21"
+version = "0.4.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c"
+checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
dependencies = [
"value-bag",
]
@@ -6246,7 +6358,7 @@ dependencies = [
"proc-macro-error",
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.68",
]
[[package]]
@@ -6261,9 +6373,9 @@ dependencies = [
[[package]]
name = "memchr"
-version = "2.7.2"
+version = "2.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d"
+checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
[[package]]
name = "memoize"
@@ -6308,9 +6420,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
[[package]]
name = "mime_guess"
-version = "2.0.4"
+version = "2.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef"
+checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e"
dependencies = [
"mime",
"unicase",
@@ -6324,9 +6436,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
[[package]]
name = "miniz_oxide"
-version = "0.7.2"
+version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7"
+checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08"
dependencies = [
"adler",
]
@@ -6348,33 +6460,6 @@ version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f2b8f3a258db515d5e91a904ce4ae3f73e091149b90cadbdb93d210bee07f63b"
-[[package]]
-name = "mockall"
-version = "0.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "43766c2b5203b10de348ffe19f7e54564b64f3d6018ff7648d1e2d6d3a0f0a48"
-dependencies = [
- "cfg-if",
- "downcast",
- "fragile",
- "lazy_static",
- "mockall_derive",
- "predicates",
- "predicates-tree",
-]
-
-[[package]]
-name = "mockall_derive"
-version = "0.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af7cbce79ec385a1d4f54baa90a76401eb15d9cab93685f62e7e9f942aa00ae2"
-dependencies = [
- "cfg-if",
- "proc-macro2",
- "quote",
- "syn 2.0.60",
-]
-
[[package]]
name = "multiaddr"
version = "0.18.1"
@@ -6436,16 +6521,15 @@ version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3"
dependencies = [
- "getrandom 0.2.14",
+ "getrandom 0.2.15",
]
[[package]]
name = "native-tls"
-version = "0.2.11"
+version = "0.2.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e"
+checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466"
dependencies = [
- "lazy_static",
"libc",
"log",
"openssl",
@@ -6592,13 +6676,26 @@ dependencies = [
"winapi",
]
+[[package]]
+name = "num"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23"
+dependencies = [
+ "num-bigint",
+ "num-complex",
+ "num-integer",
+ "num-iter",
+ "num-rational",
+ "num-traits",
+]
+
[[package]]
name = "num-bigint"
-version = "0.4.4"
+version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0"
+checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
dependencies = [
- "autocfg",
"num-integer",
"num-traits",
]
@@ -6621,21 +6718,19 @@ dependencies = [
]
[[package]]
-name = "num-conv"
-version = "0.1.0"
+name = "num-complex"
+version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"
+checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495"
+dependencies = [
+ "num-traits",
+]
[[package]]
-name = "num-derive"
-version = "0.4.2"
+name = "num-conv"
+version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.60",
-]
+checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"
[[package]]
name = "num-integer"
@@ -6648,20 +6743,31 @@ dependencies = [
[[package]]
name = "num-iter"
-version = "0.1.44"
+version = "0.1.45"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9"
+checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf"
dependencies = [
"autocfg",
"num-integer",
"num-traits",
]
+[[package]]
+name = "num-rational"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824"
+dependencies = [
+ "num-bigint",
+ "num-integer",
+ "num-traits",
+]
+
[[package]]
name = "num-traits"
-version = "0.2.18"
+version = "0.2.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a"
+checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
dependencies = [
"autocfg",
"libm",
@@ -6673,7 +6779,7 @@ version = "1.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
dependencies = [
- "hermit-abi",
+ "hermit-abi 0.3.9",
"libc",
]
@@ -6692,10 +6798,19 @@ version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b"
dependencies = [
- "proc-macro-crate 3.1.0",
+ "proc-macro-crate",
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.68",
+]
+
+[[package]]
+name = "num_threads"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9"
+dependencies = [
+ "libc",
]
[[package]]
@@ -6709,9 +6824,9 @@ dependencies = [
[[package]]
name = "oid-registry"
-version = "0.6.1"
+version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9bedf36ffb6ba96c2eb7144ef6270557b52e54b20c0a8e1eb2ff99a6c6959bff"
+checksum = "1c958dd45046245b9c3c2547369bb634eb461670b2e7e0de552905801a648d1d"
dependencies = [
"asn1-rs",
]
@@ -6755,11 +6870,11 @@ dependencies = [
[[package]]
name = "openssl"
-version = "0.10.64"
+version = "0.10.66"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f"
+checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1"
dependencies = [
- "bitflags 2.5.0",
+ "bitflags 2.6.0",
"cfg-if",
"foreign-types",
"libc",
@@ -6776,7 +6891,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.68",
]
[[package]]
@@ -6787,9 +6902,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
[[package]]
name = "openssl-sys"
-version = "0.9.102"
+version = "0.9.103"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2"
+checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6"
dependencies = [
"cc",
"libc",
@@ -6827,9 +6942,9 @@ checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f"
[[package]]
name = "parity-scale-codec"
-version = "3.6.9"
+version = "3.6.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "881331e34fa842a2fb61cc2db9643a8fedc615e47cfcc52597d1af0db9a7e8fe"
+checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee"
dependencies = [
"arrayvec",
"bitvec",
@@ -6841,11 +6956,11 @@ dependencies = [
[[package]]
name = "parity-scale-codec-derive"
-version = "3.6.9"
+version = "3.6.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "be30eaf4b0a9fba5336683b38de57bb86d179a35862ba6bfcf57625d006bde5b"
+checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c"
dependencies = [
- "proc-macro-crate 2.0.0",
+ "proc-macro-crate",
"proc-macro2",
"quote",
"syn 1.0.109",
@@ -6859,9 +6974,9 @@ checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae"
[[package]]
name = "parking_lot"
-version = "0.12.2"
+version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb"
+checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
dependencies = [
"lock_api",
"parking_lot_core",
@@ -6875,7 +6990,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
dependencies = [
"cfg-if",
"libc",
- "redox_syscall 0.5.1",
+ "redox_syscall 0.5.2",
"smallvec",
"windows-targets 0.52.5",
]
@@ -6893,9 +7008,9 @@ dependencies = [
[[package]]
name = "paste"
-version = "1.0.14"
+version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c"
+checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
[[package]]
name = "path-slash"
@@ -6946,7 +7061,7 @@ version = "3.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae"
dependencies = [
- "base64 0.22.0",
+ "base64 0.22.1",
"serde",
]
@@ -6967,9 +7082,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
[[package]]
name = "pest"
-version = "2.7.9"
+version = "2.7.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "311fb059dee1a7b802f036316d790138c613a4e8b180c822e3925a662e9f0c95"
+checksum = "cd53dff83f26735fdc1ca837098ccf133605d794cdae66acfc2bfac3ec809d95"
dependencies = [
"memchr",
"thiserror",
@@ -6978,9 +7093,9 @@ dependencies = [
[[package]]
name = "pest_derive"
-version = "2.7.9"
+version = "2.7.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f73541b156d32197eecda1a4014d7f868fd2bcb3c550d5386087cfba442bf69c"
+checksum = "2a548d2beca6773b1c244554d36fcf8548a8a58e74156968211567250e48e49a"
dependencies = [
"pest",
"pest_generator",
@@ -6988,22 +7103,22 @@ dependencies = [
[[package]]
name = "pest_generator"
-version = "2.7.9"
+version = "2.7.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c35eeed0a3fab112f75165fdc026b3913f4183133f19b49be773ac9ea966e8bd"
+checksum = "3c93a82e8d145725dcbaf44e5ea887c8a869efdcc28706df2d08c69e17077183"
dependencies = [
"pest",
"pest_meta",
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.68",
]
[[package]]
name = "pest_meta"
-version = "2.7.9"
+version = "2.7.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2adbf29bb9776f28caece835398781ab24435585fe0d4dc1374a61db5accedca"
+checksum = "a941429fea7e08bedec25e4f6785b6ffaacc6b755da98df5ef3e7dcf4a124c4f"
dependencies = [
"once_cell",
"pest",
@@ -7012,9 +7127,9 @@ dependencies = [
[[package]]
name = "petgraph"
-version = "0.6.4"
+version = "0.6.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9"
+checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db"
dependencies = [
"fixedbitset",
"indexmap 2.2.6",
@@ -7060,7 +7175,7 @@ dependencies = [
"phf_shared 0.11.2",
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.68",
]
[[package]]
@@ -7098,7 +7213,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.68",
]
[[package]]
@@ -7127,9 +7242,9 @@ checksum = "d15b6607fa632996eb8a17c9041cb6071cb75ac057abd45dece578723ea8c7c0"
[[package]]
name = "piper"
-version = "0.2.1"
+version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4"
+checksum = "ae1d5c74c9876f070d3e8fd503d748c7d974c3e48da8f41350fa5222ef9b4391"
dependencies = [
"atomic-waker",
"fastrand 2.1.0",
@@ -7163,12 +7278,6 @@ version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec"
-[[package]]
-name = "platforms"
-version = "3.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db23d408679286588f4d4644f965003d056e3dd5abcaaa938116871d7ce2fee7"
-
[[package]]
name = "polling"
version = "2.8.0"
@@ -7187,13 +7296,13 @@ dependencies = [
[[package]]
name = "polling"
-version = "3.7.0"
+version = "3.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "645493cf344456ef24219d02a768cf1fb92ddf8c92161679ae3d91b91a637be3"
+checksum = "a3ed00ed3fbf728b5816498ecd316d1716eecaced9c0c8d2c5a6740ca214985b"
dependencies = [
"cfg-if",
"concurrent-queue",
- "hermit-abi",
+ "hermit-abi 0.4.0",
"pin-project-lite 0.2.14",
"rustix 0.38.34",
"tracing",
@@ -7308,39 +7417,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c"
[[package]]
-name = "predicates"
-version = "3.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "68b87bfd4605926cdfefc1c3b5f8fe560e3feca9d5552cf68c466d3d8236c7e8"
-dependencies = [
- "anstyle",
- "predicates-core",
-]
-
-[[package]]
-name = "predicates-core"
-version = "1.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174"
-
-[[package]]
-name = "predicates-tree"
-version = "1.0.9"
+name = "pretty_assertions"
+version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "368ba315fb8c5052ab692e68a0eefec6ec57b23a36959c14496f0b0df2c0cecf"
+checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66"
dependencies = [
- "predicates-core",
- "termtree",
+ "diff",
+ "yansi",
]
[[package]]
name = "prettyplease"
-version = "0.2.19"
+version = "0.2.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ac2cf0f2e4f42b49f5ffd07dae8d746508ef7526c13940e5f524012ae6c6550"
+checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e"
dependencies = [
"proc-macro2",
- "syn 2.0.60",
+ "syn 2.0.68",
]
[[package]]
@@ -7351,29 +7444,10 @@ checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2"
dependencies = [
"fixed-hash",
"impl-codec",
- "impl-rlp",
- "impl-serde",
- "scale-info",
- "uint",
-]
-
-[[package]]
-name = "proc-macro-crate"
-version = "1.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919"
-dependencies = [
- "once_cell",
- "toml_edit 0.19.15",
-]
-
-[[package]]
-name = "proc-macro-crate"
-version = "2.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8"
-dependencies = [
- "toml_edit 0.20.7",
+ "impl-rlp",
+ "impl-serde",
+ "scale-info",
+ "uint",
]
[[package]]
@@ -7416,18 +7490,18 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068"
[[package]]
name = "proc-macro2"
-version = "1.0.81"
+version = "1.0.86"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba"
+checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77"
dependencies = [
"unicode-ident",
]
[[package]]
name = "prometheus"
-version = "0.13.3"
+version = "0.13.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "449811d15fbdf5ceb5c1144416066429cf82316e2ec8ce0c1f6f8a02e7bbcf8c"
+checksum = "3d33c28a30771f7f96db69893f78b857f7450d7e0237e9c8fc6427a81bae7ed1"
dependencies = [
"cfg-if",
"fnv",
@@ -7458,30 +7532,30 @@ checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.68",
]
[[package]]
name = "proptest"
-version = "1.4.0"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf"
+checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d"
dependencies = [
- "bitflags 2.5.0",
+ "bitflags 2.6.0",
"lazy_static",
"num-traits",
"rand 0.8.5",
"rand_chacha 0.3.1",
"rand_xorshift",
- "regex-syntax 0.8.3",
+ "regex-syntax 0.8.4",
"unarray",
]
[[package]]
name = "prost"
-version = "0.12.4"
+version = "0.12.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d0f5d036824e4761737860779c906171497f6d55681139d8312388f8fe398922"
+checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29"
dependencies = [
"bytes 1.6.0",
"prost-derive",
@@ -7489,22 +7563,22 @@ dependencies = [
[[package]]
name = "prost-derive"
-version = "0.12.4"
+version = "0.12.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "19de2de2a00075bf566bee3bd4db014b11587e84184d3f7a791bc17f1a8e9e48"
+checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1"
dependencies = [
"anyhow",
"itertools 0.12.1",
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.68",
]
[[package]]
name = "prost-types"
-version = "0.12.4"
+version = "0.12.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3235c33eb02c1f1e212abdbe34c78b264b038fb58ca612664343271e36e55ffe"
+checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0"
dependencies = [
"prost",
]
@@ -7578,11 +7652,11 @@ dependencies = [
[[package]]
name = "quinn"
-version = "0.10.2"
+version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8cc2c5017e4b43d5995dcea317bc46c1e09404c0a9664d2908f7f02dfe943d75"
+checksum = "e4ceeeeabace7857413798eb1ffa1e9c905a9946a57d81fb69b4b71c4d8eb3ad"
dependencies = [
- "async-io 1.13.0",
+ "async-io 2.3.3",
"async-std",
"bytes 1.6.0",
"futures-io",
@@ -7590,7 +7664,7 @@ dependencies = [
"quinn-proto",
"quinn-udp",
"rustc-hash",
- "rustls 0.21.12",
+ "rustls 0.23.10",
"thiserror",
"tokio",
"tracing",
@@ -7598,15 +7672,15 @@ dependencies = [
[[package]]
name = "quinn-proto"
-version = "0.10.6"
+version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "141bf7dfde2fbc246bfd3fe12f2455aa24b0fbd9af535d8c86c7bd1381ff2b1a"
+checksum = "ddf517c03a109db8100448a4be38d498df8a210a99fe0e1b9eaf39e78c640efe"
dependencies = [
"bytes 1.6.0",
"rand 0.8.5",
- "ring 0.16.20",
+ "ring 0.17.8",
"rustc-hash",
- "rustls 0.21.12",
+ "rustls 0.23.10",
"slab",
"thiserror",
"tinyvec",
@@ -7615,15 +7689,15 @@ dependencies = [
[[package]]
name = "quinn-udp"
-version = "0.4.1"
+version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "055b4e778e8feb9f93c4e439f71dc2156ef13360b432b799e179a8c4cdf0b1d7"
+checksum = "9096629c45860fc7fb143e125eb826b5e721e10be3263160c7d60ca832cf8c46"
dependencies = [
- "bytes 1.6.0",
"libc",
+ "once_cell",
"socket2 0.5.7",
"tracing",
- "windows-sys 0.48.0",
+ "windows-sys 0.52.0",
]
[[package]]
@@ -7700,7 +7774,7 @@ version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
dependencies = [
- "getrandom 0.2.14",
+ "getrandom 0.2.15",
]
[[package]]
@@ -7765,12 +7839,13 @@ dependencies = [
[[package]]
name = "rcgen"
-version = "0.12.1"
+version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "48406db8ac1f3cbc7dcdb56ec355343817958a356ff430259bb07baf7607e1e1"
+checksum = "54077e1872c46788540de1ea3d7f4ccb1983d12f9aa909b234468676c1a36779"
dependencies = [
"pem 3.0.4",
"ring 0.17.8",
+ "rustls-pki-types",
"time 0.3.36",
"x509-parser",
"yasna",
@@ -7778,9 +7853,9 @@ dependencies = [
[[package]]
name = "redis"
-version = "0.24.0"
+version = "0.25.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c580d9cbbe1d1b479e8d67cf9daf6a62c957e6846048408b80b43ac3f6af84cd"
+checksum = "e0d7a6955c7511f60f3ba9e86c6d02b3c3f144f8c24b288d1f4e18074ab8bbec"
dependencies = [
"arc-swap",
"async-trait",
@@ -7809,11 +7884,11 @@ dependencies = [
[[package]]
name = "redox_syscall"
-version = "0.5.1"
+version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e"
+checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd"
dependencies = [
- "bitflags 2.5.0",
+ "bitflags 2.6.0",
]
[[package]]
@@ -7822,7 +7897,7 @@ version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891"
dependencies = [
- "getrandom 0.2.14",
+ "getrandom 0.2.15",
"libredox",
"thiserror",
]
@@ -7869,19 +7944,19 @@ dependencies = [
"quote",
"refinery-core",
"regex",
- "syn 2.0.60",
+ "syn 2.0.68",
]
[[package]]
name = "regex"
-version = "1.10.4"
+version = "1.10.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c"
+checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f"
dependencies = [
"aho-corasick",
"memchr",
- "regex-automata 0.4.6",
- "regex-syntax 0.8.3",
+ "regex-automata 0.4.7",
+ "regex-syntax 0.8.4",
]
[[package]]
@@ -7895,13 +7970,13 @@ dependencies = [
[[package]]
name = "regex-automata"
-version = "0.4.6"
+version = "0.4.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea"
+checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df"
dependencies = [
"aho-corasick",
"memchr",
- "regex-syntax 0.8.3",
+ "regex-syntax 0.8.4",
]
[[package]]
@@ -7912,9 +7987,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
[[package]]
name = "regex-syntax"
-version = "0.8.3"
+version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56"
+checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b"
[[package]]
name = "rend"
@@ -7939,8 +8014,8 @@ dependencies = [
"h2 0.3.26",
"http 0.2.12",
"http-body 0.4.6",
- "hyper 0.14.28",
- "hyper-rustls",
+ "hyper 0.14.29",
+ "hyper-rustls 0.24.2",
"ipnet",
"js-sys",
"log",
@@ -7953,10 +8028,10 @@ dependencies = [
"serde",
"serde_json",
"serde_urlencoded",
- "sync_wrapper",
+ "sync_wrapper 0.1.2",
"system-configuration",
"tokio",
- "tokio-rustls",
+ "tokio-rustls 0.24.1",
"tower-service",
"url",
"wasm-bindgen",
@@ -7968,20 +8043,21 @@ dependencies = [
[[package]]
name = "reqwest"
-version = "0.12.4"
+version = "0.12.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10"
+checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37"
dependencies = [
- "base64 0.22.0",
+ "base64 0.22.1",
"bytes 1.6.0",
"encoding_rs",
"futures-core",
"futures-util",
- "h2 0.4.4",
+ "h2 0.4.5",
"http 1.1.0",
"http-body 1.0.0",
"http-body-util",
- "hyper 1.3.1",
+ "hyper 1.4.0",
+ "hyper-rustls 0.27.2",
"hyper-tls",
"hyper-util",
"ipnet",
@@ -7996,7 +8072,7 @@ dependencies = [
"serde",
"serde_json",
"serde_urlencoded",
- "sync_wrapper",
+ "sync_wrapper 1.0.1",
"system-configuration",
"tokio",
"tokio-native-tls",
@@ -8051,7 +8127,7 @@ checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d"
dependencies = [
"cc",
"cfg-if",
- "getrandom 0.2.14",
+ "getrandom 0.2.15",
"libc",
"spin 0.9.8",
"untrusted 0.9.0",
@@ -8082,7 +8158,7 @@ dependencies = [
"rkyv_derive",
"seahash",
"tinyvec",
- "uuid 1.8.0",
+ "uuid 1.9.1",
]
[[package]]
@@ -8125,7 +8201,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94"
dependencies = [
"base64 0.21.7",
- "bitflags 2.5.0",
+ "bitflags 2.6.0",
"serde",
"serde_derive",
]
@@ -8194,9 +8270,9 @@ dependencies = [
[[package]]
name = "rustc-demangle"
-version = "0.1.23"
+version = "0.1.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
+checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
[[package]]
name = "rustc-hash"
@@ -8225,7 +8301,7 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
dependencies = [
- "semver 1.0.22",
+ "semver 1.0.23",
]
[[package]]
@@ -8257,10 +8333,10 @@ version = "0.38.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f"
dependencies = [
- "bitflags 2.5.0",
+ "bitflags 2.6.0",
"errno",
"libc",
- "linux-raw-sys 0.4.13",
+ "linux-raw-sys 0.4.14",
"windows-sys 0.52.0",
]
@@ -8298,7 +8374,21 @@ dependencies = [
"log",
"ring 0.17.8",
"rustls-pki-types",
- "rustls-webpki 0.102.3",
+ "rustls-webpki 0.102.4",
+ "subtle",
+ "zeroize",
+]
+
+[[package]]
+name = "rustls"
+version = "0.23.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05cff451f60db80f490f3c182b77c35260baace73209e9cdbbe526bfe3a4d402"
+dependencies = [
+ "once_cell",
+ "ring 0.17.8",
+ "rustls-pki-types",
+ "rustls-webpki 0.102.4",
"subtle",
"zeroize",
]
@@ -8318,15 +8408,15 @@ version = "2.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d"
dependencies = [
- "base64 0.22.0",
+ "base64 0.22.1",
"rustls-pki-types",
]
[[package]]
name = "rustls-pki-types"
-version = "1.5.0"
+version = "1.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "beb461507cee2c2ff151784c52762cf4d9ff6a61f3e80968600ed24fa837fa54"
+checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d"
[[package]]
name = "rustls-webpki"
@@ -8340,9 +8430,9 @@ dependencies = [
[[package]]
name = "rustls-webpki"
-version = "0.102.3"
+version = "0.102.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f3bce581c0dd41bce533ce695a1437fa16a7ab5ac3ccfa99fe1a620a7885eabf"
+checksum = "ff448f7e92e913c4b7d4c6d8e4540a1724b319b4152b8aef6d4cf8339712b33e"
dependencies = [
"ring 0.17.8",
"rustls-pki-types",
@@ -8351,9 +8441,9 @@ dependencies = [
[[package]]
name = "rustversion"
-version = "1.0.15"
+version = "1.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "80af6f9131f277a45a3fba6ce8e2258037bb0477a67e610d3c1fe046ab31de47"
+checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6"
[[package]]
name = "rw-stream-sink"
@@ -8368,9 +8458,9 @@ dependencies = [
[[package]]
name = "ryu"
-version = "1.0.17"
+version = "1.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1"
+checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
[[package]]
name = "salsa20"
@@ -8392,9 +8482,9 @@ dependencies = [
[[package]]
name = "scale-info"
-version = "2.11.2"
+version = "2.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7c453e59a955f81fb62ee5d596b450383d699f152d350e9d23a0db2adb78e4c0"
+checksum = "eca070c12893629e2cc820a9761bedf6ce1dcddc9852984d1dc734b8bd9bd024"
dependencies = [
"cfg-if",
"derive_more",
@@ -8404,11 +8494,11 @@ dependencies = [
[[package]]
name = "scale-info-derive"
-version = "2.11.2"
+version = "2.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "18cf6c6447f813ef19eb450e985bcce6705f9ce7660db221b59093d15c79c4b7"
+checksum = "2d35494501194174bda522a32605929eefc9ecf7e0a326c26db1fdd85881eb62"
dependencies = [
- "proc-macro-crate 1.3.1",
+ "proc-macro-crate",
"proc-macro2",
"quote",
"syn 1.0.109",
@@ -8489,11 +8579,11 @@ dependencies = [
[[package]]
name = "security-framework"
-version = "2.10.0"
+version = "2.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6"
+checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0"
dependencies = [
- "bitflags 1.3.2",
+ "bitflags 2.6.0",
"core-foundation",
"core-foundation-sys",
"libc",
@@ -8502,9 +8592,9 @@ dependencies = [
[[package]]
name = "security-framework-sys"
-version = "2.10.0"
+version = "2.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef"
+checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7"
dependencies = [
"core-foundation-sys",
"libc",
@@ -8521,9 +8611,9 @@ dependencies = [
[[package]]
name = "semver"
-version = "1.0.22"
+version = "1.0.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca"
+checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b"
dependencies = [
"serde",
]
@@ -8561,13 +8651,13 @@ dependencies = [
"async-once-cell",
"async-std",
"async-trait",
- "base64 0.22.0",
+ "base64 0.22.1",
"base64-bytes",
"bincode",
"blake3",
"bytesize",
- "cdn-broker 0.1.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.2.6)",
- "cdn-marshal 0.1.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.2.6)",
+ "cdn-broker 0.4.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.4.2)",
+ "cdn-marshal 0.4.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.4.2)",
"clap",
"cld",
"committable",
@@ -8576,12 +8666,16 @@ dependencies = [
"derive_more",
"dotenvy",
"es-version",
+ "escargot",
"espresso-macros",
"ethers",
"ethers-contract-derive",
+ "fluent-asserter",
"futures",
"hotshot",
+ "hotshot-contract-adapter",
"hotshot-events-service",
+ "hotshot-example-types",
"hotshot-orchestrator",
"hotshot-query-service",
"hotshot-stake-table",
@@ -8589,26 +8683,35 @@ dependencies = [
"hotshot-task",
"hotshot-testing",
"hotshot-types",
- "hotshot-web-server",
"include_dir",
"itertools 0.12.1",
- "jf-primitives 0.4.4",
- "jf-utils 0.4.4",
- "lazy_static",
+ "jf-crhf",
+ "jf-merkle-tree",
+ "jf-rescue",
+ "jf-signature",
+ "jf-utils",
+ "jf-vid",
+ "libp2p",
"num-traits",
+ "num_enum",
+ "paste",
"portpicker",
+ "pretty_assertions",
"rand 0.8.5",
"rand_chacha 0.3.1",
"rand_distr",
+ "reqwest 0.12.5",
"sequencer-utils",
"serde",
"serde_json",
"sha2 0.10.8",
- "snafu 0.8.2",
+ "snafu 0.8.3",
+ "static_assertions",
"strum",
"surf-disco",
- "tagged-base64 0.4.0",
+ "tagged-base64",
"tempfile",
+ "thiserror",
"tide-disco",
"time 0.3.36",
"tokio-postgres",
@@ -8616,10 +8719,11 @@ dependencies = [
"tracing",
"tracing-subscriber 0.3.18",
"trait-set",
- "trait-variant",
"typenum",
"url",
"vbs",
+ "vec1",
+ "vergen",
"zeroize",
]
@@ -8638,6 +8742,7 @@ dependencies = [
"futures",
"hotshot-contract-adapter",
"portpicker",
+ "serde",
"serde_json",
"surf",
"tempfile",
@@ -8647,9 +8752,9 @@ dependencies = [
[[package]]
name = "serde"
-version = "1.0.199"
+version = "1.0.203"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c9f6e76df036c77cd94996771fb40db98187f096dd0b9af39c6c6e452ba966a"
+checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094"
dependencies = [
"serde_derive",
]
@@ -8667,22 +8772,22 @@ dependencies = [
[[package]]
name = "serde_bytes"
-version = "0.11.14"
+version = "0.11.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b8497c313fd43ab992087548117643f6fcd935cbf36f176ffda0aacf9591734"
+checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a"
dependencies = [
"serde",
]
[[package]]
name = "serde_derive"
-version = "1.0.199"
+version = "1.0.203"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "11bd257a6541e141e42ca6d24ae26f7714887b47e89aa739099104c7e4d3b7fc"
+checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.68",
]
[[package]]
@@ -8696,9 +8801,9 @@ dependencies = [
[[package]]
name = "serde_json"
-version = "1.0.116"
+version = "1.0.120"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813"
+checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5"
dependencies = [
"itoa",
"ryu",
@@ -8718,9 +8823,9 @@ dependencies = [
[[package]]
name = "serde_spanned"
-version = "0.6.5"
+version = "0.6.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1"
+checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0"
dependencies = [
"serde",
]
@@ -8739,11 +8844,11 @@ dependencies = [
[[package]]
name = "serde_with"
-version = "3.8.1"
+version = "3.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0ad483d2ab0149d5a5ebcd9972a3852711e0153d863bf5a5d0391d28883c4a20"
+checksum = "079f3a42cd87588d924ed95b533f8d30a483388c4e400ab736a7058e34f16169"
dependencies = [
- "base64 0.22.0",
+ "base64 0.22.1",
"chrono",
"hex",
"indexmap 1.9.3",
@@ -8757,24 +8862,14 @@ dependencies = [
[[package]]
name = "serde_with_macros"
-version = "3.8.1"
+version = "3.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "65569b702f41443e8bc8bbb1c5779bd0450bbe723b56198980e80ec45780bce2"
+checksum = "bc03aad67c1d26b7de277d51c86892e7d9a0110a2fe44bf6b26cc569fba302d6"
dependencies = [
"darling",
"proc-macro2",
"quote",
- "syn 2.0.60",
-]
-
-[[package]]
-name = "serdect"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177"
-dependencies = [
- "base16ct",
- "serde",
+ "syn 2.0.68",
]
[[package]]
@@ -9015,11 +9110,11 @@ dependencies = [
[[package]]
name = "snafu"
-version = "0.8.2"
+version = "0.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75976f4748ab44f6e5332102be424e7c2dc18daeaf7e725f2040c3ebb133512e"
+checksum = "418b8136fec49956eba89be7da2847ec1909df92a9ae4178b5ff0ff092c8d95e"
dependencies = [
- "snafu-derive 0.8.2",
+ "snafu-derive 0.8.3",
]
[[package]]
@@ -9036,14 +9131,14 @@ dependencies = [
[[package]]
name = "snafu-derive"
-version = "0.8.2"
+version = "0.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4b19911debfb8c2fb1107bc6cb2d61868aaf53a988449213959bb1b5b1ed95f"
+checksum = "1a4812a669da00d17d8266a0439eddcacbc88b17f732f927e52eeb9d196f7fb5"
dependencies = [
- "heck 0.4.1",
+ "heck 0.5.0",
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.68",
]
[[package]]
@@ -9157,11 +9252,10 @@ dependencies = [
[[package]]
name = "sqlformat"
-version = "0.2.3"
+version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ce81b7bd7c4493975347ef60d8c7e8b742d4694f4c49f93e0a12ea263938176c"
+checksum = "f895e3734318cc55f1fe66258926c9b910c124d47520339efecbb6c59cec7c1f"
dependencies = [
- "itertools 0.12.1",
"nom",
"unicode_categories",
]
@@ -9266,7 +9360,7 @@ checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418"
dependencies = [
"atoi",
"base64 0.21.7",
- "bitflags 2.5.0",
+ "bitflags 2.6.0",
"byteorder",
"bytes 1.6.0",
"crc",
@@ -9309,7 +9403,7 @@ checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e"
dependencies = [
"atoi",
"base64 0.21.7",
- "bitflags 2.5.0",
+ "bitflags 2.6.0",
"byteorder",
"crc",
"dotenvy",
@@ -9443,21 +9537,15 @@ dependencies = [
[[package]]
name = "stringprep"
-version = "0.1.4"
+version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6"
+checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1"
dependencies = [
- "finl_unicode",
"unicode-bidi",
"unicode-normalization",
+ "unicode-properties",
]
-[[package]]
-name = "strsim"
-version = "0.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
-
[[package]]
name = "strsim"
version = "0.11.1"
@@ -9466,31 +9554,31 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
[[package]]
name = "strum"
-version = "0.26.2"
+version = "0.26.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d8cec3501a5194c432b2b7976db6b7d10ec95c253208b45f83f7136aa985e29"
+checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06"
dependencies = [
"strum_macros",
]
[[package]]
name = "strum_macros"
-version = "0.26.2"
+version = "0.26.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c6cf59daf282c0a494ba14fd21610a0325f9f90ec9d1231dea26bcb1d696c946"
+checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be"
dependencies = [
- "heck 0.4.1",
+ "heck 0.5.0",
"proc-macro2",
"quote",
"rustversion",
- "syn 2.0.60",
+ "syn 2.0.68",
]
[[package]]
name = "subtle"
-version = "2.5.0"
+version = "2.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc"
+checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
[[package]]
name = "surf"
@@ -9503,7 +9591,7 @@ dependencies = [
"cfg-if",
"encoding_rs",
"futures-util",
- "getrandom 0.2.14",
+ "getrandom 0.2.15",
"http-client",
"http-types",
"log",
@@ -9517,16 +9605,16 @@ dependencies = [
[[package]]
name = "surf-disco"
-version = "0.6.0"
+version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b649b5919e809b105a8ae833154430f7069b0e3a392fff26a672211c6b8e30d"
+checksum = "55c871338479a1c27b5e2ae15e5ae0fe70769306d2ef5a0c2d30896a09ac8a3c"
dependencies = [
"async-std",
"async-tungstenite",
"derivative",
"futures",
"hex",
- "reqwest 0.12.4",
+ "reqwest 0.12.5",
"serde",
"serde_json",
"tide-disco",
@@ -9623,7 +9711,7 @@ dependencies = [
"hex",
"once_cell",
"reqwest 0.11.27",
- "semver 1.0.22",
+ "semver 1.0.23",
"serde",
"serde_json",
"sha2 0.10.8",
@@ -9645,9 +9733,9 @@ dependencies = [
[[package]]
name = "syn"
-version = "2.0.60"
+version = "2.0.68"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3"
+checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9"
dependencies = [
"proc-macro2",
"quote",
@@ -9660,6 +9748,12 @@ version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
+[[package]]
+name = "sync_wrapper"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394"
+
[[package]]
name = "synstructure"
version = "0.12.6"
@@ -9680,7 +9774,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.68",
]
[[package]]
@@ -9704,21 +9798,6 @@ dependencies = [
"libc",
]
-[[package]]
-name = "tagged-base64"
-version = "0.3.4"
-source = "git+https://github.com/EspressoSystems/tagged-base64?tag=0.3.4#93be6f0f5c0ec8458f13dede3d2b68dcce12a608"
-dependencies = [
- "ark-serialize",
- "ark-std",
- "base64 0.21.7",
- "crc-any",
- "serde",
- "snafu 0.7.5",
- "tagged-base64-macros 0.3.3",
- "wasm-bindgen",
-]
-
[[package]]
name = "tagged-base64"
version = "0.4.0"
@@ -9727,23 +9806,14 @@ checksum = "7b74bbf1db405a3fd2c6f8cd403bfa14727faa145925efe3012fa270b61551f1"
dependencies = [
"ark-serialize",
"ark-std",
- "base64 0.22.0",
+ "base64 0.22.1",
"crc-any",
"serde",
- "snafu 0.8.2",
- "tagged-base64-macros 0.4.0",
+ "snafu 0.8.3",
+ "tagged-base64-macros",
"wasm-bindgen",
]
-[[package]]
-name = "tagged-base64-macros"
-version = "0.3.3"
-source = "git+https://github.com/EspressoSystems/tagged-base64?tag=0.3.4#93be6f0f5c0ec8458f13dede3d2b68dcce12a608"
-dependencies = [
- "quote",
- "syn 1.0.109",
-]
-
[[package]]
name = "tagged-base64-macros"
version = "0.4.0"
@@ -9783,30 +9853,24 @@ dependencies = [
"winapi",
]
-[[package]]
-name = "termtree"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76"
-
[[package]]
name = "thiserror"
-version = "1.0.59"
+version = "1.0.61"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa"
+checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
-version = "1.0.59"
+version = "1.0.61"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66"
+checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.68",
]
[[package]]
@@ -9851,11 +9915,13 @@ dependencies = [
[[package]]
name = "tide-disco"
-version = "0.6.0"
+version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fbf3579d6f1362fffc7d1686ed061537afe8a187fd0b18e0f5694ad17e977ff3"
+checksum = "715558234f09576333f92ee769bd160e6c4bb1d156d25613cf62be9a592f291a"
dependencies = [
"anyhow",
+ "async-h1",
+ "async-lock 3.4.0",
"async-std",
"async-trait",
"clap",
@@ -9873,23 +9939,21 @@ dependencies = [
"libc",
"markdown",
"maud",
- "num-derive",
- "num-traits",
"parking_lot",
"prometheus",
- "reqwest 0.12.4",
+ "reqwest 0.12.5",
"routefinder",
- "semver 1.0.22",
+ "semver 1.0.23",
"serde",
"serde_json",
"serde_with",
"shellexpand",
"signal-hook",
"signal-hook-async-std",
- "snafu 0.8.2",
+ "snafu 0.8.3",
"strum",
"strum_macros",
- "tagged-base64 0.4.0",
+ "tagged-base64",
"tide",
"tide-websockets",
"toml",
@@ -9943,7 +10007,9 @@ checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885"
dependencies = [
"deranged",
"itoa",
+ "libc",
"num-conv",
+ "num_threads",
"powerfmt",
"serde",
"time-core",
@@ -10000,9 +10066,9 @@ dependencies = [
[[package]]
name = "tinyvec"
-version = "1.6.0"
+version = "1.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
+checksum = "c55115c6fbe2d2bef26eb09ad74bde02d8255476fc0c7b515ef09fbb35742d82"
dependencies = [
"tinyvec_macros",
]
@@ -10015,9 +10081,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]]
name = "tokio"
-version = "1.37.0"
+version = "1.38.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787"
+checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a"
dependencies = [
"backtrace",
"bytes 1.6.0",
@@ -10045,13 +10111,13 @@ dependencies = [
[[package]]
name = "tokio-macros"
-version = "2.2.0"
+version = "2.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
+checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.68",
]
[[package]]
@@ -10111,6 +10177,17 @@ dependencies = [
"tokio",
]
+[[package]]
+name = "tokio-rustls"
+version = "0.26.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4"
+dependencies = [
+ "rustls 0.23.10",
+ "rustls-pki-types",
+ "tokio",
+]
+
[[package]]
name = "tokio-stream"
version = "0.1.15"
@@ -10132,68 +10209,45 @@ dependencies = [
"log",
"rustls 0.21.12",
"tokio",
- "tokio-rustls",
+ "tokio-rustls 0.24.1",
"tungstenite 0.20.1",
"webpki-roots 0.25.4",
]
[[package]]
name = "tokio-util"
-version = "0.7.10"
+version = "0.7.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15"
+checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1"
dependencies = [
"bytes 1.6.0",
"futures-core",
"futures-sink",
"pin-project-lite 0.2.14",
"tokio",
- "tracing",
]
[[package]]
name = "toml"
-version = "0.8.12"
+version = "0.8.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3"
+checksum = "6f49eb2ab21d2f26bd6db7bf383edc527a7ebaee412d17af4d40fdccd442f335"
dependencies = [
"serde",
"serde_spanned",
"toml_datetime",
- "toml_edit 0.22.12",
+ "toml_edit 0.22.14",
]
[[package]]
name = "toml_datetime"
-version = "0.6.5"
+version = "0.6.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1"
+checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf"
dependencies = [
"serde",
]
-[[package]]
-name = "toml_edit"
-version = "0.19.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
-dependencies = [
- "indexmap 2.2.6",
- "toml_datetime",
- "winnow 0.5.40",
-]
-
-[[package]]
-name = "toml_edit"
-version = "0.20.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81"
-dependencies = [
- "indexmap 2.2.6",
- "toml_datetime",
- "winnow 0.5.40",
-]
-
[[package]]
name = "toml_edit"
version = "0.21.1"
@@ -10207,15 +10261,15 @@ dependencies = [
[[package]]
name = "toml_edit"
-version = "0.22.12"
+version = "0.22.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3328d4f68a705b2a4498da1d580585d39a6510f98318a2cec3018a7ec61ddef"
+checksum = "f21c7aaf97f1bd9ca9d4f9e73b0a6c74bd5afef56f2bc931943a6e1c37e04e38"
dependencies = [
"indexmap 2.2.6",
"serde",
"serde_spanned",
"toml_datetime",
- "winnow 0.6.7",
+ "winnow 0.6.13",
]
[[package]]
@@ -10232,7 +10286,34 @@ dependencies = [
"h2 0.3.26",
"http 0.2.12",
"http-body 0.4.6",
- "hyper 0.14.28",
+ "hyper 0.14.29",
+ "hyper-timeout",
+ "percent-encoding",
+ "pin-project",
+ "prost",
+ "tokio",
+ "tokio-stream",
+ "tower",
+ "tower-layer",
+ "tower-service",
+ "tracing",
+]
+
+[[package]]
+name = "tonic"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "76c4eb7a4e9ef9d4763600161f12f5070b92a578e1b634db88a6887844c91a13"
+dependencies = [
+ "async-stream",
+ "async-trait",
+ "axum",
+ "base64 0.21.7",
+ "bytes 1.6.0",
+ "h2 0.3.26",
+ "http 0.2.12",
+ "http-body 0.4.6",
+ "hyper 0.14.29",
"hyper-timeout",
"percent-encoding",
"pin-project",
@@ -10297,7 +10378,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.68",
]
[[package]]
@@ -10412,7 +10493,7 @@ checksum = "70977707304198400eb4835a78f6a9f928bf41bba420deb8fdb175cd965d77a7"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.68",
]
[[package]]
@@ -10462,6 +10543,12 @@ dependencies = [
"utf-8",
]
+[[package]]
+name = "typeid"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "059d83cc991e7a42fc37bd50941885db0888e34209f8cfd9aab07ddec03bc9cf"
+
[[package]]
name = "typenum"
version = "1.17.0"
@@ -10522,6 +10609,12 @@ dependencies = [
"tinyvec",
]
+[[package]]
+name = "unicode-properties"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e4259d9d4425d9f0661581b804cb85fe66a4c631cadd8f490d1c13a35d5d9291"
+
[[package]]
name = "unicode-segmentation"
version = "1.11.0"
@@ -10594,22 +10687,22 @@ version = "2.9.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d11a831e3c0b56e438a28308e7c810799e3c118417f342d30ecec080105395cd"
dependencies = [
- "base64 0.22.0",
+ "base64 0.22.1",
"flate2",
"log",
"once_cell",
"rustls 0.22.4",
"rustls-pki-types",
- "rustls-webpki 0.102.3",
+ "rustls-webpki 0.102.4",
"url",
- "webpki-roots 0.26.1",
+ "webpki-roots 0.26.3",
]
[[package]]
name = "url"
-version = "2.5.0"
+version = "2.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633"
+checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c"
dependencies = [
"form_urlencoded",
"idna 0.5.0",
@@ -10631,9 +10724,9 @@ checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
[[package]]
name = "utf8parse"
-version = "0.2.1"
+version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
+checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
[[package]]
name = "uuid"
@@ -10641,15 +10734,15 @@ version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7"
dependencies = [
- "getrandom 0.2.14",
+ "getrandom 0.2.15",
"serde",
]
[[package]]
name = "uuid"
-version = "1.8.0"
+version = "1.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0"
+checksum = "5de17fd2f7da591098415cff336e12965a28061ddace43b59cb3c430179c9439"
[[package]]
name = "valuable"
@@ -10659,9 +10752,9 @@ checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
[[package]]
name = "value-bag"
-version = "1.8.1"
+version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "74797339c3b98616c009c7c3eb53a0ce41e85c8ec66bd3db96ed132d20cfdee8"
+checksum = "5a84c137d37ab0142f0f2ddfe332651fdbf252e7b7dbb4e67b6c1f1b2e925101"
dependencies = [
"value-bag-serde1",
"value-bag-sval2",
@@ -10669,9 +10762,9 @@ dependencies = [
[[package]]
name = "value-bag-serde1"
-version = "1.8.1"
+version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cc35703541cbccb5278ef7b589d79439fc808ff0b5867195a3230f9a47421d39"
+checksum = "ccacf50c5cb077a9abb723c5bcb5e0754c1a433f1e1de89edc328e2760b6328b"
dependencies = [
"erased-serde",
"serde",
@@ -10680,9 +10773,9 @@ dependencies = [
[[package]]
name = "value-bag-sval2"
-version = "1.8.1"
+version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "285b43c29d0b4c0e65aad24561baee67a1b69dc9be9375d4a85138cbf556f7f8"
+checksum = "1785bae486022dfb9703915d42287dcb284c1ee37bd1080eeba78cc04721285b"
dependencies = [
"sval",
"sval_buffer",
@@ -10695,9 +10788,9 @@ dependencies = [
[[package]]
name = "vbs"
-version = "0.1.4"
+version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "971bcbd6c41e4e53fa9eab95b2a8ddaf1826be2f3e86b4101efebc8c3a17fde0"
+checksum = "6a9d83afb293d109ae418271619046cd9d87d63ba83e473e25a5e36101edc453"
dependencies = [
"anyhow",
"bincode",
@@ -10712,6 +10805,27 @@ version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
+[[package]]
+name = "vec1"
+version = "1.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eab68b56840f69efb0fefbe3ab6661499217ffdc58e2eef7c3f6f69835386322"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "vergen"
+version = "8.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e27d6bdd219887a9eadd19e1c34f32e47fa332301184935c6d9bca26f3cca525"
+dependencies = [
+ "anyhow",
+ "cfg-if",
+ "rustversion",
+ "time 0.3.36",
+]
+
[[package]]
name = "version_check"
version = "0.9.4"
@@ -10726,9 +10840,9 @@ checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
[[package]]
name = "waker-fn"
-version = "1.1.1"
+version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690"
+checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7"
[[package]]
name = "walkdir"
@@ -10760,7 +10874,7 @@ dependencies = [
"futures-util",
"headers",
"http 0.2.12",
- "hyper 0.14.28",
+ "hyper 0.14.29",
"log",
"mime",
"mime_guess",
@@ -10817,7 +10931,7 @@ dependencies = [
"once_cell",
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.68",
"wasm-bindgen-shared",
]
@@ -10851,7 +10965,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.68",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
@@ -10872,6 +10986,16 @@ dependencies = [
"wasm-bindgen",
]
+[[package]]
+name = "web-time"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
[[package]]
name = "webpki"
version = "0.21.4"
@@ -10899,9 +11023,9 @@ checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1"
[[package]]
name = "webpki-roots"
-version = "0.26.1"
+version = "0.26.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b3de34ae270483955a94f4b21bdaaeb83d508bb84a01435f393818edb0012009"
+checksum = "bd7c23921eeb1713a4e851530e9b9756e4fb0e89978582942612524cf09f01cd"
dependencies = [
"rustls-pki-types",
]
@@ -10960,7 +11084,7 @@ version = "0.51.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9"
dependencies = [
- "windows-core",
+ "windows-core 0.51.1",
"windows-targets 0.48.5",
]
@@ -10973,6 +11097,15 @@ dependencies = [
"windows-targets 0.48.5",
]
+[[package]]
+name = "windows-core"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+dependencies = [
+ "windows-targets 0.52.5",
+]
+
[[package]]
name = "windows-sys"
version = "0.48.0"
@@ -11123,9 +11256,9 @@ dependencies = [
[[package]]
name = "winnow"
-version = "0.6.7"
+version = "0.6.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "14b9415ee827af173ebb3f15f9083df5a122eb93572ec28741fb153356ea2578"
+checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1"
dependencies = [
"memchr",
]
@@ -11192,9 +11325,9 @@ dependencies = [
[[package]]
name = "x509-parser"
-version = "0.15.1"
+version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7069fba5b66b9193bd2c5d3d4ff12b839118f6bcbef5328efafafb5395cf63da"
+checksum = "fcbc162f30700d6f3f82a24bf7cc62ffe7caea42c0b2cba8bf7f3ae50cf51f69"
dependencies = [
"asn1-rs",
"data-encoding",
@@ -11202,7 +11335,7 @@ dependencies = [
"lazy_static",
"nom",
"oid-registry",
- "ring 0.16.20",
+ "ring 0.17.8",
"rusticata-macros",
"thiserror",
"time 0.3.36",
@@ -11249,18 +11382,18 @@ dependencies = [
[[package]]
name = "yamux"
-version = "0.13.1"
+version = "0.13.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad1d0148b89300047e72994bee99ecdabd15a9166a7b70c8b8c37c314dcc9002"
+checksum = "a31b5e376a8b012bee9c423acdbb835fc34d45001cfa3106236a624e4b738028"
dependencies = [
"futures",
- "instant",
"log",
"nohash-hasher",
"parking_lot",
"pin-project",
"rand 0.8.5",
"static_assertions",
+ "web-time",
]
[[package]]
@@ -11280,29 +11413,29 @@ dependencies = [
[[package]]
name = "zerocopy"
-version = "0.7.32"
+version = "0.7.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be"
+checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087"
dependencies = [
"zerocopy-derive",
]
[[package]]
name = "zerocopy-derive"
-version = "0.7.32"
+version = "0.7.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6"
+checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.68",
]
[[package]]
name = "zeroize"
-version = "1.7.0"
+version = "1.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d"
+checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
dependencies = [
"zeroize_derive",
]
@@ -11315,7 +11448,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.68",
]
[[package]]
@@ -11359,9 +11492,9 @@ dependencies = [
[[package]]
name = "zstd-sys"
-version = "2.0.10+zstd.1.5.6"
+version = "2.0.11+zstd.1.5.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c253a4914af5bafc8fa8c86ee400827e83cf6ec01195ec1f1ed8441bf00d65aa"
+checksum = "75652c55c0b6f3e6f12eb786fe1bc960396bf05a1eb3bf1f3691c3610ac2e6d4"
dependencies = [
"cc",
"pkg-config",
diff --git a/Cargo.toml b/Cargo.toml
index 2dd81d2c6..81fb8cdab 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -37,6 +37,7 @@ async-std = { version = "1.12.0", features = ["attributes", "tokio1"] }
async-trait = "0.1"
base64 = "0.22"
base64-bytes = "0.1"
+bincode = "1.3.3"
blake3 = "1.5"
clap = { version = "4.4", features = ["derive", "env", "string"] }
cld = "0.5"
@@ -46,56 +47,79 @@ dotenvy = "0.15"
ethers = { version = "2.0", features = ["solc"] }
futures = "0.3"
+hotshot = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.60" }
# Hotshot imports
-hotshot = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.46" }
-hotshot-builder-api = { git = "https://github.com/EspressoSystems/HotShot.git", tag = "0.5.46" }
-hotshot-builder-core = { git = "https://github.com/EspressoSystems/hotshot-builder-core", tag = "0.1.14" }
-hotshot-orchestrator = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.46" }
-hotshot-query-service = { git = "https://github.com/EspressoSystems/hotshot-query-service", tag = "0.1.14" }
-hotshot-stake-table = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.46" }
+hotshot-builder-api = { git = "https://github.com/EspressoSystems/HotShot.git", tag = "0.5.60" }
+hotshot-builder-core = { git = "https://github.com/EspressoSystems/hotshot-builder-core", tag = "rc-0.1.31-patch-1" }
+hotshot-events-service = { git = "https://github.com/EspressoSystems/hotshot-events-service.git", tag = "rc-0.1.31" }
+hotshot-orchestrator = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.60" }
+hotshot-query-service = { git = "https://github.com/EspressoSystems/hotshot-query-service", tag = "rc-0.1.43" }
+hotshot-stake-table = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.60" }
hotshot-state-prover = { version = "0.1.0", path = "hotshot-state-prover" }
-hotshot-task = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.46" }
-hotshot-testing = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.46" }
-hotshot-types = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.46" }
-hotshot-web-server = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.46" }
-hotshot-events-service = { git = "https://github.com/EspressoSystems/hotshot-events-service.git", tag = "0.1.16" }
+hotshot-task = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.60" }
+hotshot-testing = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.60" }
+hotshot-types = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.60" }
+hotshot-contract-adapter = { version = "0.1.0", path = "contracts/rust/adapter" }
+# Temporary, used to pull in the mock auction results provider
+hotshot-example-types = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.60" }
# Push CDN imports
cdn-broker = { git = "https://github.com/EspressoSystems/Push-CDN", features = [
"runtime-async-std",
"global-permits",
-], tag = "0.2.6", package = "cdn-broker" }
+], tag = "0.4.2", package = "cdn-broker" }
cdn-marshal = { git = "https://github.com/EspressoSystems/Push-CDN", features = [
"runtime-async-std",
"global-permits",
-], tag = "0.2.6", package = "cdn-marshal" }
+], tag = "0.4.2", package = "cdn-marshal" }
-jf-plonk = { git = "https://github.com/EspressoSystems/jellyfish", tag = "0.4.4", features = [
+jf-plonk = { git = "https://github.com/EspressoSystems/jellyfish", tag = "0.4.5", features = [
"test-apis",
] }
-jf-primitives = { git = "https://github.com/EspressoSystems/jellyfish", tag = "0.4.4", features = [
+jf-crhf = { version = "0.1.0", git = "https://github.com/EspressoSystems/jellyfish", tag = "0.4.5" }
+jf-merkle-tree = { version = "0.1.0", git = "https://github.com/EspressoSystems/jellyfish", tag = "0.4.5", features = [
"std",
] }
-jf-relation = { git = "https://github.com/EspressoSystems/jellyfish", tag = "0.4.4", features = [
+jf-signature = { version = "0.1.0", git = "https://github.com/EspressoSystems/jellyfish", tag = "0.4.5", features = [
"std",
] }
-jf-utils = { git = "https://github.com/EspressoSystems/jellyfish", tag = "0.4.4" }
+jf-pcs = { version = "0.1.0", git = "https://github.com/EspressoSystems/jellyfish", tag = "0.4.5", features = [
+ "std",
+ "parallel",
+] }
+jf-vid = { version = "0.1.0", git = "https://github.com/EspressoSystems/jellyfish", tag = "0.4.5", features = [
+ "std",
+ "parallel",
+] }
+jf-rescue = { version = "0.1.0", git = "https://github.com/EspressoSystems/jellyfish", tag = "0.4.5", features = [
+ "std",
+ "parallel",
+] }
+jf-relation = { git = "https://github.com/EspressoSystems/jellyfish", tag = "0.4.5", features = [
+ "std",
+] }
+jf-utils = { git = "https://github.com/EspressoSystems/jellyfish", tag = "0.4.5" }
+libp2p = { version = "0.53", default-features = false }
snafu = "0.8"
strum = { version = "0.26", features = ["derive"] }
-surf-disco = "0.6"
+surf-disco = "0.8"
tagged-base64 = "0.4"
-tide-disco = "0.6"
+tide-disco = "0.8"
+thiserror = "1.0.61"
time = "0.3"
tracing = "0.1"
-trait-variant = "0.1"
bytesize = "1.3"
itertools = "0.12"
rand_chacha = "0.3"
rand_distr = "0.4"
+reqwest = "0.12"
serde = { version = "1.0.195", features = ["derive"] }
toml = "0.8"
url = "2.3"
vbs = "0.1"
+vec1 = "1.12"
+vergen = { version = "8.3", features = ["git", "gitcl"] }
zeroize = "1.7"
committable = "0.2"
portpicker = "0.1.1"
+pretty_assertions = "1.4"
diff --git a/README.md b/README.md
index 05a5525e3..3590aae18 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,7 @@
# Espresso Sequencer
[![Build](https://github.com/EspressoSystems/espresso-sequencer/actions/workflows/build.yml/badge.svg)](https://github.com/EspressoSystems/espresso-sequencer/actions/workflows/build.yml)
+[![Docs](https://github.com/EspressoSystems/espresso-sequencer/actions/workflows/doc.yml/badge.svg)](https://github.com/EspressoSystems/espresso-sequencer/actions/workflows/doc.yml)
[![Contracts](https://github.com/EspressoSystems/espresso-sequencer/actions/workflows/contracts.yml/badge.svg)](https://github.com/EspressoSystems/espresso-sequencer/actions/workflows/contracts.yml)
[![Lint](https://github.com/EspressoSystems/espresso-sequencer/actions/workflows/lint.yml/badge.svg)](https://github.com/EspressoSystems/espresso-sequencer/actions/workflows/lint.yml)
[![Audit](https://github.com/EspressoSystems/espresso-sequencer/actions/workflows/audit.yml/badge.svg)](https://github.com/EspressoSystems/espresso-sequencer/actions/workflows/audit.yml)
@@ -12,10 +13,38 @@ Consisting of a data availability solution and a decentralized network of nodes
rollups can leverage the Espresso Sequencer to give developers and end users fast confirmations, low (and fair) fees,
and robust infrastructure.
-[Documentation](https://docs.espressosys.com/sequencer/espresso-sequencer-architecture/readme)
+[Official Documentation](https://docs.espressosys.com/sequencer/espresso-sequencer-architecture/readme)
+
+### Architecture
+
+This diagram below depicts a simplified view of the current architecture of the Espresso Sequencer. The diagram includes
+views of an Espresso Sequencer node, the Espresso Sequencer Network (nodes, CDN, builders, prover, state relay service),
+two rollups (one ZK rollup "Z", one optimistic rollup "O") that use the Espresso Sequencer for sequencing and some
+important L1 contracts.
+
+- Glossary
+ - Namespace: an identifier to distinguish rollups, akin to an Ethereum chain ID
+ - Rollup transaction: an transaction a user submits to a rollup, usually an EVM transaction
+ - Transaction: a transaction inside the Espresso Sequencer: a rollup transaction plus a namespace ID of the rollup
+ - Rollup block: a block in a rollup consisting only of transactions in this rollup
+ - Espresso block: a block produced by the Espresso sequencer containing transactions of multiple rollups
![Architecture diagram](./doc/architecture.svg)
+The sequence diagram below serves as a complement to the architecture diagram. The following interactions are depicted.
+
+1. Builders deposit funds into the fee contract on Ethereum Layer 1. These funds are later used to pay fees.
+2. Users submit transactions to the Submit APIs of sequencer nodes.
+3. The leader/proposer obtains a block from a builder.
+4. HotShot consensus creates new blocks containing sequenced rollup transactions.
+5. A rollup produces a rollup block with transactions sequenced by the Espresso sequencer.
+6. A proof for a HotShot state update is created and verified in the Light Client smart contract.
+7. A ZK rollup proves a correct state transaction by sending a proof to its rollup smart contract.
+8. A dispute is settled in an optimistic rollup. If necessary, the HotShot commitment is read from the Light Client
+ contract.
+
+![Sequence diagram](./doc/sequence-diagram.svg)
+
# Running the demo
Refer to [sequencer-example-l2](https://github.com/EspressoSystems/sequencer-example-l2) for instructions on how to run
@@ -28,6 +57,16 @@ a dockerized Espresso Sequencer network with an example Layer 2 rollup applicati
- Activate the environment with `nix-shell`, or `nix develop`, or `direnv allow` if using [direnv](https://direnv.net/).
- For installation without nix please see [ubuntu.md](./doc/ubuntu.md).
+## Documentation
+
+The rust code documentation can be found at
+[http://sequencer.docs.espressosys.com](http://sequencer.docs.espressosys.com). Please note the disclaimer about API
+stability at the end of the readme.
+
+To generate the documentation locally and view it in the browser, run
+
+ just doc --open
+
## Run the tests
just pull # to pull docker images
diff --git a/builder/Cargo.toml b/builder/Cargo.toml
index 4b196d8ef..899870c47 100644
--- a/builder/Cargo.toml
+++ b/builder/Cargo.toml
@@ -6,6 +6,7 @@ authors = { workspace = true }
edition = { workspace = true }
[features]
+default = ["libp2p"]
libp2p = ["sequencer/libp2p"]
[dependencies]
@@ -26,11 +27,14 @@ hotshot = { workspace = true }
hotshot-builder-api = { workspace = true }
hotshot-builder-core = { workspace = true }
hotshot-events-service = { workspace = true }
+hotshot-example-types = { workspace = true }
hotshot-orchestrator = { workspace = true }
hotshot-stake-table = { workspace = true }
hotshot-state-prover = { path = "../hotshot-state-prover" }
hotshot-types = { workspace = true }
-jf-primitives = { workspace = true }
+jf-merkle-tree = { workspace = true }
+jf-signature = { workspace = true, features = ["bls"] }
+libp2p = { workspace = true }
portpicker = { workspace = true }
rand = "0.8.5"
sequencer = { path = "../sequencer", features = ["testing"] }
@@ -43,3 +47,7 @@ tide-disco = { workspace = true }
tracing = { workspace = true }
url = { workspace = true }
vbs = { workspace = true }
+vec1 = { workspace = true }
+
+[dev-dependencies]
+sequencer = { path = "../sequencer", features = ["testing"] }
diff --git a/builder/src/bin/permissioned-builder.rs b/builder/src/bin/permissioned-builder.rs
index f3e70cd40..53833f537 100644
--- a/builder/src/bin/permissioned-builder.rs
+++ b/builder/src/bin/permissioned-builder.rs
@@ -10,9 +10,10 @@ use hotshot_types::light_client::StateSignKey;
use hotshot_types::signature_key::BLSPrivKey;
use hotshot_types::traits::metrics::NoMetrics;
use hotshot_types::traits::node_implementation::ConsensusTime;
-use sequencer::eth_signature_key::EthKeyPair;
+use libp2p::Multiaddr;
use sequencer::persistence::no_storage::NoStorage;
-use sequencer::{BuilderParams, L1Params, NetworkParams};
+use sequencer::{eth_signature_key::EthKeyPair, Genesis};
+use sequencer::{L1Params, NetworkParams};
use snafu::Snafu;
use std::net::ToSocketAddrs;
use std::num::NonZeroUsize;
@@ -21,10 +22,6 @@ use url::Url;
#[derive(Parser, Clone, Debug)]
pub struct PermissionedBuilderOptions {
- /// Unique identifier for this instance of the sequencer network.
- #[clap(long, env = "ESPRESSO_SEQUENCER_CHAIN_ID", default_value = "0")]
- pub chain_id: u16,
-
/// URL of the HotShot orchestrator.
#[clap(
short,
@@ -46,7 +43,6 @@ pub struct PermissionedBuilderOptions {
/// The address to bind to for Libp2p (in `host:port` form)
#[clap(
- short,
long,
env = "ESPRESSO_SEQUENCER_LIBP2P_BIND_ADDRESS",
default_value = "0.0.0.0:1769"
@@ -56,16 +52,26 @@ pub struct PermissionedBuilderOptions {
/// The address we advertise to other nodes as being a Libp2p endpoint.
/// Should be supplied in `host:port` form.
#[clap(
- short,
long,
env = "ESPRESSO_SEQUENCER_LIBP2P_ADVERTISE_ADDRESS",
default_value = "localhost:1769"
)]
pub libp2p_advertise_address: String,
+ /// A comma-separated list of Libp2p multiaddresses to use as bootstrap
+ /// nodes.
+ ///
+ /// Overrides those loaded from the `HotShot` config.
+ #[clap(
+ long,
+ env = "ESPRESSO_SEQUENCER_LIBP2P_BOOTSTRAP_NODES",
+ value_delimiter = ',',
+ num_args = 1..
+ )]
+ pub libp2p_bootstrap_nodes: Option>,
+
/// URL of the Light Client State Relay Server
#[clap(
- short,
long,
env = "ESPRESSO_STATE_RELAY_SERVER_URL",
default_value = "http://localhost:8083"
@@ -83,6 +89,10 @@ pub struct PermissionedBuilderOptions {
)]
pub webserver_poll_interval: Duration,
+ /// Path to TOML file containing genesis state.
+ #[clap(long, name = "GENESIS_FILE", env = "ESPRESSO_BUILDER_GENESIS_FILE")]
+ pub genesis_file: PathBuf,
+
/// Path to file containing private keys.
///
/// The file should follow the .env format, with two keys:
@@ -99,7 +109,7 @@ pub struct PermissionedBuilderOptions {
#[clap(
long,
env = "ESPRESSO_BUILDER_PRIVATE_STAKING_KEY",
- conflicts_with = "key_file"
+ conflicts_with = "KEY_FILE"
)]
pub private_staking_key: Option,
@@ -109,7 +119,7 @@ pub struct PermissionedBuilderOptions {
#[clap(
long,
env = "ESPRESSO_BUILDER_PRIVATE_STATE_KEY",
- conflicts_with = "key_file"
+ conflicts_with = "KEY_FILE"
)]
pub private_state_key: Option,
@@ -144,9 +154,13 @@ pub struct PermissionedBuilderOptions {
#[clap(short, long, env = "ESPRESSO_BUILDER_BOOTSTRAPPED_VIEW")]
pub view_number: u64,
- /// BUILDER CHANNEL CAPACITY
- #[clap(long, env = "ESPRESSO_BUILDER_CHANNEL_CAPACITY")]
- pub channel_capacity: NonZeroUsize,
+ /// BUILDER TRANSACTIONS CHANNEL CAPACITY
+ #[clap(long, env = "ESPRESSO_BUILDER_TX_CHANNEL_CAPACITY")]
+ pub tx_channel_capacity: NonZeroUsize,
+
+ /// BUILDER HS EVENTS CHANNEL CAPACITY
+ #[clap(long, env = "ESPRESSO_BUILDER_EVENT_CHANNEL_CAPACITY")]
+ pub event_channel_capacity: NonZeroUsize,
/// Url a sequencer can use to stream hotshot events
#[clap(long, env = "ESPRESSO_SEQUENCER_HOTSHOT_EVENTS_PROVIDER")]
@@ -164,7 +178,6 @@ pub struct PermissionedBuilderOptions {
/// The number of views to buffer before a builder garbage collects its state
#[clap(
- short,
long,
env = "ESPRESSO_BUILDER_BUFFER_VIEW_NUM_COUNT",
default_value = "15"
@@ -174,15 +187,6 @@ pub struct PermissionedBuilderOptions {
/// Whether or not we are a DA node.
#[clap(long, env = "ESPRESSO_SEQUENCER_IS_DA", action)]
pub is_da: bool,
-
- /// Base Fee for a block
- #[clap(
- short,
- long,
- env = "ESPRESSO_BUILDER_BLOCK_BASE_FEE",
- default_value = "0"
- )]
- base_fee: u64,
}
#[derive(Clone, Debug, Snafu)]
@@ -231,14 +235,11 @@ async fn main() -> anyhow::Result<()> {
let l1_params = L1Params {
url: opt.l1_provider_url,
+ events_max_block_range: 10000,
};
let builder_key_pair = EthKeyPair::from_mnemonic(&opt.eth_mnemonic, opt.eth_account_index)?;
- let builder_params = BuilderParams {
- prefunded_accounts: vec![],
- };
-
// Parse supplied Libp2p addresses to their socket form
// We expect all nodes to be reachable via IPv4, so we filter out any IPv6 addresses.
// Downstream in HotShot we pin the IP address to v4, but this can be fixed in the future.
@@ -259,11 +260,13 @@ async fn main() -> anyhow::Result<()> {
cdn_endpoint: opt.cdn_endpoint,
libp2p_advertise_address,
libp2p_bind_address,
+ libp2p_bootstrap_nodes: opt.libp2p_bootstrap_nodes,
orchestrator_url: opt.orchestrator_url,
state_relay_server_url: opt.state_relay_server_url,
private_staking_key: private_staking_key.clone(),
private_state_key,
state_peers: opt.state_peers,
+ catchup_backoff: Default::default(),
};
let sequencer_version = SEQUENCER_VERSION;
@@ -280,21 +283,21 @@ async fn main() -> anyhow::Result<()> {
// it will internally spawn the builder web server
let ctx = init_node(
+ Genesis::from_file(&opt.genesis_file)?,
network_params,
&NoMetrics,
- builder_params,
l1_params,
builder_server_url.clone(),
builder_key_pair,
bootstrapped_view,
- opt.channel_capacity,
+ opt.tx_channel_capacity,
+ opt.event_channel_capacity,
sequencer_version,
NoStorage,
max_api_response_timeout_duration,
buffer_view_num_count,
opt.is_da,
txn_timeout_duration,
- opt.base_fee,
)
.await?;
diff --git a/builder/src/bin/permissionless-builder.rs b/builder/src/bin/permissionless-builder.rs
index 1031461e0..35b09a8c4 100644
--- a/builder/src/bin/permissionless-builder.rs
+++ b/builder/src/bin/permissionless-builder.rs
@@ -3,13 +3,13 @@ use builder::non_permissioned::{build_instance_state, BuilderConfig};
use clap::Parser;
use cld::ClDuration;
use es_version::SEQUENCER_VERSION;
+use hotshot::traits::ValidatedState;
use hotshot_types::data::ViewNumber;
use hotshot_types::traits::node_implementation::ConsensusTime;
-use sequencer::eth_signature_key::EthKeyPair;
-use sequencer::L1Params;
+use sequencer::{eth_signature_key::EthKeyPair, Genesis, L1Params};
use snafu::Snafu;
use std::num::NonZeroUsize;
-use std::{str::FromStr, time::Duration};
+use std::{path::PathBuf, str::FromStr, time::Duration};
use url::Url;
#[derive(Parser, Clone, Debug)]
@@ -50,9 +50,17 @@ struct NonPermissionedBuilderOptions {
#[clap(short, long, env = "ESPRESSO_BUILDER_BOOTSTRAPPED_VIEW")]
view_number: u64,
- /// BUILDER CHANNEL CAPACITY
- #[clap(short, long, env = "ESPRESSO_BUILDER_CHANNEL_CAPACITY")]
- channel_capacity: NonZeroUsize,
+ /// BUILDER TRANSACTIONS CHANNEL CAPACITY
+ #[clap(long, env = "ESPRESSO_BUILDER_TX_CHANNEL_CAPACITY")]
+ pub tx_channel_capacity: NonZeroUsize,
+
+ /// BUILDER HS EVENTS CHANNEL CAPACITY
+ #[clap(long, env = "ESPRESSO_BUILDER_EVENT_CHANNEL_CAPACITY")]
+ pub event_channel_capacity: NonZeroUsize,
+
+ /// NETWORK INITIAL NODE COUNT
+ #[clap(short, long, env = "ESPRESSO_BUILDER_INIT_NODE_COUNT")]
+ node_count: NonZeroUsize,
/// The amount of time a builder can wait before timing out a request to the API.
#[clap(
@@ -66,21 +74,15 @@ struct NonPermissionedBuilderOptions {
/// The number of views to buffer before a builder garbage collects its state
#[clap(
- short,
long,
env = "ESPRESSO_BUILDER_BUFFER_VIEW_NUM_COUNT",
default_value = "15"
)]
buffer_view_num_count: usize,
- /// Base Fee for a block
- #[clap(
- short,
- long,
- env = "ESPRESSO_BUILDER_BLOCK_BASE_FEE",
- default_value = "0"
- )]
- base_fee: u64,
+ /// Path to TOML file containing genesis state.
+ #[clap(long, name = "GENESIS_FILE", env = "ESPRESSO_BUILDER_GENESIS_FILE")]
+ genesis_file: PathBuf,
}
#[derive(Clone, Debug, Snafu)]
@@ -102,11 +104,13 @@ async fn main() -> anyhow::Result<()> {
setup_backtrace();
let opt = NonPermissionedBuilderOptions::parse();
+ let genesis = Genesis::from_file(&opt.genesis_file)?;
let sequencer_version = SEQUENCER_VERSION;
let l1_params = L1Params {
url: opt.l1_provider_url,
+ events_max_block_range: 10000,
};
let builder_key_pair = EthKeyPair::from_mnemonic(&opt.eth_mnemonic, opt.eth_account_index)?;
@@ -114,8 +118,15 @@ async fn main() -> anyhow::Result<()> {
let builder_server_url: Url = format!("http://0.0.0.0:{}", opt.port).parse().unwrap();
- let instance_state =
- build_instance_state(l1_params, opt.state_peers, sequencer_version).unwrap();
+ let instance_state = build_instance_state(
+ genesis.chain_config,
+ l1_params,
+ opt.state_peers,
+ sequencer_version,
+ )
+ .unwrap();
+
+ let validated_state = ValidatedState::genesis(&instance_state).0;
let api_response_timeout_duration = opt.max_api_timeout_duration;
@@ -127,14 +138,16 @@ async fn main() -> anyhow::Result<()> {
let _builder_config = BuilderConfig::init(
builder_key_pair,
bootstrapped_view,
- opt.channel_capacity,
+ opt.tx_channel_capacity,
+ opt.event_channel_capacity,
+ opt.node_count,
instance_state,
+ validated_state,
opt.hotshot_event_streaming_url,
builder_server_url,
api_response_timeout_duration,
buffer_view_num_count,
txn_timeout_duration,
- opt.base_fee,
)
.await;
diff --git a/builder/src/lib.rs b/builder/src/lib.rs
index 8d5a557fe..1ba9b77f4 100644
--- a/builder/src/lib.rs
+++ b/builder/src/lib.rs
@@ -9,12 +9,9 @@ use futures::{
stream::{Stream, StreamExt},
};
use hotshot::{
- traits::{
- election::static_committee::GeneralStaticCommittee,
- implementations::{NetworkingMetricsValue, WebServerNetwork},
- },
+ traits::election::static_committee::GeneralStaticCommittee,
types::{SignatureKey, SystemContextHandle},
- HotShotInitializer, Memberships, Networks, SystemContext,
+ HotShotInitializer, Memberships, SystemContext,
};
use hotshot_orchestrator::{
client::{OrchestratorClient, ValidatorArgs},
@@ -22,12 +19,10 @@ use hotshot_orchestrator::{
};
use hotshot_types::{
consensus::ConsensusMetricsValue,
- constants::{Version01, STATIC_VER_0_1},
event::Event,
light_client::StateKeyPair,
signature_key::{BLSPrivKey, BLSPubKey},
- traits::election::Membership,
- traits::metrics::Metrics,
+ traits::{election::Membership, metrics::Metrics},
HotShotConfig, PeerConfig, ValidatorConfig,
};
use std::fmt::Display;
@@ -41,11 +36,12 @@ use async_compatibility_layer::art::{async_sleep, async_spawn};
use hotshot_builder_api::builder::{
BuildError, Error as BuilderApiError, Options as HotshotBuilderApiOptions,
};
-use hotshot_builder_core::service::{GlobalState, ProxyGlobalState};
-use jf_primitives::{
- merkle_tree::{namespaced_merkle_tree::NamespacedMerkleTreeScheme, MerkleTreeScheme},
- signatures::bls_over_bn254::VerKey,
+use hotshot_builder_core::{
+ service::{GlobalState, ProxyGlobalState},
+ testing::basic_test::NodeType,
};
+use jf_merkle_tree::{namespaced_merkle_tree::NamespacedMerkleTreeScheme, MerkleTreeScheme};
+use jf_signature::bls_over_bn254::VerKey;
use sequencer::catchup::mock::MockStateCatchup;
use sequencer::state_signature::StakeTableCommitmentType;
use sequencer::{
@@ -57,7 +53,7 @@ use sequencer::{
state::FeeAccount,
state::ValidatedState,
state_signature::{static_stake_table_commitment, StateSigner},
- BuilderParams, L1Params, NetworkParams, Node, NodeState, PrivKey, PubKey, SeqTypes,
+ L1Params, NetworkParams, Node, NodeState, PrivKey, PubKey, SeqTypes,
};
use std::{alloc::System, any, fmt::Debug, mem};
use std::{marker::PhantomData, net::IpAddr};
@@ -69,25 +65,24 @@ pub mod non_permissioned;
pub mod permissioned;
// It runs the api service for the builder
-pub fn run_builder_api_service(url: Url, source: Arc>>) {
+pub fn run_builder_api_service(url: Url, source: ProxyGlobalState) {
// it is to serve hotshot
let builder_api = hotshot_builder_api::builder::define_api::<
- Arc>>,
+ ProxyGlobalState,
SeqTypes,
- Version01,
+ ::Base,
>(&HotshotBuilderApiOptions::default())
.expect("Failed to construct the builder APIs");
// it enables external clients to submit txn to the builder's private mempool
let private_mempool_api = hotshot_builder_api::builder::submit_api::<
- Arc>>,
+ ProxyGlobalState,
SeqTypes,
- Version01,
+ ::Base,
>(&HotshotBuilderApiOptions::default())
.expect("Failed to construct the builder API for private mempool txns");
- let mut app: App>>, BuilderApiError> =
- App::with_state(source);
+ let mut app: App, BuilderApiError> = App::with_state(source);
app.register_module("block_info", builder_api)
.expect("Failed to register the builder API");
@@ -95,7 +90,7 @@ pub fn run_builder_api_service(url: Url, source: Arc::Base::instance()));
}
#[cfg(test)]
@@ -125,6 +120,7 @@ pub mod testing {
ExecutionType, HotShotConfig, PeerConfig, ValidatorConfig,
};
use portpicker::pick_unused_port;
+ use vbs::version::StaticVersion;
//use sequencer::persistence::NoStorage;
use async_broadcast::{
broadcast, Receiver as BroadcastReceiver, RecvError, Sender as BroadcastSender,
@@ -164,7 +160,6 @@ pub mod testing {
events::{Error as EventStreamApiError, Options as EventStreamingApiOptions},
events_source::{EventConsumer, EventsStreamer},
};
- use hotshot_types::constants::{Version01, STATIC_VER_0_1};
use serde::{Deserialize, Serialize};
use snafu::{guide::feature_flags, *};
@@ -176,7 +171,7 @@ pub mod testing {
staking_nodes_state_key_pairs: Vec,
non_staking_nodes_state_key_pairs: Vec,
non_staking_nodes_stake_entries: Vec>,
- master_map: Arc, PubKey>>,
+ master_map: Arc>,
anvil: Arc,
}
@@ -199,7 +194,7 @@ pub mod testing {
// Only pass the pub keys to the hotshot config
let known_nodes_without_stake_pub_keys = known_nodes_without_stake
.iter()
- .map(|x| ::get_public_key(&x.stake_table_entry))
+ .map(|x| ::public_key(&x.stake_table_entry))
.collect::>();
let master_map = MasterMap::new();
@@ -224,12 +219,20 @@ pub mod testing {
data_request_delay: Duration::from_millis(200),
view_sync_timeout: Duration::from_secs(5),
fixed_leader_for_gpuvid: 0,
- builder_url,
+ builder_urls: vec1::vec1![builder_url],
builder_timeout: Duration::from_secs(1),
start_threshold: (
known_nodes_with_stake.clone().len() as u64,
known_nodes_with_stake.clone().len() as u64,
),
+ start_proposing_view: 0,
+ stop_proposing_view: 0,
+ start_voting_view: 0,
+ stop_voting_view: 0,
+ start_proposing_time: 0,
+ start_voting_time: 0,
+ stop_proposing_time: 0,
+ stop_voting_time: 0,
};
Self {
@@ -265,7 +268,7 @@ pub mod testing {
.iter()
.zip(&state_key_pairs)
.map(|(pub_key, state_key_pair)| PeerConfig:: {
- stake_table_entry: pub_key.get_stake_table_entry(stake_value),
+ stake_table_entry: pub_key.stake_table_entry(stake_value),
state_ver_key: state_key_pair.ver_key(),
})
.collect::>();
@@ -326,7 +329,7 @@ pub mod testing {
bind_version: Ver,
options: impl PersistenceOptions,
) -> Vec<(
- SystemContextHandle>,
+ Arc>>,
Option>,
)> {
let num_staked_nodes = self.num_staked_nodes();
@@ -352,7 +355,7 @@ pub mod testing {
)
.await;
// wrapped in some because need to take later
- (hotshot_handle, Some(state_signer))
+ (Arc::new(hotshot_handle), Some(state_signer))
}
}))
.await
@@ -382,19 +385,14 @@ pub mod testing {
let network = Arc::new(MemoryNetwork::new(
config.my_own_validator_config.public_key,
- NetworkingMetricsValue::new(metrics),
- self.master_map.clone(),
+ &self.master_map,
None,
));
- let networks = Networks {
- da_network: network.clone(),
- quorum_network: network,
- _pd: Default::default(),
- };
let node_state = NodeState::new(
+ i as u64,
ChainConfig::default(),
- L1Client::new(self.anvil.endpoint().parse().unwrap(), Address::default()),
+ L1Client::new(self.anvil.endpoint().parse().unwrap(), 1),
MockStateCatchup::default(),
)
.with_genesis(ValidatedState::default());
@@ -404,7 +402,7 @@ pub mod testing {
config,
Some(self.non_staking_nodes_stake_entries.clone()),
node_state,
- networks,
+ network,
metrics,
i as u64,
None,
@@ -439,7 +437,7 @@ pub mod testing {
let hotshot_events_api = hotshot_events_service::events::define_api::<
Arc>>,
SeqTypes,
- Version01,
+ ::Base,
>(&EventStreamingApiOptions::default())
.expect("Failed to define hotshot eventsAPI");
@@ -448,14 +446,14 @@ pub mod testing {
app.register_module("hotshot-events", hotshot_events_api)
.expect("Failed to register hotshot events API");
- async_spawn(app.serve(url, STATIC_VER_0_1));
+ async_spawn(app.serve(url, ::Base::instance()));
}
// enable hotshot event streaming
pub fn enable_hotshot_node_event_streaming(
hotshot_events_api_url: Url,
known_nodes_with_stake: Vec>,
num_non_staking_nodes: usize,
- hotshot_context_handle: SystemContextHandle>,
+ hotshot_context_handle: Arc>>,
) {
// create a event streamer
let events_streamer = Arc::new(RwLock::new(EventsStreamer::new(
@@ -469,7 +467,7 @@ pub mod testing {
// send the events to the event streaming state
async_spawn({
async move {
- let mut hotshot_event_stream = hotshot_context_handle.get_event_stream();
+ let mut hotshot_event_stream = hotshot_context_handle.event_stream();
loop {
let event = hotshot_event_stream.next().await.unwrap();
tracing::debug!("Before writing in event streamer: {event:?}");
@@ -497,12 +495,12 @@ pub mod testing {
if let Decide { leaf_chain, .. } = event.event {
if let Some(height) = leaf_chain.iter().find_map(|LeafInfo { leaf, .. }| {
if leaf
- .get_block_payload()
+ .block_payload()
.as_ref()?
- .transaction_commitments(leaf.get_block_header().metadata())
+ .transaction_commitments(leaf.block_header().metadata())
.contains(&commitment)
{
- Some(leaf.get_block_header().block_number())
+ Some(leaf.block_header().block_number())
} else {
None
}
@@ -530,10 +528,11 @@ pub mod testing {
) -> Self {
// setup the instance state
let node_state = NodeState::new(
+ u64::MAX,
ChainConfig::default(),
L1Client::new(
hotshot_test_config.get_anvil().endpoint().parse().unwrap(),
- Address::default(),
+ 1,
),
MockStateCatchup::default(),
)
@@ -544,22 +543,27 @@ pub mod testing {
let (fee_account, key_pair) = FeeAccount::generated_from_seed_indexed(seed, 2011_u64);
// channel capacity for the builder states
- let channel_capacity = NonZeroUsize::new(100).unwrap();
+ let tx_channel_capacity = NonZeroUsize::new(500).unwrap();
+ let event_channel_capacity = NonZeroUsize::new(20).unwrap();
// bootstrapping view number
// A new builder can use this view number to start building blocks from this view number
let bootstrapped_view = ViewNumber::new(0);
+ let node_count = NonZeroUsize::new(HotShotTestConfig::total_nodes()).unwrap();
+
let builder_config = BuilderConfig::init(
key_pair,
bootstrapped_view,
- channel_capacity,
+ tx_channel_capacity,
+ event_channel_capacity,
+ node_count,
node_state,
+ ValidatedState::default(),
hotshot_events_streaming_api_url,
hotshot_builder_api_url,
Duration::from_millis(2000),
15,
- Duration::from_millis(50),
- 0,
+ Duration::from_millis(500),
)
.await
.unwrap();
@@ -584,17 +588,18 @@ pub mod testing {
{
pub async fn init_permissioned_builder(
hotshot_test_config: HotShotTestConfig,
- hotshot_handle: SystemContextHandle>,
+ hotshot_handle: Arc>>,
node_id: u64,
state_signer: StateSigner,
hotshot_builder_api_url: Url,
) -> Self {
// setup the instance state
let node_state = NodeState::new(
+ node_id,
ChainConfig::default(),
L1Client::new(
hotshot_test_config.get_anvil().endpoint().parse().unwrap(),
- Address::default(),
+ 1,
),
MockStateCatchup::default(),
)
@@ -605,24 +610,26 @@ pub mod testing {
let (fee_account, key_pair) = FeeAccount::generated_from_seed_indexed(seed, 2011_u64);
// channel capacity for the builder states
- let channel_capacity = NonZeroUsize::new(100).unwrap();
+ let tx_channel_capacity = NonZeroUsize::new(20).unwrap();
+ let event_channel_capacity = NonZeroUsize::new(500).unwrap();
// bootstrapping view number
// A new builder can use this view number to start building blocks from this view number
let bootstrapped_view = ViewNumber::new(0);
let builder_context = BuilderContext::init(
- hotshot_handle,
+ Arc::clone(&hotshot_handle),
state_signer,
node_id,
key_pair,
bootstrapped_view,
- channel_capacity,
+ tx_channel_capacity,
+ event_channel_capacity,
node_state,
+ ValidatedState::default(),
hotshot_builder_api_url,
Duration::from_millis(2000),
15,
- Duration::from_millis(50),
- 0,
+ Duration::from_millis(500),
)
.await
.unwrap();
@@ -664,10 +671,10 @@ mod test {
use hotshot_builder_core::service::GlobalState;
use hotshot_types::event::LeafInfo;
use hotshot_types::traits::block_contents::{
- vid_commitment, BlockHeader, BlockPayload, GENESIS_VID_NUM_STORAGE_NODES,
+ vid_commitment, BlockHeader, BlockPayload, EncodeBytes, GENESIS_VID_NUM_STORAGE_NODES,
};
use hotshot_types::utils::BuilderCommitment;
- use sequencer::block::payload::Payload;
+ use sequencer::block::Payload;
use sequencer::persistence::no_storage::{self, NoStorage};
use sequencer::persistence::sql;
use sequencer::{empty_builder_commitment, Header};
@@ -695,23 +702,23 @@ mod test {
let total_nodes = HotShotTestConfig::total_nodes();
// try to listen on non-voting node handle as it is the last handle
- let mut events = handles[total_nodes - 1].0.get_event_stream();
+ let mut events = handles[total_nodes - 1].0.event_stream();
for (handle, ..) in handles.iter() {
handle.hotshot.start_consensus().await;
}
let genesis_state = NodeState::mock();
+ let validated_state = ValidatedState::default();
let mut parent = {
// TODO refactor repeated code from other tests
let (genesis_payload, genesis_ns_table) =
- Payload::from_transactions([], Arc::new(genesis_state.clone()))
+ Payload::from_transactions([], &validated_state, &genesis_state)
+ .await
.expect("unable to create genesis payload");
let builder_commitment = genesis_payload.builder_commitment(&genesis_ns_table);
let genesis_commitment = {
// TODO we should not need to collect payload bytes just to compute vid_commitment
- let payload_bytes = genesis_payload
- .encode()
- .expect("unable to encode genesis payload");
+ let payload_bytes = genesis_payload.encode();
vid_commitment(&payload_bytes, GENESIS_VID_NUM_STORAGE_NODES)
};
Header::genesis(
@@ -733,7 +740,7 @@ mod test {
// Check that each successive header satisfies invariants relative to its parent: all
// the fields which should be monotonic are.
for LeafInfo { leaf, .. } in leaf_chain.iter().rev() {
- let header = leaf.get_block_header().clone();
+ let header = leaf.block_header().clone();
if header.height == 0 {
parent = header;
continue;
diff --git a/builder/src/non_permissioned.rs b/builder/src/non_permissioned.rs
index 4742b4265..683a695f2 100644
--- a/builder/src/non_permissioned.rs
+++ b/builder/src/non_permissioned.rs
@@ -1,3 +1,4 @@
+use anyhow::Context;
use async_broadcast::{
broadcast, Receiver as BroadcastReceiver, RecvError, Sender as BroadcastSender, TryRecvError,
};
@@ -20,21 +21,24 @@ use hotshot_builder_core::{
BuildBlockInfo, BuilderProgress, BuilderState, BuiltFromProposedBlock, MessageType,
ResponseMessage,
},
- service::{run_non_permissioned_standalone_builder_service, GlobalState, ProxyGlobalState},
+ service::{
+ run_non_permissioned_standalone_builder_service, GlobalState, ProxyGlobalState,
+ ReceivedTransaction,
+ },
};
use hotshot_types::{
- constants::{Version01, STATIC_VER_0_1},
data::{fake_commitment, Leaf, ViewNumber},
traits::{
block_contents::{vid_commitment, GENESIS_VID_NUM_STORAGE_NODES},
node_implementation::{ConsensusTime, NodeType},
+ EncodeBytes,
},
utils::BuilderCommitment,
};
use sequencer::{
- catchup::StatePeers, eth_signature_key::EthKeyPair, l1_client::L1Client, BuilderParams,
- ChainConfig, L1Params, NetworkParams, NodeState, Payload, PrivKey, PubKey, SeqTypes,
+ catchup::StatePeers, eth_signature_key::EthKeyPair, l1_client::L1Client, ChainConfig, L1Params,
+ NetworkParams, NodeState, Payload, PrivKey, PubKey, SeqTypes, ValidatedState,
};
use hotshot_events_service::{
@@ -57,15 +61,20 @@ pub struct BuilderConfig {
}
pub fn build_instance_state(
+ chain_config: ChainConfig,
l1_params: L1Params,
state_peers: Vec,
_: Ver,
) -> anyhow::Result {
- let l1_client = L1Client::new(l1_params.url, Address::default());
+ let l1_client = L1Client::new(l1_params.url, l1_params.events_max_block_range);
let instance_state = NodeState::new(
- ChainConfig::default(),
+ u64::MAX, // dummy node ID, only used for debugging
+ chain_config,
l1_client,
- Arc::new(StatePeers::::from_urls(state_peers)),
+ Arc::new(StatePeers::::from_urls(
+ state_peers,
+ Default::default(),
+ )),
);
Ok(instance_state)
}
@@ -75,50 +84,64 @@ impl BuilderConfig {
pub async fn init(
builder_key_pair: EthKeyPair,
bootstrapped_view: ViewNumber,
- channel_capacity: NonZeroUsize,
+ tx_channel_capacity: NonZeroUsize,
+ event_channel_capacity: NonZeroUsize,
+ node_count: NonZeroUsize,
instance_state: NodeState,
+ validated_state: ValidatedState,
hotshot_events_api_url: Url,
hotshot_builder_apis_url: Url,
max_api_timeout_duration: Duration,
buffered_view_num_count: usize,
- maximise_txns_count_timeout_duration: Duration,
- base_fee: u64,
+ maximize_txns_count_timeout_duration: Duration,
) -> anyhow::Result {
+ tracing::info!(
+ address = %builder_key_pair.fee_account(),
+ ?bootstrapped_view,
+ %tx_channel_capacity,
+ %event_channel_capacity,
+ ?max_api_timeout_duration,
+ buffered_view_num_count,
+ ?maximize_txns_count_timeout_duration,
+ "initializing builder",
+ );
+
// tx channel
- let (tx_sender, tx_receiver) = broadcast::>(channel_capacity.get());
+ let (mut tx_sender, tx_receiver) =
+ broadcast::>>(tx_channel_capacity.get());
+ tx_sender.set_overflow(true);
// da channel
- let (da_sender, da_receiver) = broadcast::>(channel_capacity.get());
+ let (da_sender, da_receiver) =
+ broadcast::>(event_channel_capacity.get());
// qc channel
- let (qc_sender, qc_receiver) = broadcast::>(channel_capacity.get());
+ let (qc_sender, qc_receiver) =
+ broadcast::>(event_channel_capacity.get());
// decide channel
let (decide_sender, decide_receiver) =
- broadcast::>(channel_capacity.get());
+ broadcast::>(event_channel_capacity.get());
// builder api request channel
- let (req_sender, req_receiver) = broadcast::>(channel_capacity.get());
-
- // builder api response channel
- let (res_sender, res_receiver) = unbounded();
+ let (req_sender, req_receiver) =
+ broadcast::>(event_channel_capacity.get());
let (genesis_payload, genesis_ns_table) =
- Payload::from_transactions([], Arc::new(instance_state.clone()))
+ Payload::from_transactions([], &validated_state, &instance_state)
+ .await
.expect("genesis payload construction failed");
+
let builder_commitment = genesis_payload.builder_commitment(&genesis_ns_table);
+
let vid_commitment = {
- // TODO we should not need to collect payload bytes just to compute vid_commitment
- let payload_bytes = genesis_payload
- .encode()
- .expect("unable to encode genesis payload");
+ let payload_bytes = genesis_payload.encode();
vid_commitment(&payload_bytes, GENESIS_VID_NUM_STORAGE_NODES)
};
// create the global state
let global_state: GlobalState = GlobalState::::new(
req_sender,
- res_receiver,
tx_sender.clone(),
vid_commitment,
bootstrapped_view,
@@ -127,7 +150,6 @@ impl BuilderConfig {
);
let global_state = Arc::new(RwLock::new(global_state));
-
let global_state_clone = global_state.clone();
let builder_state = BuilderState::::new(
@@ -137,19 +159,23 @@ impl BuilderConfig {
leaf_commit: fake_commitment(),
builder_commitment,
},
- tx_receiver,
decide_receiver,
da_receiver,
qc_receiver,
req_receiver,
+ tx_receiver,
+ Vec::new() /* tx_queue */,
global_state_clone,
- res_sender,
- NonZeroUsize::new(1).unwrap(),
- bootstrapped_view,
- buffered_view_num_count as u64,
- maximise_txns_count_timeout_duration,
- base_fee,
+ node_count,
+ maximize_txns_count_timeout_duration,
+ instance_state
+ .chain_config
+ .base_fee
+ .as_u64()
+ .context("the base fee exceeds the maximum amount that a builder can pay (defined by u64::MAX)")?,
Arc::new(instance_state),
+ Duration::from_secs(60),
+ Arc::new(validated_state),
);
// spawn the builder event loop
@@ -164,41 +190,25 @@ impl BuilderConfig {
max_api_timeout_duration,
);
- let proxy_global_api_state = Arc::new(RwLock::new(proxy_global_state));
// start the hotshot api service
- run_builder_api_service(hotshot_builder_apis_url.clone(), proxy_global_api_state);
-
- // create a client for it
- // Start Client for the event streaming api
- tracing::info!(
- "Builder client connecting to hotshot events API at {}",
- hotshot_events_api_url.to_string()
- );
- let client = Client::::new(hotshot_events_api_url.clone());
-
- assert!(client.connect(None).await);
-
- tracing::info!("Builder client connected to the hotshot events api");
-
- // client subscrive to hotshot events
- let subscribed_events = client
- .socket("hotshot-events/events")
- .subscribe::>()
- .await
- .unwrap();
-
- tracing::info!("Builder client subscribed to hotshot events");
+ run_builder_api_service(hotshot_builder_apis_url.clone(), proxy_global_state);
// spawn the builder service
+ let events_url = hotshot_events_api_url.clone();
+ tracing::info!("Running permissionless builder against hotshot events API at {events_url}",);
async_spawn(async move {
- run_non_permissioned_standalone_builder_service(
- tx_sender,
+ let res = run_non_permissioned_standalone_builder_service(
da_sender,
qc_sender,
decide_sender,
- subscribed_events,
+ tx_sender,
+ events_url,
)
.await;
+ tracing::error!(?res, "builder service exited");
+ if res.is_err() {
+ panic!("Builder should restart.");
+ }
});
tracing::info!("Builder init finished");
@@ -234,12 +244,9 @@ mod test {
events::{Error as EventStreamApiError, Options as EventStreamingApiOptions},
events_source::{BuilderEvent, EventConsumer, EventsStreamer},
};
- use hotshot_types::{
- constants::{Version01, STATIC_VER_0_1},
- traits::{
- block_contents::{BlockPayload, GENESIS_VID_NUM_STORAGE_NODES},
- node_implementation::NodeType,
- },
+ use hotshot_types::traits::{
+ block_contents::{BlockPayload, GENESIS_VID_NUM_STORAGE_NODES},
+ node_implementation::NodeType,
};
use hotshot_types::{signature_key::BLSPubKey, traits::signature_key::SignatureKey};
use sequencer::{
@@ -248,8 +255,7 @@ mod test {
PersistenceOptions,
},
state::FeeAccount,
- transaction::Transaction,
- Payload,
+ NamespaceId, Payload, Transaction,
};
use std::time::Duration;
use surf_disco::Client;
@@ -281,10 +287,8 @@ mod test {
let num_non_staking_nodes = hotshot_config.config.num_nodes_without_stake;
// non-staking node handle
- let hotshot_context_handle = handles
- [NonPermissionedBuilderTestConfig::SUBSCRIBED_DA_NODE_ID]
- .0
- .clone();
+ let hotshot_context_handle =
+ &handles[NonPermissionedBuilderTestConfig::SUBSCRIBED_DA_NODE_ID].0;
// hotshot event streaming api url
let hotshot_events_streaming_api_url = HotShotTestConfig::hotshot_event_streaming_api_url();
@@ -294,11 +298,11 @@ mod test {
hotshot_events_streaming_api_url.clone(),
known_nodes_with_stake,
num_non_staking_nodes,
- hotshot_context_handle,
+ Arc::clone(hotshot_context_handle),
);
// builder api url
- let hotshot_builder_api_url = hotshot_config.config.builder_url.clone();
+ let hotshot_builder_api_url = hotshot_config.config.builder_urls[0].clone();
let builder_config = NonPermissionedBuilderTestConfig::init_non_permissioned_builder(
&hotshot_config,
@@ -310,9 +314,10 @@ mod test {
let builder_pub_key = builder_config.fee_account;
// Start a builder api client
- let builder_client = Client::::new(
- hotshot_builder_api_url.clone(),
- );
+ let builder_client = Client::<
+ hotshot_builder_api::builder::Error,
+ ::Base,
+ >::new(hotshot_builder_api_url.clone());
assert!(builder_client.connect(Some(Duration::from_secs(60))).await);
let seed = [207_u8; 32];
@@ -331,12 +336,14 @@ mod test {
.expect("Claim block signing failed");
// sleep and wait for builder service to startup
- async_sleep(Duration::from_millis(3000)).await;
+ async_sleep(Duration::from_millis(500)).await;
+
+ let test_view_num = 0;
// test getting available blocks
let available_block_info = match builder_client
.get::>>(&format!(
- "block_info/availableblocks/{parent_commitment}/{hotshot_client_pub_key}/{encoded_signature}"
+ "block_info/availableblocks/{parent_commitment}/{test_view_num}/{hotshot_client_pub_key}/{encoded_signature}"
))
.send()
.await
@@ -363,7 +370,7 @@ mod test {
// Test claiming blocks
let _available_block_data = match builder_client
.get::>(&format!(
- "block_info/claimblock/{builder_commitment}/{hotshot_client_pub_key}/{encoded_signature}"
+ "block_info/claimblock/{builder_commitment}/{test_view_num}/{hotshot_client_pub_key}/{encoded_signature}"
))
.send()
.await
@@ -380,7 +387,7 @@ mod test {
// Test claiming block header input
let _available_block_header = match builder_client
.get::>(&format!(
- "block_info/claimheaderinput/{builder_commitment}/{hotshot_client_pub_key}/{encoded_signature}"
+ "block_info/claimheaderinput/{builder_commitment}/{test_view_num}/{hotshot_client_pub_key}/{encoded_signature}"
))
.send()
.await
@@ -409,7 +416,7 @@ mod test {
}
}
- let txn = Transaction::new(Default::default(), vec![1, 2, 3]);
+ let txn = Transaction::new(NamespaceId::from(1), vec![1, 2, 3]);
match builder_client
.post::<()>("txn_submit/submit")
.body_json(&txn)
diff --git a/builder/src/permissioned.rs b/builder/src/permissioned.rs
index 0f40b4371..bcc233f12 100644
--- a/builder/src/permissioned.rs
+++ b/builder/src/permissioned.rs
@@ -12,13 +12,14 @@ use hotshot::{
traits::{
election::static_committee::GeneralStaticCommittee,
implementations::{
- derive_libp2p_peer_id, CombinedNetworks, KeyPair, Libp2pNetwork,
- NetworkingMetricsValue, PushCdnNetwork, WebServerNetwork, WrappedSignatureKey,
+ derive_libp2p_peer_id, CdnMetricsValue, CombinedNetworks, KeyPair, Libp2pNetwork,
+ PushCdnNetwork, Topic, WrappedSignatureKey,
},
},
types::{SignatureKey, SystemContextHandle},
- HotShotInitializer, Memberships, Networks, SystemContext,
+ HotShotInitializer, Memberships, SystemContext,
};
+use hotshot_example_types::auction_results_provider_types::TestAuctionResultsProvider;
use hotshot_orchestrator::{
client::{OrchestratorClient, ValidatorArgs},
config::NetworkConfig,
@@ -28,7 +29,7 @@ use hotshot_types::{
event::Event,
light_client::StateKeyPair,
signature_key::{BLSPrivKey, BLSPubKey},
- traits::{election::Membership, metrics::Metrics},
+ traits::{election::Membership, metrics::Metrics, network::ConnectedNetwork, EncodeBytes},
utils::BuilderCommitment,
HotShotConfig, PeerConfig, ValidatorConfig,
};
@@ -60,25 +61,27 @@ use hotshot_builder_core::{
service::{
run_non_permissioned_standalone_builder_service,
run_permissioned_standalone_builder_service, GlobalState, ProxyGlobalState,
+ ReceivedTransaction,
},
};
use hotshot_state_prover;
-use jf_primitives::{
- merkle_tree::{namespaced_merkle_tree::NamespacedMerkleTreeScheme, MerkleTreeScheme},
- signatures::bls_over_bn254::VerKey,
-};
-use sequencer::state_signature::StakeTableCommitmentType;
-use sequencer::{catchup::mock::MockStateCatchup, eth_signature_key::EthKeyPair, ChainConfig};
+use jf_merkle_tree::{namespaced_merkle_tree::NamespacedMerkleTreeScheme, MerkleTreeScheme};
+use jf_signature::bls_over_bn254::VerKey;
use sequencer::{
- catchup::StatePeers,
+ catchup::{mock::MockStateCatchup, StatePeers},
context::{Consensus, SequencerContext},
+ eth_signature_key::EthKeyPair,
+ genesis::L1Finalized,
l1_client::L1Client,
network,
+ network::libp2p::split_off_peer_id,
persistence::SequencerPersistence,
state::FeeAccount,
state::ValidatedState,
+ state_signature::StakeTableCommitmentType,
state_signature::{static_stake_table_commitment, StateSigner},
- BuilderParams, L1Params, NetworkParams, Node, NodeState, Payload, PrivKey, PubKey, SeqTypes,
+ ChainConfig, Genesis, L1Params, NetworkParams, Node, NodeState, Payload, PrivKey, PubKey,
+ SeqTypes,
};
use std::{alloc::System, any, fmt::Debug, mem};
use std::{marker::PhantomData, net::IpAddr};
@@ -87,7 +90,6 @@ use tide_disco::{app, method::ReadState, App, Url};
use vbs::version::StaticVersionType;
use hotshot_types::{
- constants::{Version01, STATIC_VER_0_1},
data::{fake_commitment, Leaf, ViewNumber},
traits::{
block_contents::{vid_commitment, GENESIS_VID_NUM_STORAGE_NODES},
@@ -104,12 +106,12 @@ use std::{num::NonZeroUsize, time::Duration};
use surf_disco::Client;
pub struct BuilderContext<
- N: network::Type,
+ N: ConnectedNetwork,
P: SequencerPersistence,
Ver: StaticVersionType + 'static,
> {
/// The consensus handle
- pub hotshot_handle: Consensus,
+ pub hotshot_handle: Arc>,
/// Index of this sequencer node
pub node_index: u64,
@@ -129,26 +131,27 @@ pub struct BuilderContext<
#[allow(clippy::too_many_arguments)]
pub async fn init_node(
+ genesis: Genesis,
network_params: NetworkParams,
metrics: &dyn Metrics,
- builder_params: BuilderParams,
l1_params: L1Params,
hotshot_builder_api_url: Url,
eth_key_pair: EthKeyPair,
bootstrapped_view: ViewNumber,
- channel_capacity: NonZeroUsize,
+ tx_channel_capacity: NonZeroUsize,
+ event_channel_capacity: NonZeroUsize,
bind_version: Ver,
persistence: P,
max_api_timeout_duration: Duration,
buffered_view_num_count: usize,
is_da: bool,
- maximise_txns_count_timeout_duration: Duration,
- base_fee: u64,
+ maximize_txns_count_timeout_duration: Duration,
) -> anyhow::Result> {
// Orchestrator client
let validator_args = ValidatorArgs {
url: network_params.orchestrator_url,
advertise_address: Some(network_params.libp2p_advertise_address),
+ builder_address: None,
network_config_file: None,
};
let orchestrator_client = OrchestratorClient::new(validator_args);
@@ -166,19 +169,36 @@ pub async fn init_node::SignatureKey>(&my_config.private_key)
.with_context(|| "Failed to derive Libp2p peer ID")?;
- let config = NetworkConfig::get_complete_config(
+ let mut config = NetworkConfig::get_complete_config(
&orchestrator_client,
- None,
my_config.clone(),
// Register in our Libp2p advertise address and public key so other nodes
// can contact us on startup
Some(network_params.libp2p_advertise_address),
Some(libp2p_public_key),
- false,
)
.await?
.0;
+ // If the `Libp2p` bootstrap nodes were supplied via the command line, override those
+ // present in the config file.
+ if let Some(bootstrap_nodes) = network_params.libp2p_bootstrap_nodes {
+ if let Some(libp2p_config) = config.libp2p_config.as_mut() {
+ // If the libp2p configuration is present, we can override the bootstrap nodes.
+
+ // Split off the peer ID from the addresses
+ libp2p_config.bootstrap_nodes = bootstrap_nodes
+ .into_iter()
+ .map(split_off_peer_id)
+ .collect::, _>>()
+ .with_context(|| "Failed to parse peer ID from bootstrap node")?;
+ } else {
+ // If not, don't try launching with them. Eventually we may want to
+ // provide a default configuration here instead.
+ tracing::warn!("No libp2p configuration found, ignoring bootstrap nodes");
+ }
+ }
+
tracing::info!(
node_id = config.node_index,
stake_table = ?config.config.known_nodes_with_stake,
@@ -190,11 +210,12 @@ pub async fn init_node Some(b),
+ Some(L1Finalized::Number { number }) => {
+ Some(l1_client.wait_for_finalized_block(number).await)
+ }
+ None => None,
+ };
- let instance_state = NodeState::new(
- ChainConfig::default(),
+ let instance_state = NodeState {
+ chain_config: genesis.chain_config,
l1_client,
- Arc::new(StatePeers::::from_urls(network_params.state_peers)),
- );
+ genesis_header: genesis.header,
+ genesis_state: genesis_state.clone(),
+ l1_genesis,
+ peers: Arc::new(StatePeers::::from_urls(
+ network_params.state_peers,
+ network_params.catchup_backoff,
+ )),
+ node_id: node_index,
+ upgrades: Default::default(),
+ current_version: Ver::VERSION,
+ };
let stake_table_commit =
static_stake_table_commitment(&config.config.known_nodes_with_stake, STAKE_TABLE_CAPACITY);
@@ -265,7 +284,7 @@ pub async fn init_node,
P: SequencerPersistence,
Ver: StaticVersionType + 'static,
>(
@@ -305,7 +325,7 @@ pub async fn init_hotshot<
Vec>,
>,
instance_state: NodeState,
- networks: Networks>,
+ networks: Arc,
metrics: &dyn Metrics,
node_id: u64,
state_relay_server: Option,
@@ -348,9 +368,12 @@ pub async fn init_hotshot<
config,
memberships,
networks,
- HotShotInitializer::from_genesis(instance_state).unwrap(),
+ HotShotInitializer::from_genesis(instance_state)
+ .await
+ .unwrap(),
ConsensusMetricsValue::new(metrics),
da_storage,
+ TestAuctionResultsProvider::default(),
)
.await
.unwrap()
@@ -366,59 +389,63 @@ pub async fn init_hotshot<
(hotshot_handle, state_signer)
}
-impl
+impl, P: SequencerPersistence, Ver: StaticVersionType + 'static>
BuilderContext
{
/// Constructor
#[allow(clippy::too_many_arguments)]
pub async fn init(
- hotshot_handle: Consensus,
+ hotshot_handle: Arc>,
state_signer: StateSigner,
node_index: u64,
eth_key_pair: EthKeyPair,
bootstrapped_view: ViewNumber,
- channel_capacity: NonZeroUsize,
+ tx_channel_capacity: NonZeroUsize,
+ event_channel_capacity: NonZeroUsize,
instance_state: NodeState,
+ validated_state: ValidatedState,
hotshot_builder_api_url: Url,
max_api_timeout_duration: Duration,
buffered_view_num_count: usize,
- maximise_txns_count_timeout_duration: Duration,
- base_fee: u64,
+ maximize_txns_count_timeout_duration: Duration,
) -> anyhow::Result {
// tx channel
- let (tx_sender, tx_receiver) = broadcast::>(channel_capacity.get());
+ let (mut tx_sender, tx_receiver) =
+ broadcast::>>(tx_channel_capacity.get());
+ tx_sender.set_overflow(true);
// da channel
- let (da_sender, da_receiver) = broadcast::>(channel_capacity.get());
+ let (da_sender, da_receiver) =
+ broadcast::>(event_channel_capacity.get());
// qc channel
- let (qc_sender, qc_receiver) = broadcast::>(channel_capacity.get());
+ let (qc_sender, qc_receiver) =
+ broadcast::>(event_channel_capacity.get());
// decide channel
let (decide_sender, decide_receiver) =
- broadcast::>(channel_capacity.get());
+ broadcast::>(event_channel_capacity.get());
// builder api request channel
- let (req_sender, req_receiver) = broadcast::>(channel_capacity.get());
+ let (req_sender, req_receiver) =
+ broadcast::>(event_channel_capacity.get());
- // builder api response channel
- let (res_sender, res_receiver) = unbounded();
let (genesis_payload, genesis_ns_table) =
- Payload::from_transactions([], Arc::new(instance_state.clone()))
+ Payload::from_transactions([], &validated_state, &instance_state)
+ .await
.expect("genesis payload construction failed");
+
let builder_commitment = genesis_payload.builder_commitment(&genesis_ns_table);
+
let vid_commitment = {
// TODO we should not need to collect payload bytes just to compute vid_commitment
- let payload_bytes = genesis_payload
- .encode()
- .expect("unable to encode genesis payload");
+ let payload_bytes = genesis_payload.encode();
vid_commitment(&payload_bytes, GENESIS_VID_NUM_STORAGE_NODES)
};
// create the global state
let global_state: GlobalState = GlobalState::::new(
req_sender,
- res_receiver,
tx_sender.clone(),
vid_commitment,
bootstrapped_view,
@@ -437,22 +464,26 @@ impl::new(
- hotshot_builder_api_url.clone(),
- );
+ let builder_client = Client::<
+ hotshot_builder_api::builder::Error,
+ ::Base,
+ >::new(hotshot_builder_api_url.clone());
assert!(builder_client.connect(Some(Duration::from_secs(60))).await);
let seed = [207_u8; 32];
@@ -605,15 +634,16 @@ mod test {
)
.expect("Claim block signing failed");
+ let test_view_num = 0;
// test getting available blocks
tracing::info!(
- "block_info/availableblocks/{parent_commitment}/{hotshot_client_pub_key}/{encoded_signature}"
+ "block_info/availableblocks/{parent_commitment}/{test_view_num}/{hotshot_client_pub_key}/{encoded_signature}"
);
// sleep and wait for builder service to startup
async_sleep(Duration::from_millis(3000)).await;
let available_block_info = match builder_client
.get::>>(&format!(
- "block_info/availableblocks/{parent_commitment}/{hotshot_client_pub_key}/{encoded_signature}"
+ "block_info/availableblocks/{parent_commitment}/{test_view_num}/{hotshot_client_pub_key}/{encoded_signature}"
))
.send()
.await
@@ -640,7 +670,7 @@ mod test {
// Test claiming blocks
let _available_block_data = match builder_client
.get::>(&format!(
- "block_info/claimblock/{builder_commitment}/{hotshot_client_pub_key}/{encoded_signature}"
+ "block_info/claimblock/{builder_commitment}/{test_view_num}/{hotshot_client_pub_key}/{encoded_signature}"
))
.send()
.await
@@ -657,7 +687,7 @@ mod test {
// Test claiming block header input
let _available_block_header = match builder_client
.get::>(&format!(
- "block_info/claimheaderinput/{builder_commitment}/{hotshot_client_pub_key}/{encoded_signature}"
+ "block_info/claimheaderinput/{builder_commitment}/{test_view_num}/{hotshot_client_pub_key}/{encoded_signature}"
))
.send()
.await
@@ -686,7 +716,7 @@ mod test {
}
}
- let txn = Transaction::new(Default::default(), vec![1, 2, 3]);
+ let txn = Transaction::new(NamespaceId::from(1), vec![1, 2, 3]);
match builder_client
.post::<()>("txn_submit/submit")
.body_json(&txn)
diff --git a/contract-bindings/artifacts/LightClientMock_bytecode.json b/contract-bindings/artifacts/LightClientMock_bytecode.json
index 2cd2cc8b3..77a9f4778 100644
--- a/contract-bindings/artifacts/LightClientMock_bytecode.json
+++ b/contract-bindings/artifacts/LightClientMock_bytecode.json
@@ -1 +1 @@
-"0x60a0604052306080523480156200001557600080fd5b50604051620063ce380380620063ce83398101604081905262000038916200041b565b6200004262000056565b6200004e82826200010a565b5050620004ee565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000a75760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620001075780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b81516001600160401b03161515806200012f575060208201516001600160401b031615155b806200013d57506080820151155b806200014b575060a0820151155b8062000159575060c0820151155b8062000167575060e0820151155b8062000177575063ffffffff8116155b1562000196576040516350dd03f760e11b815260040160405180910390fd5b81600560008060049054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b0316021790555060208201518160000160086101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160010155606082015181600201556080820151816003015560a0820151816004015560c0820151816005015560e0820151816006015590505081600560008060089054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b0316021790555060208201518160000160086101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160010155606082015181600201556080820151816003015560a0820151816004015560c0820151816005015560e08201518160060155905050600080600c6101000a8154816001600160401b0302191690836001600160401b03160217905550806000806101000a81548163ffffffff021916908363ffffffff16021790555060006200038483620003a160201b60201c565b600181905560e09093015160028190556003939093555050600455565b60808082015160a083015160c0840151604080516020810194909452830191909152606082015260009101604051602081830303815290604052805190602001209050919050565b80516001600160401b03811681146200040157600080fd5b919050565b805163ffffffff811681146200040157600080fd5b6000808284036101208112156200043157600080fd5b610100808212156200044257600080fd5b60405191508082016001600160401b03811183821017156200047457634e487b7160e01b600052604160045260246000fd5b6040526200048285620003e9565b82526200049260208601620003e9565b602083015260408501516040830152606085015160608301526080850151608083015260a085015160a083015260c085015160c083015260e085015160e0830152819350620004e381860162000406565b925050509250929050565b608051615eb662000518600039600081816114d2015281816114fb01526116e90152615eb66000f3fe6080604052600436106101965760003560e01c8063715018a6116100e1578063a244d5961161008a578063bd32519a11610064578063bd32519a146106bf578063ca6fe85514610701578063f068205414610717578063f2fde38b1461074957600080fd5b8063a244d596146105e6578063aa92273214610606578063ad3cb1cc1461066957600080fd5b80637f17baad116100bb5780637f17baad146104df57806382d07ff3146105945780638da5cb5b146105a957600080fd5b8063715018a61461046a578063766718081461047f57806376b6b7cb146104c957600080fd5b8063409939b71161014357806352d1902d1161011d57806352d1902d1461042a578063628277331461043f57806369cc6a041461045557600080fd5b8063409939b7146103735780634847ae5d146103935780634f1ef2861461041757600080fd5b8063313df7b111610174578063313df7b1146102b1578063382b215a146102e95780633949d1e91461030d57600080fd5b8063013fa5fc1461019b5780630d8e6e2c146101bd578063202a0adb146101ef575b600080fd5b3480156101a757600080fd5b506101bb6101b6366004615587565b610769565b005b3480156101c957600080fd5b506040805160018152600060208201819052918101919091526060015b60405180910390f35b3480156101fb57600080fd5b506101bb61020a3660046156c9565b6000805463ffffffff600160401b9182900416825260056020818152604093849020855181549287015167ffffffffffffffff9081169095027fffffffffffffffffffffffffffffffff00000000000000000000000000000000909316941693909317178255918301516001820155606083015160028201556080830151600382015560a0830151600482015560c08301519181019190915560e090910151600690910155565b3480156102bd57600080fd5b506006546102d1906001600160a01b031681565b6040516001600160a01b0390911681526020016101e6565b3480156102f557600080fd5b506102ff60035481565b6040519081526020016101e6565b34801561031957600080fd5b506101bb6103283660046156e6565b6000805467ffffffffffffffff9092166c01000000000000000000000000027fffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffff909216919091179055565b34801561037f57600080fd5b506101bb61038e366004615750565b610881565b34801561039f57600080fd5b506103a8610bb9565b6040516101e6919060006101008201905067ffffffffffffffff8084511683528060208501511660208401525060408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015292915050565b6101bb610425366004615928565b610ca1565b34801561043657600080fd5b506102ff610cc0565b34801561044b57600080fd5b506102ff60025481565b34801561046157600080fd5b506101bb610cef565b34801561047657600080fd5b506101bb610da1565b34801561048b57600080fd5b506000546104b0906c01000000000000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016101e6565b3480156104d557600080fd5b506102ff60015481565b3480156104eb57600080fd5b5061054d6104fa3660046159e2565b6005602081905260009182526040909120805460018201546002830154600384015460048501549585015460069095015467ffffffffffffffff80861697600160401b9096041695939492939192919088565b6040805167ffffffffffffffff998a168152989097166020890152958701949094526060860192909252608085015260a084015260c083015260e0820152610100016101e6565b3480156105a057600080fd5b506103a8610db3565b3480156105b557600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166102d1565b3480156105f257600080fd5b506101bb6106013660046159fd565b610e98565b34801561061257600080fd5b506102ff6106213660046156c9565b60808082015160a083015160c0840151604080516020810194909452830191909152606082015260009101604051602081830303815290604052805190602001209050919050565b34801561067557600080fd5b506106b26040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516101e69190615a68565b3480156106cb57600080fd5b506006546106f19074010000000000000000000000000000000000000000900460ff1681565b60405190151581526020016101e6565b34801561070d57600080fd5b506102ff60045481565b34801561072357600080fd5b506000546107349063ffffffff1681565b60405163ffffffff90911681526020016101e6565b34801561075557600080fd5b506101bb610764366004615587565b611024565b61077161107b565b6001600160a01b0381166107b1576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006546001600160a01b03908116908216036107f9576040517fa863aec900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600680547fffffffffffffffffffffff000000000000000000000000000000000000000000166001600160a01b0383811691909117740100000000000000000000000000000000000000001791829055604051911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072906020015b60405180910390a150565b60065474010000000000000000000000000000000000000000900460ff1680156108b657506006546001600160a01b03163314155b1561092f576006546001600160a01b03166108fd576040517f25cda3ce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fa3a6478000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610937610db3565b51825167ffffffffffffffff91821691161115806109785750610958610db3565b6020015167ffffffffffffffff16826020015167ffffffffffffffff1611155b156109af576040517f051c46ef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080546109de9063ffffffff8116906c01000000000000000000000000900467ffffffffffffffff16615ab1565b6000805463ffffffff600160401b918290041682526005602052604090912054919250900467ffffffffffffffff90811690821614801581610a3757508167ffffffffffffffff16846020015167ffffffffffffffff16115b15610a7f576040517f1b2335f800000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024015b60405180910390fd5b610a8c84604001516110ef565b610a9984606001516110ef565b610aa684608001516110ef565b610ab38460a001516110ef565b610ac08460c001516110ef565b8015610ace57610ace61115f565b610ad884846112bc565b6000805463ffffffff600160401b9182900416825260056020818152604093849020885181548a84015167ffffffffffffffff9081169687027fffffffffffffffffffffffffffffffff000000000000000000000000000000009092169216918217178255898601516001830181905560608b0151600284015560808b0151600384015560a08b0151600484015560c08b01519483019490945560e08a015160069092019190915593519182529192917fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6910160405180910390a350505050565b610c15604051806101000160405280600067ffffffffffffffff168152602001600067ffffffffffffffff1681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5060008054640100000000900463ffffffff16815260056020818152604092839020835161010081018552815467ffffffffffffffff8082168352600160401b90910416928101929092526001810154938201939093526002830154606082015260038301546080820152600483015460a08201529082015460c082015260069091015460e082015290565b610ca96114c7565b610cb282611597565b610cbc82826115d8565b5050565b6000610cca6116de565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610cf761107b565b60065474010000000000000000000000000000000000000000900460ff1615610d6d57600680547fffffffffffffffffffffff0000000000000000000000000000000000000000001690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c0245090600090a1565b6040517fa863aec900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b610da961107b565b610d9f6000611740565b610e0f604051806101000160405280600067ffffffffffffffff168152602001600067ffffffffffffffff1681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b506000805463ffffffff600160401b9182900416825260056020818152604093849020845161010081018652815467ffffffffffffffff8082168352959004909416918401919091526001810154938301939093526002830154606083015260038301546080830152600483015460a083015282015460c082015260069091015460e082015290565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff16600081158015610ede5750825b905060008267ffffffffffffffff166001148015610efb5750303b155b905081158015610f09575080155b15610f40576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011785558315610f8657845468ff00000000000000001916600160401b1785555b610f8f866117c9565b610f976117da565b600080547fffffffffffffffffffffffffffffffffffffffff0000000000000000ffffffff16600160401b179055610fcf88886117e2565b831561101a57845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b61102c61107b565b6001600160a01b03811661106f576040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260006004820152602401610a76565b61107881611740565b50565b336110ad7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610d9f576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610a76565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001811080610cbc5760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606401610a76565b60008054600160401b80820463ffffffff16808452600560208181526040808720815161010081018352815467ffffffffffffffff808216835297900487168185015260018083015482850152600280840154606080850191909152600380860154608080870182905260048089015460a08901819052898d015460c08a018190526006909a01805460e0909a01999099528a51808d0194909452838b015282850198909852885180830390940184520190965280519087012085548355948590558354905595895293909252915490559390929091600c916112549185916c01000000000000000000000000900416615ad5565b82546101009290920a67ffffffffffffffff8181021990931691831602179091556000546040516c0100000000000000000000000090910490911681527fdb3558259e039d7e50e816b9dcce30fb114d8a9c86eca5ab14b60194d6945d3f9150602001610876565b60006112c6611ad2565b60408051600880825261012082019092529192506000919060208201610100803683370190505090506002548160008151811061130557611305615af6565b602002602001018181525050836000015167ffffffffffffffff168160018151811061133357611333615af6565b602002602001018181525050836020015167ffffffffffffffff168160028151811061136157611361615af6565b60200260200101818152505083604001518160038151811061138557611385615af6565b6020026020010181815250508360600151816004815181106113a9576113a9615af6565b60209081029190910181019190915260008054600160401b900463ffffffff168152600591829052604090206003015482519091839181106113ed576113ed615af6565b60209081029190910181019190915260008054600160401b900463ffffffff1681526005909152604090206004015481518290600690811061143157611431615af6565b60209081029190910181019190915260008054600160401b900463ffffffff16815260059182905260409020015481518290600790811061147457611474615af6565b60200260200101818152505061148b8282856120b3565b6114c1576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061156057507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166115547f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b15610d9f576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61159f61107b565b6040516001600160a01b03821681527ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d90602001610876565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611632575060408051601f3d908101601f1916820190925261162f91810190615b0c565b60015b611673576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610a76565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146116cf576040517faa1d49a400000000000000000000000000000000000000000000000000000000815260048101829052602401610a76565b6116d9838361219e565b505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610d9f576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080547fffffffffffffffffffffffff000000000000000000000000000000000000000081166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6117d16121f4565b61107881612256565b610d9f6121f4565b815167ffffffffffffffff161515806118085750602082015167ffffffffffffffff1615155b8061181557506080820151155b80611822575060a0820151155b8061182f575060c0820151155b8061183c575060e0820151155b8061184b575063ffffffff8116155b15611882576040517fa1ba07ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600560008060049054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060208201518160000160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010155606082015181600201556080820151816003015560a0820151816004015560c0820151816005015560e0820151816006015590505081600560008060089054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060208201518160000160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010155606082015181600201556080820151816003015560a0820151816004015560c0820151816005015560e08201518160060155905050600080600c6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550806000806101000a81548163ffffffff021916908363ffffffff1602179055506000611ab58360808082015160a083015160c0840151604080516020810194909452830191909152606082015260009101604051602081830303815290604052805190602001209050919050565b600181905560e09093015160028190556003939093555050600455565b611ada615263565b620100008152600860208201527f013d1d4b425179258b577860397955cbfa0816e32b1c25a1fd734c91b951ee816040820151527f16b88dc7439a6d841e1a1103f5a3d2d2440137f18d02763503bac7b45dcb983b6020604083015101527f0c3c864f195f59119927f53857f1de8bf575941748b735351fd31373c7875c2d6060820151527f169ba15107f2eff9b9341bf30742a838d27dbd69e88b2353dca8592f15f1111c6020606083015101527f11d4ceb15961d10b6156ae3d09bb78b4df45fb8543060884e7d400755beb4ac86080820151527f0326ff06391ed5d26ec1bc080b8d46014ee22c0c68ed022f1620c4d9d38437d36020608083015101527f23610cb43e21033c368a93622dd405b905a0eb344c98b9d7cf08b0c5ebf7c83960a0820151527e1379342a4d77d4708743aff01ff27aa11917478fdc8e2b7d463081735772ea602060a083015101527f194daf85d9eed9937b28e2a680fcc5a76922c15cd31dc4f600e14939b8200ce760c0820151527f25280b124624911c7f87b4c2d87f59c6c07e3eeeb10d614da216f6219ffe50b6602060c083015101527f04882ef39899ea38c9677a48b8f8cc6a67284e17ff940289faaa359eec9b33a660e0820151527f1bae9f36e6190738c711501be53f299bf61348e61e2ef9d577760e64f629368d602060e083015101527f2d810d30120cb93e1a254b89ed0ae86c761f49b4f129459cd534f9551851350f610100820151527f0b25394da5a1d435daccc2eadd039e2c2709f5f42fabd9afba815ed62d6af36b602061010083015101527f1c2ce7be570bea9e43f3d3d7cbca84bdb4fc89b53ae657531de72670a6105e08610120820151527f1a0255ec8c7c8769335bc9dc6b222ac6a04e766d08b45c8cc573592c05bc9c14602061012083015101527f1c164159136b8f5b4773e133f483a8a192ab15d6d3ee012f171b3d02fd4506e7610140820151527f272eb7d633cedb68ce0113f4420ab5610b81b8ba1ab9348db15761d40e8df5ba602061014083015101527f0e446639aa6caf25e93ef747084e39b8ea90abf23bb48c28fd5f9ba7ba655022610160820151527f033e195a9ea3a9ce40b72b673afb45444ca1b15f0543f44d10f5c640a780676f602061016083015101527f0e8db2b2893df23d3c55f0b3a3b54ab2e2ed775b31c4c90e472eb31582582df2610180820151527f0f4c69895451af15052aa81a03eba9752c9e7891dd08e264e0bd593d0357858e602061018083015101527f2bc091fefe2416ec83c6fba8fb82fb48cb9ca00182ec792c212bf5532958c8f76101a0820151527f1f4dcf4dd484e3ab1ae487603d2245397ac78fe6ca7584645eba3926d383902b60206101a083015101527f2daf78c5a2829a9418081dd7e8743a683ed6817996f75f10009d99220793ec736101c0820151527f19eb12a7827c0ddf6383fe806c3953bd06b08aae7bf2a01f55c986a84f50cc2860206101c083015101527f015691308846e68ea856a2cb24c9903f0c8605dea190829180ff6bdd1c6508036101e0820151527f1ffd789b155b8acb13e0f6a48b50f7aa8092540888d009141057d4569091582460206101e083015101527f0545ac7aa66dcf3719988438c806fc624de57ab43f8580392f88c86c1378ce4a610200820151527f16b7f250842ecf4e3690706a1e152d7a57f70f556f92076da785fdd363c19fcf602061020083015101527f20cb7ff35a83a7dc314036e470f14c30fb0e98d35d663b243b222caa6fc7db44610220820151527f149f415744707468bdaa4e8545201ab40d1931a7d31f23768fa7c65574ee3eab602061022083015101527f0a25c1b7573906dc4e193b4ea82fd1fe7ccebc4d925dad26f0ff09c84c9f1a75610240820151527f0a521ff30c8f3666798f847c5d4c379658fba10156e7a9499f2713fae9bf2be1602061024083015101527f03db6510c3f13629fded9a5a2d41654bbce4ef6d024cad53100051d4a3f3ebc9610260820151527f08e80a5c8e4c9b9f26f3003cc59403a18d3136afd030868d25cc8b807e2ab3706020610260830151015290565b60006120be8261225e565b6120e1836000815181106120d4576120d4615af6565b60200260200101516110ef565b6120f7836001815181106120d4576120d4615af6565b61210d836002815181106120d4576120d4615af6565b612123836003815181106120d4576120d4615af6565b612139836004815181106120d4576120d4615af6565b61214f836005815181106120d4576120d4615af6565b612165836006815181106120d4576120d4615af6565b61217b836007815181106120d4576120d4615af6565b6000612188858585612396565b905061219381612517565b9150505b9392505050565b6121a7826129df565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156121ec576116d98282612a87565b610cbc612aff565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610d9f576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61102c6121f4565b805161226990612b37565b6122768160200151612b37565b6122838160400151612b37565b6122908160600151612b37565b61229d8160800151612b37565b6122aa8160a00151612b37565b6122b78160c00151612b37565b6122c48160e00151612b37565b6122d2816101000151612b37565b6122e0816101200151612b37565b6122ee816101400151612b37565b6122fc816101600151612b37565b61230a816101800151612b37565b612318816101a001516110ef565b612326816101c001516110ef565b612334816101e001516110ef565b6123428161020001516110ef565b6123508161022001516110ef565b61235e8161024001516110ef565b61236c8161026001516110ef565b61237a8161028001516110ef565b612388816102a001516110ef565b611078816102c001516110ef565b61239e6154e1565b83602001518351146123dc576040517f41f53b1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006123e9858585612be1565b905060006123fa8660000151612f12565b9050600061240d828460a00151886132f6565b60408051601e8082526103e0820190925291925060009190602082016103c080368337505060408051601e8082526103e082019092529293506000929150602082015b604080518082019091526000808252602082015281526020019060019003908161245057905050905060006124898a858a898787613356565b60a08701516060870151919250907f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600081838509604080516101008101825260e09c8d0151815260208101969096528501525050506060810191909152608081019290925260a082015261016086015160c082015261018090950151928501929092525091949350505050565b6040805180820182526000808252602080830182905283518085018552828152908101829052835160028082526060820190955291937f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001939285918160200160208202803683375050604080516002808252606082019092529293506000929150602082015b604080518082019091526000808252602082015281526020019060019003908161259d57905050905060006001905080836000815181106125e0576125e0615af6565b6020026020010181815250508760c001518260008151811061260457612604615af6565b602002602001018190525087600001518360018151811061262757612627615af6565b6020026020010181815250508760e001518260018151811061264b5761264b615af6565b6020026020010181905250612660828461338b565b608089015151909550606093508392509050600061267f826002615b25565b61268a906001615b25565b90508067ffffffffffffffff8111156126a5576126a56155a2565b6040519080825280602002602001820160405280156126ce578160200160208202803683370190505b5093508067ffffffffffffffff8111156126ea576126ea6155a2565b60405190808252806020026020018201604052801561272f57816020015b60408051808201909152600080825260208201528152602001906001900390816127085790505b509250505060008060005b8960800151518110156127d3578960800151818151811061275d5761275d615af6565b602002602001015185838151811061277757612777615af6565b6020026020010181815250508960a00151818151811061279957612799615af6565b60200260200101518483815181106127b3576127b3615af6565b60209081029190910101526127c9600183615b25565b915060010161273a565b5088602001518482815181106127eb576127eb615af6565b6020026020010181815250508860c0015183828151811061280e5761280e615af6565b6020908102919091010152612824600182615b25565b895160408b01519192509060008982840990508087858151811061284a5761284a615af6565b6020026020010181815250505050508860e0015183828151811061287057612870615af6565b6020908102919091010152612886600182615b25565b60608a01519091508781840892505061289e82613485565b8482815181106128b0576128b0615af6565b6020026020010181815250506128e8604080518082018252600080825260209182015281518083019092526001825260029082015290565b8382815181106128fa576128fa615af6565b6020026020010181905250612917612912848661338b565b6134db565b945050505050600060405180608001604052807f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b081526020017f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c181526020017f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e5581526020017f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe481525090506129d58382846129d061357a565b61364b565b9695505050505050565b806001600160a01b03163b600003612a2e576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610a76565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6060600080846001600160a01b031684604051612aa49190615b38565b600060405180830381855af49150503d8060008114612adf576040519150601f19603f3d011682016040523d82523d6000602084013e612ae4565b606091505b5091509150612af485838361372f565b925050505b92915050565b3415610d9f576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160208201516000917f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47911590151615612b7157505050565b8251602084015182600384858586098509088382830914838210848410161693505050816116d95760405162461bcd60e51b815260206004820152601760248201527f426e3235343a20696e76616c696420473120706f696e740000000000000000006044820152606401610a76565b612c2960405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040805180820190915260608152600060208201527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001612c6a8287876137a4565b81518451612c7790613b85565b612c848660200151613b85565b612c918760400151613b85565b612c9e8860600151613b85565b612cab8960800151613b85565b604051602001612cc096959493929190615b54565b60408051601f198184030181529190528252612cdb82613c48565b50612ce582613c48565b6060840152612cf382613c48565b6080840152815160a0850151612d0890613b85565b604051602001612d19929190615bd3565b60408051601f198184030181529190528252612d3482613c48565b8352815160c0850151612d4690613b85565b612d538660e00151613b85565b612d61876101000151613b85565b612d6f886101200151613b85565b612d7d896101400151613b85565b604051602001612d9296959493929190615b54565b60408051601f198184030181529190528252612dad82613c48565b60a084015281516101a0850151612dc390613cbc565b612dd1866101c00151613cbc565b612ddf876101e00151613cbc565b612ded886102000151613cbc565b612dfb896102200151613cbc565b604051602001612e1096959493929190615c02565b60408051601f19818403018152919052808352610240850151612e3290613cbc565b612e40866102600151613cbc565b612e4e876102800151613cbc565b612e5c886102a00151613cbc565b612e6a896102c00151613cbc565b604051602001612e7f96959493929190615c02565b60408051601f198184030181529190528252612e9a82613c48565b60c08401528151610160850151612eb090613b85565b612ebe866101800151613b85565b604051602001612ed093929190615c3e565b60408051601f198184030181529190528252612eeb82613c48565b60e08401528251818180098282820960208601919091526040850152509195945050505050565b612f446040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b816201000003612fd857506040805160a0810182526010815260208101929092527f30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c1001908201527eeeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b760608201527f0b5d56b77fe704e8e92338c0082f37e091126414c830e4c6922d5ac802d842d4608082015290565b81620200000361306d57506040805160a0810182526011815260208101929092527f30643640b9f82f90e83b698e5ea6179c7c05542e859533b48b9953a2f5360801908201527f1bf82deba7d74902c3708cc6e70e61f30512eca95655210e276e5858ce8f58e560608201527f244cf010c43ca87237d8b00bf9dd50c4c01c7f086bd4e8c920e75251d96f0d22608082015290565b81620400000361310257506040805160a0810182526012815260208101929092527f30644259cd94e7dd5045d7a27013b7fcd21c9e3b7fa75222e7bda49b729b0401908201527f19ddbcaf3a8d46c15c0176fbb5b95e4dc57088ff13f4d1bd84c6bfa57dcdc0e060608201527f036853f083780e87f8d7c71d111119c57dbe118c22d5ad707a82317466c5174c608082015290565b81620800000361319757506040805160a0810182526013815260208101929092527f3064486657634403844b0eac78ca882cfd284341fcb0615a15cfcd17b14d8201908201527f2260e724844bca5251829353968e4915305258418357473a5c1d597f613f6cbd60608201527f06e402c0a314fb67a15cf806664ae1b722dbc0efe66e6c81d98f9924ca535321608082015290565b81621000000361322c57506040805160a0810182526014815260208101929092527f30644b6c9c4a72169e4daa317d25f04512ae15c53b34e8f5acd8e155d0a6c101908201527f26125da10a0ed06327508aba06d1e303ac616632dbed349f53422da95333785760608201527f100c332d2100895fab6473bc2c51bfca521f45cb3baca6260852a8fde26c91f3608082015290565b816020036132bf57506040805160a0810182526005815260208101929092527f2ee12bff4a2813286a8dc388cd754d9a3ef2490635eba50cb9c2e5e750800001908201527f09c532c6306b93d29678200d47c0b2a99c18d51b838eeb1d3eed4c533bb512d060608201527f2724713603bfbd790aeaf3e7df25d8e7ef8f311334905b4d8c99980cf210979d608082015290565b6040517fe2ef09e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b61331a60405180606001604052806000815260200160008152602001600081525090565b6133248484613e08565b8082526133349085908590613e6e565b6020820152805161334a90859084908690613ef4565b60408201529392505050565b6000806133648587896140bb565b90506133748886898988886141bd565b61337f8187866144db565b98975050505050505050565b604080518082019091526000808252602082015282518251146133f05760405162461bcd60e51b815260206004820181905260248201527f4d534d206572726f723a206c656e67746820646f6573206e6f74206d617463686044820152606401610a76565b61342e8360008151811061340657613406615af6565b60200260200101518360008151811061342157613421615af6565b602002602001015161453d565b905060015b825181101561347e576134748261346f86848151811061345557613455615af6565b602002602001015186858151811061342157613421615af6565b6145e1565b9150600101613433565b5092915050565b60006134b17f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183615c97565b612af9907f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001615cb9565b6040805180820190915260008082526020820152815160208301511590151615613503575090565b6040518060400160405280836000015181526020017f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4784602001516135489190615c97565b613572907f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47615cb9565b905292915050565b6135a56040518060800160405280600081526020016000815260200160008152602001600081525090565b60405180608001604052807f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81526020017f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281526020017f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa81526020017f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b815250905090565b60008060006040518751815260208801516020820152602087015160408201528651606082015260608701516080820152604087015160a0820152855160c0820152602086015160e08201526020850151610100820152845161012082015260608501516101408201526040850151610160820152602060006101808360085afa9150506000519150806137215760405162461bcd60e51b815260206004820152601c60248201527f426e3235343a2050616972696e6720636865636b206661696c656421000000006044820152606401610a76565b50151590505b949350505050565b6060826137445761373f82614688565b612197565b815115801561375b57506001600160a01b0384163b155b1561379d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610a76565b5080612197565b825160fe906137df6137b583613cbc565b6040516020016137c791815260200190565b604051602081830303815290604052600060046146ca565b6138196137ef8660000151613cbc565b60405160200161380191815260200190565b604051602081830303815290604052600060086146ca565b6138296137ef8760200151613cbc565b60405160200161383c9493929190615ccc565b60408051601f198184030181529190528085526138596001613cbc565b6138827f2f8dd1f1a7583c42c4e12a44e110404c73ca6c94813f85835da4fb7bb1301d4a613cbc565b6138ab7f1ee678a0470a75a6eaa8fe837060498ba828a3703b311d0f77f010424afeb025613cbc565b6138d47f2042a587a90c187b0a087c03e29c968b950b1db26d5c82d666905a6895790c0a613cbc565b6138fd7f2e2b91456103698adf57b799969dea1c8f739da5d8d40dd3eb9222db7c81e881613cbc565b60405160200161391296959493929190615c02565b60408051601f1981840301815291905280855260e084015161393390613b85565b613941856101000151613b85565b61394f866101200151613b85565b61395d876101400151613b85565b61396b886101600151613b85565b613979896101800151613b85565b6139878a6101e00151613b85565b60405160200161399e989796959493929190615d23565b60408051601f198184030181529190528085526102008401516139c090613b85565b6139ce856102200151613b85565b6139dc866102400151613b85565b6139ea876101a00151613b85565b6139f8886101c00151613b85565b613a06896102600151613b85565b604051602001613a1c9796959493929190615dc8565b60408051601f19818403018152918152818652840151613a3b90613b85565b613a488560600151613b85565b613a558660800151613b85565b613a628760a00151613b85565b613a6f8860c00151613b85565b604051602001613a8496959493929190615b54565b60408051601f198184030181529190528085528251613abb908490600090613aae57613aae615af6565b6020026020010151613cbc565b613ad184600181518110613aae57613aae615af6565b613ae785600281518110613aae57613aae615af6565b613afd86600381518110613aae57613aae615af6565b613b1387600481518110613aae57613aae615af6565b613b2988600581518110613aae57613aae615af6565b613b3f89600681518110613aae57613aae615af6565b613b558a600781518110613aae57613aae615af6565b604051602001613b6d99989796959493929190615e5a565b60408051601f19818403018152919052909352505050565b805160208201516060916000911590151615613bbe577f4000000000000000000000000000000000000000000000000000000000000000175b60208301517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760019190911b10613c1257507f80000000000000000000000000000000000000000000000000000000000000005b8251613c1f908217613cbc565b604051602001613c3191815260200190565b604051602081830303815290604052915050919050565b602080820151825180516040518381526000948594939291908101855b83811015613c7f5760208186018101518383015201613c65565b505060209182019020908601819052925060006129d57f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185615c97565b60008190506008817eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff16901b6008827fff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff0016901c1790506010817dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff16901b6010827fffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff000016901c1790506020817bffffffff00000000ffffffff00000000ffffffff00000000ffffffff16901b6020827fffffffff00000000ffffffff00000000ffffffff00000000ffffffff0000000016901c17905060408177ffffffffffffffff0000000000000000ffffffffffffffff16901b6040827fffffffffffffffff0000000000000000ffffffffffffffff000000000000000016901c179050608081901b608082901c179050919050565b81516000907f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190838015613e5e5784935060005b82811015613e5257838586099450600101613e3c565b50600184039350613e65565b6001830393505b50505092915050565b600082600103613e8057506001612197565b81600003613e9057506000612197565b60408401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190600090828186099050858015613ed257600187039250613ed9565b6001840392505b50613ee3826147f2565b915082828209979650505050505050565b82516000907f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190838303613f8757600160005b82811015613f7a57818703613f5b57878181518110613f4857613f48615af6565b6020026020010151945050505050613727565b8380613f6957613f69615c81565b896060015183099150600101613f27565b5060009350505050613727565b6000806000808a604001519050600080613fa18d886148aa565b905060008767ffffffffffffffff811115613fbe57613fbe6155a2565b604051908082528060200260200182016040528015613fe7578160200160208202803683370190505b509050888b850993506001925060005b8881101561402c57602081026020840101519550898d878c030896508987850960208281028401018890529350600101613ff7565b50614036836147f2565b925060005b888110156140a95760208102602084010151955089868609975089848909975060005b8981101561408857808214614080576020810260208401015197508a888a0998505b60010161405e565b506020810260208f010151955089868909975089888c089a5060010161403b565b50505050505050505050949350505050565b6000807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019050600083602001519050600084604001519050600060019050606088015160808901516101a08901516102408a01518788898387098a868608088609945050506101c08901516102608a01518788898387098a868608088609945050506101e08901516102808a01518788898387098a868608088609945050506102008901516102a08a01518788898387098a8686080886099450505061022089015191506102c0890151868782898587080985099350505050875160208901518586868309870385089650508485838309860387089998505050505050505050565b6141cb86868686858761499b565b60c085015182517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019190819081908690601490811061420c5761420c615af6565b60200260200101818152505085600001518460148151811061423057614230615af6565b6020026020010181905250828282099050808560158151811061425557614255615af6565b60200260200101818152505085602001518460158151811061427957614279615af6565b6020026020010181905250828282099050808560168151811061429e5761429e615af6565b6020026020010181815250508560400151846016815181106142c2576142c2615af6565b602002602001018190525082828209905080856017815181106142e7576142e7615af6565b60200260200101818152505085606001518460178151811061430b5761430b615af6565b6020026020010181905250828282099050808560188151811061433057614330615af6565b60200260200101818152505085608001518460188151811061435457614354615af6565b6020026020010181905250828282099050808560198151811061437957614379615af6565b60200260200101818152505088604001518460198151811061439d5761439d615af6565b60200260200101819052508282820990508085601a815181106143c2576143c2615af6565b602002602001018181525050886060015184601a815181106143e6576143e6615af6565b60200260200101819052508282820990508085601b8151811061440b5761440b615af6565b602002602001018181525050886080015184601b8151811061442f5761442f615af6565b60200260200101819052508282820990508085601c8151811061445457614454615af6565b6020026020010181815250508860a0015184601c8151811061447857614478615af6565b60200260200101819052508282820990508760e0015185601d815181106144a1576144a1615af6565b6020026020010181815250508560a0015184601d815181106144c5576144c5615af6565b6020026020010181905250505050505050505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018381039060005b600a8110156145345760206015820102840151602082026101a0018601518384828409860894505050600101614503565b50509392505050565b6040805180820190915260008082526020820152614559615534565b835181526020808501519082015260408101839052600060608360808460076107d05a03fa9050808061458b57600080fd5b50806145d95760405162461bcd60e51b815260206004820152601960248201527f426e3235343a207363616c6172206d756c206661696c656421000000000000006044820152606401610a76565b505092915050565b60408051808201909152600080825260208201526145fd615552565b8351815260208085015181830152835160408301528301516060808301919091526000908360c08460066107d05a03fa9050808061463a57600080fd5b50806145d95760405162461bcd60e51b815260206004820152601d60248201527f426e3235343a2067726f7570206164646974696f6e206661696c6564210000006044820152606401610a76565b8051156146985780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060816146d881601f615b25565b10156147265760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610a76565b6147308284615b25565b845110156147805760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610a76565b60608215801561479f57604051915060008252602082016040526147e9565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156147d85780518352602092830192016147c0565b5050858452601f01601f1916604052505b50949350505050565b60008060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001905060405160208152602080820152602060408201528460608201526002820360808201528160a08201526020600060c08360055afa9250506000519250816148a35760405162461bcd60e51b815260206004820152601d60248201527f426e3235343a20706f7720707265636f6d70696c65206661696c6564210000006044820152606401610a76565b5050919050565b606082602001518211156148ea576040517f8c5e11f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606083015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018467ffffffffffffffff81111561492b5761492b6155a2565b604051908082528060200260200182016040528015614954578160200160208202803683370190505b50935084151915613e655760208401856020028101600182526020820191505b8082101561499057828585099350838252602082019150614974565b505050505092915050565b6000806000806000807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190508060208b015160208d01510995508a5193508060a08c015160608d0151099250806101a08a0151840891508060808c015183089150808483099350807f2f8dd1f1a7583c42c4e12a44e110404c73ca6c94813f85835da4fb7bb1301d4a84099150806101c08a0151830891508060808c015183089150808483099350807f1ee678a0470a75a6eaa8fe837060498ba828a3703b311d0f77f010424afeb02584099150806101e08a0151830891508060808c015183089150808483099350807f2042a587a90c187b0a087c03e29c968b950b1db26d5c82d666905a6895790c0a84099150806102008a0151830891508060808c015183089150808483099350807f2e2b91456103698adf57b799969dea1c8f739da5d8d40dd3eb9222db7c81e88184099150806102208a0151830891508060808c0151830891508084830993508084870895508860a0015188600081518110614b2457614b24615af6565b60200260200101819052508587600081518110614b4357614b43615af6565b6020026020010181815250508060608c01518c51099450806102c08a015186099450806102408a015160608d0151099250806101a08a0151840892508060808c015184089250808386099450806102608a015160608d0151099250806101c08a0151840892508060808c015184089250808386099450806102808a015160608d0151099250806101e08a0151840892508060808c015184089250808386099450806102a08a015160608d0151099250806102008a0151840892508060808c0151840892508083860994508b60c0015188600181518110614c2557614c25615af6565b6020908102919091010152614c3a8582615cb9565b87600181518110614c4d57614c4d615af6565b602002602001018181525050886101a0015187600281518110614c7257614c72615af6565b602002602001018181525050886101c0015187600381518110614c9757614c97615af6565b602002602001018181525050886101e0015187600481518110614cbc57614cbc615af6565b60200260200101818152505088610200015187600581518110614ce157614ce1615af6565b6020026020010181815250508b60e0015188600281518110614d0557614d05615af6565b60200260200101819052508b610100015188600381518110614d2957614d29615af6565b60200260200101819052508b610120015188600481518110614d4d57614d4d615af6565b60200260200101819052508b610140015188600581518110614d7157614d71615af6565b6020026020010181905250806101c08a01516101a08b01510992508287600681518110614da057614da0615af6565b6020026020010181815250508b610160015188600681518110614dc557614dc5615af6565b6020026020010181905250806102008a01516101e08b01510992508287600781518110614df457614df4615af6565b6020026020010181815250508b610180015188600781518110614e1957614e19615af6565b60200260200101819052506101a089015192508083840991508082830991508082840992508287600881518110614e5257614e52615af6565b6020026020010181815250508b6101e0015188600881518110614e7757614e77615af6565b60200260200101819052506101c089015192508083840991508082830991508082840992508287600981518110614eb057614eb0615af6565b6020026020010181815250508b610200015188600981518110614ed557614ed5615af6565b60200260200101819052506101e089015192508083840991508082830991508082840992508287600a81518110614f0e57614f0e615af6565b6020026020010181815250508b610220015188600a81518110614f3357614f33615af6565b602002602001018190525061020089015192508083840991508082830991508082840992508287600b81518110614f6c57614f6c615af6565b6020026020010181815250508b610240015188600b81518110614f9157614f91615af6565b602002602001018190525088610220015181614fad9190615cb9565b87600c81518110614fc057614fc0615af6565b6020026020010181815250508b6101a0015188600c81518110614fe557614fe5615af6565b6020026020010181905250600187600d8151811061500557615005615af6565b6020026020010181815250508b6101c0015188600d8151811061502a5761502a615af6565b6020026020010181905250806101c08a01516101a08b0151099250806101e08a015184099250806102008a015184099250806102208a0151840992508287600e8151811061507a5761507a615af6565b6020026020010181815250508b610260015188600e8151811061509f5761509f615af6565b602090810291909101015289516150b69082615cb9565b87600f815181106150c9576150c9615af6565b6020026020010181815250508860c0015188600f815181106150ed576150ed615af6565b60200260200101819052508060018b510860a08c015190935081908009915080828409925080836020601002890151099150818760108151811061513357615133615af6565b6020026020010181815250508860e001518860108151811061515757615157615af6565b602002602001018190525080836020601102890151099150818760118151811061518357615183615af6565b602002602001018181525050886101000151886011815181106151a8576151a8615af6565b60200260200101819052508083602060120289015109915081876012815181106151d4576151d4615af6565b602002602001018181525050886101200151886012815181106151f9576151f9615af6565b602002602001018190525080836020601302890151099150818760138151811061522557615225615af6565b6020026020010181815250508861014001518860138151811061524a5761524a615af6565b6020026020010181905250505050505050505050505050565b604051806102800160405280600081526020016000815260200161529a604051806040016040528060008152602001600081525090565b81526020016152bc604051806040016040528060008152602001600081525090565b81526020016152de604051806040016040528060008152602001600081525090565b8152602001615300604051806040016040528060008152602001600081525090565b8152602001615322604051806040016040528060008152602001600081525090565b8152602001615344604051806040016040528060008152602001600081525090565b8152602001615366604051806040016040528060008152602001600081525090565b8152602001615388604051806040016040528060008152602001600081525090565b81526020016153aa604051806040016040528060008152602001600081525090565b81526020016153cc604051806040016040528060008152602001600081525090565b81526020016153ee604051806040016040528060008152602001600081525090565b8152602001615410604051806040016040528060008152602001600081525090565b8152602001615432604051806040016040528060008152602001600081525090565b8152602001615454604051806040016040528060008152602001600081525090565b8152602001615476604051806040016040528060008152602001600081525090565b8152602001615498604051806040016040528060008152602001600081525090565b81526020016154ba604051806040016040528060008152602001600081525090565b81526020016154dc604051806040016040528060008152602001600081525090565b905290565b6040518061010001604052806000815260200160008152602001600081526020016000815260200160608152602001606081526020016154ba604051806040016040528060008152602001600081525090565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b80356001600160a01b03811681146132f157600080fd5b60006020828403121561559957600080fd5b61219782615570565b634e487b7160e01b600052604160045260246000fd5b6040516102e0810167ffffffffffffffff811182821017156155dc576155dc6155a2565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561560b5761560b6155a2565b604052919050565b803567ffffffffffffffff811681146132f157600080fd5b600061010080838503121561563f57600080fd5b6040519081019067ffffffffffffffff82118183101715615662576156626155a2565b8160405280925061567284615613565b815261568060208501615613565b602082015260408401356040820152606084013560608201526080840135608082015260a084013560a082015260c084013560c082015260e084013560e0820152505092915050565b600061010082840312156156dc57600080fd5b612197838361562b565b6000602082840312156156f857600080fd5b61219782615613565b60006040828403121561571357600080fd5b6040516040810181811067ffffffffffffffff82111715615736576157366155a2565b604052823581526020928301359281019290925250919050565b60008082840361058081121561576557600080fd5b61576f858561562b565b9250610100610480807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00840112156157a657600080fd5b6157ae6155b8565b92506157bc87838801615701565b83526101406157cd88828901615701565b60208501526101806157e189828a01615701565b60408601526101c06157f58a828b01615701565b60608701526102006158098b828c01615701565b608088015261024061581d8c828d01615701565b60a08901526102806158318d828e01615701565b60c08a01526102c06158458e828f01615701565b60e08b01526158588e6103008f01615701565b898b015261586a8e6103408f01615701565b6101208b015261587e8e6103808f01615701565b878b01526158908e6103c08f01615701565b6101608b01526158a48e6104008f01615701565b868b01526104408d01356101a08b01526104608d0135858b0152878d01356101e08b01526104a08d0135848b01526104c08d01356102208b01526104e08d0135838b01526105008d01356102608b01526105208d0135828b01526105408d01356102a08b01526105608d0135818b0152505050505050505050809150509250929050565b6000806040838503121561593b57600080fd5b61594483615570565b915060208084013567ffffffffffffffff8082111561596257600080fd5b818601915086601f83011261597657600080fd5b813581811115615988576159886155a2565b61599a84601f19601f840116016155e2565b915080825287848285010111156159b057600080fd5b80848401858401376000848284010152508093505050509250929050565b803563ffffffff811681146132f157600080fd5b6000602082840312156159f457600080fd5b612197826159ce565b60008060006101408486031215615a1357600080fd5b615a1d858561562b565b9250615a2c61010085016159ce565b9150615a3b6101208501615570565b90509250925092565b60005b83811015615a5f578181015183820152602001615a47565b50506000910152565b6020815260008251806020840152615a87816040850160208701615a44565b601f01601f19169190910160400192915050565b634e487b7160e01b600052601160045260246000fd5b67ffffffffffffffff8181168382160280821691908281146145d9576145d9615a9b565b67ffffffffffffffff81811683821601908082111561347e5761347e615a9b565b634e487b7160e01b600052603260045260246000fd5b600060208284031215615b1e57600080fd5b5051919050565b80820180821115612af957612af9615a9b565b60008251615b4a818460208701615a44565b9190910192915050565b600087516020615b678285838d01615a44565b885191840191615b7a8184848d01615a44565b8851920191615b8c8184848c01615a44565b8751920191615b9e8184848b01615a44565b8651920191615bb08184848a01615a44565b8551920191615bc28184848901615a44565b919091019998505050505050505050565b60008351615be5818460208801615a44565b835190830190615bf9818360208801615a44565b01949350505050565b60008751615c14818460208c01615a44565b9190910195865250602085019390935260408401919091526060830152608082015260a001919050565b60008451615c50818460208901615a44565b845190830190615c64818360208901615a44565b8451910190615c77818360208801615a44565b0195945050505050565b634e487b7160e01b600052601260045260246000fd5b600082615cb457634e487b7160e01b600052601260045260246000fd5b500690565b81810381811115612af957612af9615a9b565b60008551615cde818460208a01615a44565b855190830190615cf2818360208a01615a44565b8551910190615d05818360208901615a44565b8451910190615d18818360208801615a44565b019695505050505050565b600089516020615d368285838f01615a44565b8a5191840191615d498184848f01615a44565b8a51920191615d5b8184848e01615a44565b8951920191615d6d8184848d01615a44565b8851920191615d7f8184848c01615a44565b8751920191615d918184848b01615a44565b8651920191615da38184848a01615a44565b8551920191615db58184848901615a44565b919091019b9a5050505050505050505050565b600088516020615ddb8285838e01615a44565b895191840191615dee8184848e01615a44565b8951920191615e008184848d01615a44565b8851920191615e128184848c01615a44565b8751920191615e248184848b01615a44565b8651920191615e368184848a01615a44565b8551920191615e488184848901615a44565b919091019a9950505050505050505050565b60008a51615e6c818460208f01615a44565b9190910198895250602088019690965260408701949094526060860192909252608085015260a084015260c083015260e08201526101000191905056fea164736f6c6343000817000a"
+"0x60a0604052306080523480156200001557600080fd5b506040516200650a3803806200650a8339810160408190526200003891620004ec565b6200004262000056565b6200004e82826200010a565b5050620005bf565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000a75760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620001075780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b81516001600160401b03161515806200012f575060208201516001600160401b031615155b806200013d57506080820151155b806200014b575060a0820151155b8062000159575060c0820151155b8062000167575060e0820151155b8062000177575063ffffffff8116155b1562000196576040516350dd03f760e11b815260040160405180910390fd5b81600560008060049054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b0316021790555060208201518160000160086101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160010155606082015181600201556080820151816003015560a0820151816004015560c0820151816005015560e0820151816006015590505081600560008060089054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b0316021790555060208201518160000160086101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160010155606082015181600201556080820151816003015560a0820151816004015560c0820151816005015560e08201518160060155905050600080600c6101000a8154816001600160401b0302191690836001600160401b03160217905550806000806101000a81548163ffffffff021916908363ffffffff160217905550600062000384836200047260201b60201c565b600181815560e085015160028181556003939093556004556007805480830182556000918252437fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688909101556040805180820182526020808901516001600160401b039081168352929098015197810197885260088054948501815590925290517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee39290930291820180546001600160401b031916939091169290921790915592517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee4909301929092555050565b60808082015160a083015160c0840151604080516020810194909452830191909152606082015260009101604051602081830303815290604052805190602001209050919050565b80516001600160401b0381168114620004d257600080fd5b919050565b805163ffffffff81168114620004d257600080fd5b6000808284036101208112156200050257600080fd5b610100808212156200051357600080fd5b60405191508082016001600160401b03811183821017156200054557634e487b7160e01b600052604160045260246000fd5b6040526200055385620004ba565b82526200056360208601620004ba565b602083015260408501516040830152606085015160608301526080850151608083015260a085015160a083015260c085015160c083015260e085015160e0830152819350620005b4818601620004d7565b925050509250929050565b608051615f21620005e9600039600081816115dd0152818161160601526117720152615f216000f3fe6080604052600436106101945760003560e01c8063013fa5fc146101995780630d8e6e2c146101bb578063202a0adb146101ed5780632d52aad614610296578063313df7b1146102c3578063382b215a146102f05780633919340f146103145780633949d1e914610334578063409939b71461037b5780634847ae5d1461039b5780634f1ef2861461041d57806352d1902d14610430578063530ca78f146104455780635464608514610465578063628277331461047a57806369cc6a04146104905780637053fc51146104a5578063715018a6146104ba57806376671808146104cf57806376b6b7cb146105035780637f17baad1461051957806382d07ff3146105cc5780638584d23f146105e15780638da5cb5b14610625578063a244d5961461063a578063a51e6fea1461065a578063aa9227321461067a578063ad3cb1cc1461069a578063bd32519a146106d8578063c8e5e49814610709578063ca6fe85514610725578063db13b60a1461073b578063e03033011461077a578063f06820541461079a578063f2fde38b146107cc575b600080fd5b3480156101a557600080fd5b506101b96101b43660046152f1565b6107ec565b005b3480156101c757600080fd5b506040805160018152600060208201819052918101919091526060015b60405180910390f35b3480156101f957600080fd5b506101b9610208366004615451565b6000805463ffffffff600160401b918290041682526005602081815260409384902085518154928701516001600160401b039081169095026001600160801b0319909316941693909317178255918301516001820155606083015160028201556080830151600382015560a0830151600482015560c08301519181019190915560e090910151600690910155565b3480156102a257600080fd5b506101b96102b136600461546e565b6009805460ff19166001179055600a55565b3480156102cf57600080fd5b506006546102e3906001600160a01b031681565b6040516101e49190615487565b3480156102fc57600080fd5b5061030660035481565b6040519081526020016101e4565b34801561032057600080fd5b506101b961032f3660046154be565b6108ac565b34801561034057600080fd5b506101b961034f366004615553565b600080546001600160401b03909216600160601b02600160601b600160a01b0319909216919091179055565b34801561038757600080fd5b506101b961039636600461559e565b6108cf565b3480156103a757600080fd5b506103b0610bfa565b6040516101e4919060006101008201905060018060401b038084511683528060208501511660208401525060408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015292915050565b6101b961042b366004615758565b610c8c565b34801561043c57600080fd5b50610306610ca7565b34801561045157600080fd5b506101b96104603660046157fd565b610cc4565b34801561047157600080fd5b50600854610306565b34801561048657600080fd5b5061030660025481565b34801561049c57600080fd5b506101b9610d40565b3480156104b157600080fd5b50600754610306565b3480156104c657600080fd5b506101b9610db0565b3480156104db57600080fd5b506000546104f690600160601b90046001600160401b031681565b6040516101e491906158ae565b34801561050f57600080fd5b5061030660015481565b34801561052557600080fd5b506105866105343660046158d6565b600560208190526000918252604090912080546001820154600283015460038401546004850154958501546006909501546001600160401b0380861697600160401b9096041695939492939192919088565b604080516001600160401b03998a168152989097166020890152958701949094526060860192909252608085015260a084015260c083015260e0820152610100016101e4565b3480156105d857600080fd5b506103b0610dc2565b3480156105ed57600080fd5b506106016105fc36600461546e565b610e52565b6040805182516001600160401b0316815260209283015192810192909252016101e4565b34801561063157600080fd5b506102e3610fac565b34801561064657600080fd5b506101b96106553660046158f1565b610fc7565b34801561066657600080fd5b5061030661067536600461546e565b6110f2565b34801561068657600080fd5b50610306610695366004615451565b611113565b3480156106a657600080fd5b506106cb604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101e4919061595c565b3480156106e457600080fd5b506006546106f990600160a01b900460ff1681565b60405190151581526020016101e4565b34801561071557600080fd5b506101b96009805460ff19169055565b34801561073157600080fd5b5061030660045481565b34801561074757600080fd5b5061075b61075636600461546e565b61115b565b604080516001600160401b0390931683526020830191909152016101e4565b34801561078657600080fd5b506106f961079536600461598f565b611193565b3480156107a657600080fd5b506000546107b79063ffffffff1681565b60405163ffffffff90911681526020016101e4565b3480156107d857600080fd5b506101b96107e73660046152f1565b6111cb565b6107f4611209565b6001600160a01b03811661081b5760405163e6c4247b60e01b815260040160405180910390fd5b6006546001600160a01b039081169082160361084a5760405163a863aec960e01b815260040160405180910390fd5b600680546001600160a81b0319166001600160a01b0380841691909117600160a01b17918290556040517f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072926108a1921690615487565b60405180910390a150565b6108b86007600061502a565b80516108cb906007906020840190615048565b5050565b600654600160a01b900460ff1680156108f357506006546001600160a01b03163314155b1561093a576006546001600160a01b0316610921576040516312e6d1e760e11b815260040160405180910390fd5b6040516301474c8f60e71b815260040160405180910390fd5b610942610dc2565b5182516001600160401b0391821691161115806109805750610962610dc2565b602001516001600160401b031682602001516001600160401b031611155b1561099e5760405163051c46ef60e01b815260040160405180910390fd5b600080546109c39063ffffffff811690600160601b90046001600160401b03166159c7565b6000805463ffffffff600160401b91829004168252600560205260409091205491925090046001600160401b0390811690821614801581610a195750816001600160401b031684602001516001600160401b0316115b15610a42578160405163036466bf60e31b8152600401610a3991906158ae565b60405180910390fd5b610a4f846040015161123b565b610a5c846060015161123b565b610a69846080015161123b565b610a768460a0015161123b565b610a838460c0015161123b565b8015610a9157610a91611297565b610a9b84846113e2565b60008054600160401b9081900463ffffffff168252600560208181526040808520895181548b850180516001600160401b039384166001600160801b0319909316929092179183169097021782558a8301805160018085019190915560608d015160028086019190915560808e0151600386015560a08e0151600486015560c08e01519785019790975560e08d015160069094019390935560078054808501825590895243600080516020615df58339815191529091015583518085018552875183168152815181870190815260088054958601815590995251600080516020615e758339815191529390960292830180546001600160401b031916968316969096179095559551600080516020615eb583398151915290910155925188519251935193845284169391909116917fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6910160405180910390a350505050565b610c02615093565b5060008054600160201b900463ffffffff1681526005602081815260409283902083516101008101855281546001600160401b038082168352600160401b90910416928101929092526001810154938201939093526002830154606082015260038301546080820152600483015460a08201529082015460c082015260069091015460e082015290565b610c946115d2565b610c9d82611677565b6108cb82826116ae565b6000610cb1611767565b50600080516020615e3583398151915290565b610cd0600860006150ea565b60005b81518110156108cb576008828281518110610cf057610cf06159ea565b602090810291909101810151825460018082018555600094855293839020825160029092020180546001600160401b0319166001600160401b039092169190911781559101519082015501610cd3565b610d48611209565b600654600160a01b900460ff1615610d9557600680546001600160a81b03191690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c0245090600090a1565b60405163a863aec960e01b815260040160405180910390fd5b565b610db8611209565b610dae60006117b0565b610dca615093565b506000805463ffffffff600160401b918290041682526005602081815260409384902084516101008101865281546001600160401b038082168352959004909416918401919091526001810154938301939093526002830154606083015260038301546080830152600483015460a083015282015460c082015260069091015460e082015290565b60408051808201909152600080825260208201526008805490610e76600183615a00565b81548110610e8657610e866159ea565b60009182526020909120600290910201546001600160401b03168310610ebf57604051631856a49960e21b815260040160405180910390fd5b60005b81811015610f54578360088281548110610ede57610ede6159ea565b60009182526020909120600290910201546001600160401b03161115610f4c5760088181548110610f1157610f116159ea565b60009182526020918290206040805180820190915260029092020180546001600160401b031682526001015491810191909152949350505050565b600101610ec2565b506008610f62600183615a00565b81548110610f7257610f726159ea565b60009182526020918290206040805180820190915260029092020180546001600160401b0316825260010154918101919091529392505050565b600080610fb761180c565b546001600160a01b031692915050565b6000610fd1611830565b805490915060ff600160401b82041615906001600160401b0316600081158015610ff85750825b90506000826001600160401b031660011480156110145750303b155b905081158015611022575080155b156110405760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b0319166001178555831561106957845460ff60401b1916600160401b1785555b61107286611854565b61107a611865565b60008054600160201b600160601b031916600160401b17905561109d888861186d565b83156110e857845460ff60401b191685556040517fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2906110df906001906158ae565b60405180910390a15b5050505050505050565b6007818154811061110257600080fd5b600091825260209091200154905081565b60808082015160a083015160c0840151604080516020810194909452830191909152606082015260009101604051602081830303815290604052805190602001209050919050565b6008818154811061116b57600080fd5b6000918252602090912060029091020180546001909101546001600160401b03909116915082565b60095460009060ff16156111b85781600a54846111b09190615a00565b1190506111c5565b6111c28383611b90565b90505b92915050565b6111d3611209565b6001600160a01b0381166111fd576000604051631e4fbdf760e01b8152600401610a399190615487565b611206816117b0565b50565b33611212610fac565b6001600160a01b031614610dae573360405163118cdaa760e01b8152600401610a399190615487565b600080516020615e558339815191528110806108cb5760405162461bcd60e51b815260206004820152601b60248201527a109b8c8d4d0e881a5b9d985b1a59081cd8d85b185c88199a595b19602a1b6044820152606401610a39565b6000805463ffffffff600160401b9182900416825260056020818152604080852081516101008101835281546001600160401b038082168352969004909516928501929092526001820154908401526002810154606084015260038101546080840152600481015460a08401529081015460c08301526006015460e082015261131f90611113565b600380546001908155908290556004805460025560008054600160401b810463ffffffff16825260056020526040822060060154909255929350909190600c9061137a908490600160601b90046001600160401b0316615a13565b92506101000a8154816001600160401b0302191690836001600160401b031602179055507fdb3558259e039d7e50e816b9dcce30fb114d8a9c86eca5ab14b60194d6945d3f6000600c9054906101000a90046001600160401b03166040516108a191906158ae565b60006113ec611c71565b60408051600880825261012082019092529192506000919060208201610100803683370190505090506002548160008151811061142b5761142b6159ea565b60200260200101818152505083600001516001600160401b031681600181518110611458576114586159ea565b60200260200101818152505083602001516001600160401b031681600281518110611485576114856159ea565b6020026020010181815250508360400151816003815181106114a9576114a96159ea565b6020026020010181815250508360600151816004815181106114cd576114cd6159ea565b60209081029190910181019190915260008054600160401b900463ffffffff16815260059182905260409020600301548251909183918110611511576115116159ea565b60209081029190910181019190915260008054600160401b900463ffffffff16815260059091526040902060040154815182906006908110611555576115556159ea565b60209081029190910181019190915260008054600160401b900463ffffffff168152600591829052604090200154815182906007908110611598576115986159ea565b6020026020010181815250506115af828285612252565b6115cc576040516309bde33960e01b815260040160405180910390fd5b50505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061165957507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661164d600080516020615e35833981519152546001600160a01b031690565b6001600160a01b031614155b15610dae5760405163703e46dd60e11b815260040160405180910390fd5b61167f611209565b7ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d816040516108a19190615487565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611708575060408051601f3d908101601f1916820190925261170591810190615a33565b60015b6117275781604051634c9c8ce360e01b8152600401610a399190615487565b600080516020615e35833981519152811461175857604051632a87526960e21b815260048101829052602401610a39565b611762838361233d565b505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610dae5760405163703e46dd60e11b815260040160405180910390fd5b60006117ba61180c565b80546001600160a01b038481166001600160a01b031983168117845560405193945091169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930090565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0090565b61185c612393565b611206816123b8565b610dae612393565b81516001600160401b0316151580611891575060208201516001600160401b031615155b8061189e57506080820151155b806118ab575060a0820151155b806118b8575060c0820151155b806118c5575060e0820151155b806118d4575063ffffffff8116155b156118f2576040516350dd03f760e11b815260040160405180910390fd5b81600560008060049054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b0316021790555060208201518160000160086101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160010155606082015181600201556080820151816003015560a0820151816004015560c0820151816005015560e0820151816006015590505081600560008060089054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b0316021790555060208201518160000160086101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160010155606082015181600201556080820151816003015560a0820151816004015560c0820151816005015560e08201518160060155905050600080600c6101000a8154816001600160401b0302191690836001600160401b03160217905550806000806101000a81548163ffffffff021916908363ffffffff1602179055506000611ad883611113565b600181815560e08501516002818155600393909355600455600780548083018255600091825243600080516020615df5833981519152909101556040805180820182526020808901516001600160401b03908116835292909801519781019788526008805494850181559092529051600080516020615e758339815191529290930291820180546001600160401b03191693909116929092179091559251600080516020615eb5833981519152909301929092555050565b60075460009043841180611ba45750600381105b15611bc25760405163b0b4387760e01b815260040160405180910390fd5b60008080611bd1600185615a00565b90505b81611c3c578660078281548110611bed57611bed6159ea565b906000526020600020015411611c22576001915060078181548110611c1457611c146159ea565b906000526020600020015492505b60028110611c3c5780611c3481615a4c565b915050611bd4565b81611c5a5760405163b0b4387760e01b815260040160405180910390fd5b85611c658489615a00565b11979650505050505050565b611c7961510b565b620100008152600860208201527f013d1d4b425179258b577860397955cbfa0816e32b1c25a1fd734c91b951ee816040820151527f16b88dc7439a6d841e1a1103f5a3d2d2440137f18d02763503bac7b45dcb983b6020604083015101527f0c3c864f195f59119927f53857f1de8bf575941748b735351fd31373c7875c2d6060820151527f169ba15107f2eff9b9341bf30742a838d27dbd69e88b2353dca8592f15f1111c6020606083015101527f11d4ceb15961d10b6156ae3d09bb78b4df45fb8543060884e7d400755beb4ac86080820151527f0326ff06391ed5d26ec1bc080b8d46014ee22c0c68ed022f1620c4d9d38437d36020608083015101527f23610cb43e21033c368a93622dd405b905a0eb344c98b9d7cf08b0c5ebf7c83960a0820151527e1379342a4d77d4708743aff01ff27aa11917478fdc8e2b7d463081735772ea602060a083015101527f194daf85d9eed9937b28e2a680fcc5a76922c15cd31dc4f600e14939b8200ce760c0820151527f25280b124624911c7f87b4c2d87f59c6c07e3eeeb10d614da216f6219ffe50b6602060c083015101527f04882ef39899ea38c9677a48b8f8cc6a67284e17ff940289faaa359eec9b33a660e0820151527f1bae9f36e6190738c711501be53f299bf61348e61e2ef9d577760e64f629368d602060e083015101527f2d810d30120cb93e1a254b89ed0ae86c761f49b4f129459cd534f9551851350f610100820151527f0b25394da5a1d435daccc2eadd039e2c2709f5f42fabd9afba815ed62d6af36b602061010083015101527f1c2ce7be570bea9e43f3d3d7cbca84bdb4fc89b53ae657531de72670a6105e08610120820151527f1a0255ec8c7c8769335bc9dc6b222ac6a04e766d08b45c8cc573592c05bc9c14602061012083015101527f1c164159136b8f5b4773e133f483a8a192ab15d6d3ee012f171b3d02fd4506e7610140820151527f272eb7d633cedb68ce0113f4420ab5610b81b8ba1ab9348db15761d40e8df5ba602061014083015101527f0e446639aa6caf25e93ef747084e39b8ea90abf23bb48c28fd5f9ba7ba655022610160820151527f033e195a9ea3a9ce40b72b673afb45444ca1b15f0543f44d10f5c640a780676f602061016083015101527f0e8db2b2893df23d3c55f0b3a3b54ab2e2ed775b31c4c90e472eb31582582df2610180820151527f0f4c69895451af15052aa81a03eba9752c9e7891dd08e264e0bd593d0357858e602061018083015101527f2bc091fefe2416ec83c6fba8fb82fb48cb9ca00182ec792c212bf5532958c8f76101a0820151527f1f4dcf4dd484e3ab1ae487603d2245397ac78fe6ca7584645eba3926d383902b60206101a083015101527f2daf78c5a2829a9418081dd7e8743a683ed6817996f75f10009d99220793ec736101c0820151527f19eb12a7827c0ddf6383fe806c3953bd06b08aae7bf2a01f55c986a84f50cc2860206101c083015101527f015691308846e68ea856a2cb24c9903f0c8605dea190829180ff6bdd1c6508036101e0820151527f1ffd789b155b8acb13e0f6a48b50f7aa8092540888d009141057d4569091582460206101e083015101527f0545ac7aa66dcf3719988438c806fc624de57ab43f8580392f88c86c1378ce4a610200820151527f16b7f250842ecf4e3690706a1e152d7a57f70f556f92076da785fdd363c19fcf602061020083015101527f20cb7ff35a83a7dc314036e470f14c30fb0e98d35d663b243b222caa6fc7db44610220820151527f149f415744707468bdaa4e8545201ab40d1931a7d31f23768fa7c65574ee3eab602061022083015101527f0a25c1b7573906dc4e193b4ea82fd1fe7ccebc4d925dad26f0ff09c84c9f1a75610240820151527f0a521ff30c8f3666798f847c5d4c379658fba10156e7a9499f2713fae9bf2be1602061024083015101527f03db6510c3f13629fded9a5a2d41654bbce4ef6d024cad53100051d4a3f3ebc9610260820151527f08e80a5c8e4c9b9f26f3003cc59403a18d3136afd030868d25cc8b807e2ab3706020610260830151015290565b600061225d826123c0565b61228083600081518110612273576122736159ea565b602002602001015161123b565b61229683600181518110612273576122736159ea565b6122ac83600281518110612273576122736159ea565b6122c283600381518110612273576122736159ea565b6122d883600481518110612273576122736159ea565b6122ee83600581518110612273576122736159ea565b61230483600681518110612273576122736159ea565b61231a83600781518110612273576122736159ea565b60006123278585856124f8565b905061233281612642565b9150505b9392505050565b61234682612aa1565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561238b576117628282612afd565b6108cb612b73565b61239b612b92565b610dae57604051631afcd79f60e31b815260040160405180910390fd5b6111d3612393565b80516123cb90612bac565b6123d88160200151612bac565b6123e58160400151612bac565b6123f28160600151612bac565b6123ff8160800151612bac565b61240c8160a00151612bac565b6124198160c00151612bac565b6124268160e00151612bac565b612434816101000151612bac565b612442816101200151612bac565b612450816101400151612bac565b61245e816101600151612bac565b61246c816101800151612bac565b61247a816101a0015161123b565b612488816101c0015161123b565b612496816101e0015161123b565b6124a481610200015161123b565b6124b281610220015161123b565b6124c081610240015161123b565b6124ce81610260015161123b565b6124dc81610280015161123b565b6124ea816102a0015161123b565b611206816102c0015161123b565b61250061520f565b8360200151835114612525576040516320fa9d8960e11b815260040160405180910390fd5b6000612532858585612c3a565b905060006125438660000151612f59565b90506000612556828460a0015188613324565b60408051601e8082526103e0820190925291925060009190602082016103c080368337505060408051601e8082526103e082019092529293506000929150602082015b6125a1615249565b81526020019060019003908161259957905050905060006125c68a858a898787613384565b60a0870151606087015191925090600080516020615e55833981519152600081838509604080516101008101825260e09c8d0151815260208101969096528501525050506060810191909152608081019290925260a082015261016086015160c082015261018090950151928501929092525091949350505050565b6000600080516020615e5583398151915261265b615249565b612663615249565b6040805160028082526060820183526000926020830190803683375050604080516002808252606082019092529293506000929150602082015b6126a5615249565b81526020019060019003908161269d57905050905060006001905080836000815181106126d4576126d46159ea565b6020026020010181815250508760c00151826000815181106126f8576126f86159ea565b602002602001018190525087600001518360018151811061271b5761271b6159ea565b6020026020010181815250508760e001518260018151811061273f5761273f6159ea565b602002602001018190525061275482846133b9565b6080890151519095506060935083925090506000612773826002615a63565b61277e906001615a63565b9050806001600160401b038111156127985761279861530c565b6040519080825280602002602001820160405280156127c1578160200160208202803683370190505b509350806001600160401b038111156127dc576127dc61530c565b60405190808252806020026020018201604052801561281557816020015b612802615249565b8152602001906001900390816127fa5790505b509250505060008060005b8960800151518110156128b95789608001518181518110612843576128436159ea565b602002602001015185838151811061285d5761285d6159ea565b6020026020010181815250508960a00151818151811061287f5761287f6159ea565b6020026020010151848381518110612899576128996159ea565b60209081029190910101526128af600183615a63565b9150600101612820565b5088602001518482815181106128d1576128d16159ea565b6020026020010181815250508860c001518382815181106128f4576128f46159ea565b602090810291909101015261290a600182615a63565b895160408b015191925090600089828409905080878581518110612930576129306159ea565b6020026020010181815250505050508860e00151838281518110612956576129566159ea565b602090810291909101015261296c600182615a63565b60608a015190915087818408925050612984826134a7565b848281518110612996576129966159ea565b6020026020010181815250506129aa6134d9565b8382815181106129bc576129bc6159ea565b60200260200101819052506129d96129d484866133b9565b6134fa565b945050505050600060405180608001604052807f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b081526020017f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c181526020017f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e5581526020017f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe48152509050612a97838284612a92613567565b613638565b9695505050505050565b806001600160a01b03163b600003612ace5780604051634c9c8ce360e01b8152600401610a399190615487565b600080516020615e3583398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b031684604051612b1a9190615a76565b600060405180830381855af49150503d8060008114612b55576040519150601f19603f3d011682016040523d82523d6000602084013e612b5a565b606091505b5091509150612b6a85838361371b565b95945050505050565b3415610dae5760405163b398979f60e01b815260040160405180910390fd5b6000612b9c611830565b54600160401b900460ff16919050565b6000600080516020615dd5833981519152612bc68361376e565b15612bd057505050565b8251602084015182600384858586098509088382830914838210848410161693505050816117625760405162461bcd60e51b8152602060048201526017602482015276109b8c8d4d0e881a5b9d985b1a590811cc481c1bda5b9d604a1b6044820152606401610a39565b612c8260405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604080518082019091526060815260006020820152600080516020615e55833981519152612cb182878761377d565b81518451612cbe90613b16565b612ccb8660200151613b16565b612cd88760400151613b16565b612ce58860600151613b16565b612cf28960800151613b16565b604051602001612d0796959493929190615a92565b60408051601f198184030181529190528252612d2282613b8b565b50612d2c82613b8b565b6060840152612d3a82613b8b565b6080840152815160a0850151612d4f90613b16565b604051602001612d60929190615b11565b60408051601f198184030181529190528252612d7b82613b8b565b8352815160c0850151612d8d90613b16565b612d9a8660e00151613b16565b612da8876101000151613b16565b612db6886101200151613b16565b612dc4896101400151613b16565b604051602001612dd996959493929190615a92565b60408051601f198184030181529190528252612df482613b8b565b60a084015281516101a0850151612e0a90613bed565b612e18866101c00151613bed565b612e26876101e00151613bed565b612e34886102000151613bed565b612e42896102200151613bed565b604051602001612e5796959493929190615b40565b60408051601f19818403018152919052808352610240850151612e7990613bed565b612e87866102600151613bed565b612e95876102800151613bed565b612ea3886102a00151613bed565b612eb1896102c00151613bed565b604051602001612ec696959493929190615b40565b60408051601f198184030181529190528252612ee182613b8b565b60c08401528151610160850151612ef790613b16565b612f05866101800151613b16565b604051602001612f1793929190615b7c565b60408051601f198184030181529190528252612f3282613b8b565b60e08401528251818180098282820960208601919091526040850152509195945050505050565b612f8b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b81620100000361301f57506040805160a0810182526010815260208101929092527f30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c1001908201527eeeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b760608201527f0b5d56b77fe704e8e92338c0082f37e091126414c830e4c6922d5ac802d842d4608082015290565b8162020000036130b457506040805160a0810182526011815260208101929092527f30643640b9f82f90e83b698e5ea6179c7c05542e859533b48b9953a2f5360801908201527f1bf82deba7d74902c3708cc6e70e61f30512eca95655210e276e5858ce8f58e560608201527f244cf010c43ca87237d8b00bf9dd50c4c01c7f086bd4e8c920e75251d96f0d22608082015290565b81620400000361314957506040805160a0810182526012815260208101929092527f30644259cd94e7dd5045d7a27013b7fcd21c9e3b7fa75222e7bda49b729b0401908201527f19ddbcaf3a8d46c15c0176fbb5b95e4dc57088ff13f4d1bd84c6bfa57dcdc0e060608201527f036853f083780e87f8d7c71d111119c57dbe118c22d5ad707a82317466c5174c608082015290565b8162080000036131de57506040805160a0810182526013815260208101929092527f3064486657634403844b0eac78ca882cfd284341fcb0615a15cfcd17b14d8201908201527f2260e724844bca5251829353968e4915305258418357473a5c1d597f613f6cbd60608201527f06e402c0a314fb67a15cf806664ae1b722dbc0efe66e6c81d98f9924ca535321608082015290565b81621000000361327357506040805160a0810182526014815260208101929092527f30644b6c9c4a72169e4daa317d25f04512ae15c53b34e8f5acd8e155d0a6c101908201527f26125da10a0ed06327508aba06d1e303ac616632dbed349f53422da95333785760608201527f100c332d2100895fab6473bc2c51bfca521f45cb3baca6260852a8fde26c91f3608082015290565b8160200361330657506040805160a0810182526005815260208101929092527f2ee12bff4a2813286a8dc388cd754d9a3ef2490635eba50cb9c2e5e750800001908201527f09c532c6306b93d29678200d47c0b2a99c18d51b838eeb1d3eed4c533bb512d060608201527f2724713603bfbd790aeaf3e7df25d8e7ef8f311334905b4d8c99980cf210979d608082015290565b60405163e2ef09e560e01b815260040160405180910390fd5b919050565b61334860405180606001604052806000815260200160008152602001600081525090565b6133528484613d24565b8082526133629085908590613d78565b6020820152805161337890859084908690613dec565b60408201529392505050565b600080613392858789613fa0565b90506133a2888689898888614090565b6133ad81878661439c565b98975050505050505050565b6133c1615249565b82518251146134125760405162461bcd60e51b815260206004820181905260248201527f4d534d206572726f723a206c656e67746820646f6573206e6f74206d617463686044820152606401610a39565b61345083600081518110613428576134286159ea565b602002602001015183600081518110613443576134436159ea565b60200260200101516143ec565b905060015b82518110156134a05761349682613491868481518110613477576134776159ea565b6020026020010151868581518110613443576134436159ea565b614480565b9150600101613455565b5092915050565b60006134c1600080516020615e5583398151915283615bd5565b6111c590600080516020615e55833981519152615a00565b6134e1615249565b5060408051808201909152600181526002602082015290565b613502615249565b61350b8261376e565b15613514575090565b604051806040016040528083600001518152602001600080516020615dd583398151915284602001516135479190615bd5565b61355f90600080516020615dd5833981519152615a00565b905292915050565b6135926040518060800160405280600081526020016000815260200160008152602001600081525090565b60405180608001604052807f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81526020017f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281526020017f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa81526020017f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b815250905090565b60008060006040518751815260208801516020820152602087015160408201528651606082015260608701516080820152604087015160a0820152855160c0820152602086015160e08201526020850151610100820152845161012082015260608501516101408201526040850151610160820152602060006101808360085afa91505060005191508061370d5760405162461bcd60e51b815260206004820152601c60248201527b426e3235343a2050616972696e6720636865636b206661696c65642160201b6044820152606401610a39565b50151590505b949350505050565b6060826137305761372b8261451b565b612336565b815115801561374757506001600160a01b0384163b155b156137675783604051639996b31560e01b8152600401610a399190615487565b5080612336565b80516020909101511590151690565b825160fe906137b861378e83613bed565b6040516020016137a091815260200190565b60405160208183030381529060405260006004614544565b6137f26137c88660000151613bed565b6040516020016137da91815260200190565b60405160208183030381529060405260006008614544565b6138026137c88760200151613bed565b6040516020016138159493929190615bf7565b60408051601f198184030181529190528085526138326001613bed565b613849600080516020615ef5833981519152613bed565b613860600080516020615e95833981519152613bed565b613877600080516020615ed5833981519152613bed565b61388e600080516020615e15833981519152613bed565b6040516020016138a396959493929190615b40565b60408051601f1981840301815291905280855260e08401516138c490613b16565b6138d2856101000151613b16565b6138e0866101200151613b16565b6138ee876101400151613b16565b6138fc886101600151613b16565b61390a896101800151613b16565b6139188a6101e00151613b16565b60405160200161392f989796959493929190615c4e565b60408051601f1981840301815291905280855261020084015161395190613b16565b61395f856102200151613b16565b61396d866102400151613b16565b61397b876101a00151613b16565b613989886101c00151613b16565b613997896102600151613b16565b6040516020016139ad9796959493929190615cf3565b60408051601f198184030181529181528186528401516139cc90613b16565b6139d98560600151613b16565b6139e68660800151613b16565b6139f38760a00151613b16565b613a008860c00151613b16565b604051602001613a1596959493929190615a92565b60408051601f198184030181529190528085528251613a4c908490600090613a3f57613a3f6159ea565b6020026020010151613bed565b613a6284600181518110613a3f57613a3f6159ea565b613a7885600281518110613a3f57613a3f6159ea565b613a8e86600381518110613a3f57613a3f6159ea565b613aa487600481518110613a3f57613a3f6159ea565b613aba88600581518110613a3f57613a3f6159ea565b613ad089600681518110613a3f57613a3f6159ea565b613ae68a600781518110613a3f57613a3f6159ea565b604051602001613afe99989796959493929190615d85565b60408051601f19818403018152919052909352505050565b60606000613b238361376e565b15613b2f57600160fe1b175b6020830151600080516020615dd583398151915260019190911b10613b555750600160ff1b5b8251613b62908217613bed565b604051602001613b7491815260200190565b604051602081830303815290604052915050919050565b602080820151825180516040518381526000948594939291908101855b83811015613bc25760208186018101518383015201613ba8565b50506020918201902090860181905292506000612a97600080516020615e5583398151915285615bd5565b60008190506008817eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff16901b6008827fff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff0016901c1790506010817dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff16901b6010827dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff1916901c1790506020817bffffffff00000000ffffffff00000000ffffffff00000000ffffffff16901b6020827bffffffff00000000ffffffff00000000ffffffff00000000ffffffff1916901c1790506040816001600160401b03600160801b03600160c01b0316901b6040826001600160401b03600160801b03600160c01b031916901c179050608081901b608082901c179050919050565b8151600090600080516020615e5583398151915290838015613d685784935060005b82811015613d5c57838586099450600101613d46565b50600184039350613d6f565b6001830393505b50505092915050565b600082600103613d8a57506001612336565b81600003613d9a57506000612336565b6040840151600080516020615e5583398151915290600090828186099050858015613dca57600187039250613dd1565b6001840392505b50613ddb82614651565b915082828209979650505050505050565b8251600090600080516020615e5583398151915290838303613e6d57600160005b82811015613e6057818703613e4157878181518110613e2e57613e2e6159ea565b6020026020010151945050505050613713565b8380613e4f57613e4f615bbf565b896060015183099150600101613e0d565b5060009350505050613713565b6000806000808a604001519050600080613e878d886146f7565b90506000876001600160401b03811115613ea357613ea361530c565b604051908082528060200260200182016040528015613ecc578160200160208202803683370190505b509050888b850993506001925060005b88811015613f1157602081026020840101519550898d878c030896508987850960208281028401018890529350600101613edc565b50613f1b83614651565b925060005b88811015613f8e5760208102602084010151955089868609975089848909975060005b89811015613f6d57808214613f65576020810260208401015197508a888a0998505b600101613f43565b506020810260208f010151955089868909975089888c089a50600101613f20565b50505050505050505050949350505050565b600080600080516020615e558339815191529050600083602001519050600084604001519050600060019050606088015160808901516101a08901516102408a01518788898387098a868608088609945050506101c08901516102608a01518788898387098a868608088609945050506101e08901516102808a01518788898387098a868608088609945050506102008901516102a08a01518788898387098a8686080886099450505061022089015191506102c0890151868782898587080985099350505050875160208901518586868309870385089650508485838309860387089998505050505050505050565b61409e8686868685876147bc565b60c08501518251600080516020615e55833981519152919081908190869060149081106140cd576140cd6159ea565b6020026020010181815250508560000151846014815181106140f1576140f16159ea565b60200260200101819052508282820990508085601581518110614116576141166159ea565b60200260200101818152505085602001518460158151811061413a5761413a6159ea565b6020026020010181905250828282099050808560168151811061415f5761415f6159ea565b602002602001018181525050856040015184601681518110614183576141836159ea565b602002602001018190525082828209905080856017815181106141a8576141a86159ea565b6020026020010181815250508560600151846017815181106141cc576141cc6159ea565b602002602001018190525082828209905080856018815181106141f1576141f16159ea565b602002602001018181525050856080015184601881518110614215576142156159ea565b6020026020010181905250828282099050808560198151811061423a5761423a6159ea565b60200260200101818152505088604001518460198151811061425e5761425e6159ea565b60200260200101819052508282820990508085601a81518110614283576142836159ea565b602002602001018181525050886060015184601a815181106142a7576142a76159ea565b60200260200101819052508282820990508085601b815181106142cc576142cc6159ea565b602002602001018181525050886080015184601b815181106142f0576142f06159ea565b60200260200101819052508282820990508085601c81518110614315576143156159ea565b6020026020010181815250508860a0015184601c81518110614339576143396159ea565b60200260200101819052508282820990508760e0015185601d81518110614362576143626159ea565b6020026020010181815250508560a0015184601d81518110614386576143866159ea565b6020026020010181905250505050505050505050565b600080516020615e558339815191528381039060005b600a8110156143e35760206015820102840151602082026101a00186015183848284098608945050506001016143b2565b50509392505050565b6143f4615249565b6143fc615263565b835181526020808501519082015260408101839052600060608360808460076107d05a03fa9050808061442e57600080fd5b50806144785760405162461bcd60e51b8152602060048201526019602482015278426e3235343a207363616c6172206d756c206661696c65642160381b6044820152606401610a39565b505092915050565b614488615249565b614490615281565b8351815260208085015181830152835160408301528301516060808301919091526000908360c08460066107d05a03fa905080806144cd57600080fd5b50806144785760405162461bcd60e51b815260206004820152601d60248201527f426e3235343a2067726f7570206164646974696f6e206661696c6564210000006044820152606401610a39565b80511561452b5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b60608161455281601f615a63565b10156145915760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610a39565b61459b8284615a63565b845110156145df5760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b6044820152606401610a39565b6060821580156145fe5760405191506000825260208201604052614648565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561463757805183526020928301920161461f565b5050858452601f01601f1916604052505b50949350505050565b6000806000600080516020615e55833981519152905060405160208152602080820152602060408201528460608201526002820360808201528160a08201526020600060c08360055afa9250506000519250816146f05760405162461bcd60e51b815260206004820152601d60248201527f426e3235343a20706f7720707265636f6d70696c65206661696c6564210000006044820152606401610a39565b5050919050565b6060826020015182111561471e57604051638c5e11f160e01b815260040160405180910390fd5b60608301516001600080516020615e55833981519152846001600160401b0381111561474c5761474c61530c565b604051908082528060200260200182016040528015614775578160200160208202803683370190505b50935084151915613d6f5760208401856020028101600182526020820191505b808210156147b157828585099350838252602082019150614795565b505050505092915050565b600080600080600080600080516020615e5583398151915290508060208b015160208d01510995508a5193508060a08c015160608d0151099250806101a08a0151840891508060808c01518308915080848309935080600080516020615ef583398151915284099150806101c08a0151830891508060808c01518308915080848309935080600080516020615e9583398151915284099150806101e08a0151830891508060808c01518308915080848309935080600080516020615ed583398151915284099150806102008a0151830891508060808c01518308915080848309935080600080516020615e1583398151915284099150806102208a0151830891508060808c0151830891508084830993508084870895508860a00151886000815181106148eb576148eb6159ea565b6020026020010181905250858760008151811061490a5761490a6159ea565b6020026020010181815250508060608c01518c51099450806102c08a015186099450806102408a015160608d0151099250806101a08a0151840892508060808c015184089250808386099450806102608a015160608d0151099250806101c08a0151840892508060808c015184089250808386099450806102808a015160608d0151099250806101e08a0151840892508060808c015184089250808386099450806102a08a015160608d0151099250806102008a0151840892508060808c0151840892508083860994508b60c00151886001815181106149ec576149ec6159ea565b6020908102919091010152614a018582615a00565b87600181518110614a1457614a146159ea565b602002602001018181525050886101a0015187600281518110614a3957614a396159ea565b602002602001018181525050886101c0015187600381518110614a5e57614a5e6159ea565b602002602001018181525050886101e0015187600481518110614a8357614a836159ea565b60200260200101818152505088610200015187600581518110614aa857614aa86159ea565b6020026020010181815250508b60e0015188600281518110614acc57614acc6159ea565b60200260200101819052508b610100015188600381518110614af057614af06159ea565b60200260200101819052508b610120015188600481518110614b1457614b146159ea565b60200260200101819052508b610140015188600581518110614b3857614b386159ea565b6020026020010181905250806101c08a01516101a08b01510992508287600681518110614b6757614b676159ea565b6020026020010181815250508b610160015188600681518110614b8c57614b8c6159ea565b6020026020010181905250806102008a01516101e08b01510992508287600781518110614bbb57614bbb6159ea565b6020026020010181815250508b610180015188600781518110614be057614be06159ea565b60200260200101819052506101a089015192508083840991508082830991508082840992508287600881518110614c1957614c196159ea565b6020026020010181815250508b6101e0015188600881518110614c3e57614c3e6159ea565b60200260200101819052506101c089015192508083840991508082830991508082840992508287600981518110614c7757614c776159ea565b6020026020010181815250508b610200015188600981518110614c9c57614c9c6159ea565b60200260200101819052506101e089015192508083840991508082830991508082840992508287600a81518110614cd557614cd56159ea565b6020026020010181815250508b610220015188600a81518110614cfa57614cfa6159ea565b602002602001018190525061020089015192508083840991508082830991508082840992508287600b81518110614d3357614d336159ea565b6020026020010181815250508b610240015188600b81518110614d5857614d586159ea565b602002602001018190525088610220015181614d749190615a00565b87600c81518110614d8757614d876159ea565b6020026020010181815250508b6101a0015188600c81518110614dac57614dac6159ea565b6020026020010181905250600187600d81518110614dcc57614dcc6159ea565b6020026020010181815250508b6101c0015188600d81518110614df157614df16159ea565b6020026020010181905250806101c08a01516101a08b0151099250806101e08a015184099250806102008a015184099250806102208a0151840992508287600e81518110614e4157614e416159ea565b6020026020010181815250508b610260015188600e81518110614e6657614e666159ea565b60209081029190910101528951614e7d9082615a00565b87600f81518110614e9057614e906159ea565b6020026020010181815250508860c0015188600f81518110614eb457614eb46159ea565b60200260200101819052508060018b510860a08c0151909350819080099150808284099250808360206010028901510991508187601081518110614efa57614efa6159ea565b6020026020010181815250508860e0015188601081518110614f1e57614f1e6159ea565b6020026020010181905250808360206011028901510991508187601181518110614f4a57614f4a6159ea565b60200260200101818152505088610100015188601181518110614f6f57614f6f6159ea565b6020026020010181905250808360206012028901510991508187601281518110614f9b57614f9b6159ea565b60200260200101818152505088610120015188601281518110614fc057614fc06159ea565b6020026020010181905250808360206013028901510991508187601381518110614fec57614fec6159ea565b60200260200101818152505088610140015188601381518110615011576150116159ea565b6020026020010181905250505050505050505050505050565b5080546000825590600052602060002090810190611206919061529f565b828054828255906000526020600020908101928215615083579160200282015b82811115615083578251825591602001919060010190615068565b5061508f92915061529f565b5090565b60405180610100016040528060006001600160401b0316815260200160006001600160401b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b508054600082556002029060005260206000209081019061120691906152b4565b604051806102800160405280600081526020016000815260200161512d615249565b815260200161513a615249565b8152602001615147615249565b8152602001615154615249565b8152602001615161615249565b815260200161516e615249565b815260200161517b615249565b8152602001615188615249565b8152602001615195615249565b81526020016151a2615249565b81526020016151af615249565b81526020016151bc615249565b81526020016151c9615249565b81526020016151d6615249565b81526020016151e3615249565b81526020016151f0615249565b81526020016151fd615249565b815260200161520a615249565b905290565b6040518061010001604052806000815260200160008152602001600081526020016000815260200160608152602001606081526020016151fd5b604051806040016040528060008152602001600081525090565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b5b8082111561508f57600081556001016152a0565b5b8082111561508f5780546001600160401b0319168155600060018201556002016152b5565b80356001600160a01b038116811461331f57600080fd5b60006020828403121561530357600080fd5b6111c2826152da565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156153445761534461530c565b60405290565b6040516102e081016001600160401b03811182821017156153445761534461530c565b604051601f8201601f191681016001600160401b03811182821017156153955761539561530c565b604052919050565b80356001600160401b038116811461331f57600080fd5b60006101008083850312156153c857600080fd5b604051908101906001600160401b03821181831017156153ea576153ea61530c565b816040528092506153fa8461539d565b81526154086020850161539d565b602082015260408401356040820152606084013560608201526080840135608082015260a084013560a082015260c084013560c082015260e084013560e0820152505092915050565b6000610100828403121561546457600080fd5b6111c283836153b4565b60006020828403121561548057600080fd5b5035919050565b6001600160a01b0391909116815260200190565b60006001600160401b038211156154b4576154b461530c565b5060051b60200190565b600060208083850312156154d157600080fd5b82356001600160401b038111156154e757600080fd5b8301601f810185136154f857600080fd5b803561550b6155068261549b565b61536d565b81815260059190911b8201830190838101908783111561552a57600080fd5b928401925b828410156155485783358252928401929084019061552f565b979650505050505050565b60006020828403121561556557600080fd5b6111c28261539d565b60006040828403121561558057600080fd5b615588615322565b9050813581526020820135602082015292915050565b6000808284036105808112156155b357600080fd5b6155bd85856153b4565b92506101006104808060ff19840112156155d657600080fd5b6155de61534a565b92506155ec8783880161556e565b83526101406155fd8882890161556e565b602085015261018061561189828a0161556e565b60408601526101c06156258a828b0161556e565b60608701526102006156398b828c0161556e565b608088015261024061564d8c828d0161556e565b60a08901526102806156618d828e0161556e565b60c08a01526102c06156758e828f0161556e565b60e08b01526156888e6103008f0161556e565b898b015261569a8e6103408f0161556e565b6101208b01526156ae8e6103808f0161556e565b878b01526156c08e6103c08f0161556e565b6101608b01526156d48e6104008f0161556e565b868b01526104408d01356101a08b01526104608d0135858b0152878d01356101e08b01526104a08d0135848b01526104c08d01356102208b01526104e08d0135838b01526105008d01356102608b01526105208d0135828b01526105408d01356102a08b01526105608d0135818b0152505050505050505050809150509250929050565b6000806040838503121561576b57600080fd5b615774836152da565b91506020838101356001600160401b038082111561579157600080fd5b818601915086601f8301126157a557600080fd5b8135818111156157b7576157b761530c565b6157c9601f8201601f1916850161536d565b915080825287848285010111156157df57600080fd5b80848401858401376000848284010152508093505050509250929050565b6000602080838503121561581057600080fd5b82356001600160401b0381111561582657600080fd5b8301601f8101851361583757600080fd5b80356158456155068261549b565b81815260069190911b8201830190838101908783111561586457600080fd5b928401925b8284101561554857604084890312156158825760008081fd5b61588a615322565b6158938561539d565b81528486013586820152825260409093019290840190615869565b6001600160401b0391909116815260200190565b803563ffffffff8116811461331f57600080fd5b6000602082840312156158e857600080fd5b6111c2826158c2565b6000806000610140848603121561590757600080fd5b61591185856153b4565b925061592061010085016158c2565b915061592f61012085016152da565b90509250925092565b60005b8381101561595357818101518382015260200161593b565b50506000910152565b602081526000825180602084015261597b816040850160208701615938565b601f01601f19169190910160400192915050565b600080604083850312156159a257600080fd5b50508035926020909101359150565b634e487b7160e01b600052601160045260246000fd5b6001600160401b03818116838216028082169190828114614478576144786159b1565b634e487b7160e01b600052603260045260246000fd5b818103818111156111c5576111c56159b1565b6001600160401b038181168382160190808211156134a0576134a06159b1565b600060208284031215615a4557600080fd5b5051919050565b600081615a5b57615a5b6159b1565b506000190190565b808201808211156111c5576111c56159b1565b60008251615a88818460208701615938565b9190910192915050565b600087516020615aa58285838d01615938565b885191840191615ab88184848d01615938565b8851920191615aca8184848c01615938565b8751920191615adc8184848b01615938565b8651920191615aee8184848a01615938565b8551920191615b008184848901615938565b919091019998505050505050505050565b60008351615b23818460208801615938565b835190830190615b37818360208801615938565b01949350505050565b60008751615b52818460208c01615938565b9190910195865250602085019390935260408401919091526060830152608082015260a001919050565b60008451615b8e818460208901615938565b845190830190615ba2818360208901615938565b8451910190615bb5818360208801615938565b0195945050505050565b634e487b7160e01b600052601260045260246000fd5b600082615bf257634e487b7160e01b600052601260045260246000fd5b500690565b60008551615c09818460208a01615938565b855190830190615c1d818360208a01615938565b8551910190615c30818360208901615938565b8451910190615c43818360208801615938565b019695505050505050565b600089516020615c618285838f01615938565b8a5191840191615c748184848f01615938565b8a51920191615c868184848e01615938565b8951920191615c988184848d01615938565b8851920191615caa8184848c01615938565b8751920191615cbc8184848b01615938565b8651920191615cce8184848a01615938565b8551920191615ce08184848901615938565b919091019b9a5050505050505050505050565b600088516020615d068285838e01615938565b895191840191615d198184848e01615938565b8951920191615d2b8184848d01615938565b8851920191615d3d8184848c01615938565b8751920191615d4f8184848b01615938565b8651920191615d618184848a01615938565b8551920191615d738184848901615938565b919091019a9950505050505050505050565b60008a51615d97818460208f01615938565b9190910198895250602088019690965260408701949094526060860192909252608085015260a084015260c083015260e08201526101000191905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47a66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6882e2b91456103698adf57b799969dea1c8f739da5d8d40dd3eb9222db7c81e881360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001f3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee31ee678a0470a75a6eaa8fe837060498ba828a3703b311d0f77f010424afeb025f3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee42042a587a90c187b0a087c03e29c968b950b1db26d5c82d666905a6895790c0a2f8dd1f1a7583c42c4e12a44e110404c73ca6c94813f85835da4fb7bb1301d4aa164736f6c6343000817000a"
diff --git a/contract-bindings/artifacts/LightClient_bytecode.json b/contract-bindings/artifacts/LightClient_bytecode.json
index 0bc319005..12ffa9f84 100644
--- a/contract-bindings/artifacts/LightClient_bytecode.json
+++ b/contract-bindings/artifacts/LightClient_bytecode.json
@@ -1 +1 @@
-"0x60a0604052306080523480156200001557600080fd5b506200002062000026565b620000da565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000775760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d75780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051615d9f62000104600039600081816113d0015281816113f901526115e70152615d9f6000f3fe6080604052600436106101805760003560e01c806376671808116100d6578063aa9227321161007f578063ca6fe85511610059578063ca6fe855146105c8578063f0682054146105de578063f2fde38b1461061057600080fd5b8063aa922732146104cd578063ad3cb1cc14610530578063bd32519a1461058657600080fd5b806382d07ff3116100b057806382d07ff31461045b5780638da5cb5b14610470578063a244d596146104ad57600080fd5b8063766718081461034157806376b6b7cb1461038b5780637f17baad146103a157600080fd5b80634847ae5d116101385780636282773311610112578063628277331461030157806369cc6a0414610317578063715018a61461032c57600080fd5b80634847ae5d146102555780634f1ef286146102d957806352d1902d146102ec57600080fd5b8063313df7b111610169578063313df7b1146101d9578063382b215a14610211578063409939b71461023557600080fd5b8063013fa5fc146101855780630d8e6e2c146101a7575b600080fd5b34801561019157600080fd5b506101a56101a036600461548b565b610630565b005b3480156101b357600080fd5b506040805160018152600060208201819052918101919091526060015b60405180910390f35b3480156101e557600080fd5b506006546101f9906001600160a01b031681565b6040516001600160a01b0390911681526020016101d0565b34801561021d57600080fd5b5061022760035481565b6040519081526020016101d0565b34801561024157600080fd5b506101a561025036600461561c565b610748565b34801561026157600080fd5b5061026a610a8a565b6040516101d0919060006101008201905067ffffffffffffffff8084511683528060208501511660208401525060408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015292915050565b6101a56102e73660046157f4565b610b77565b3480156102f857600080fd5b50610227610b96565b34801561030d57600080fd5b5061022760025481565b34801561032357600080fd5b506101a5610bc5565b34801561033857600080fd5b506101a5610c77565b34801561034d57600080fd5b50600054610372906c01000000000000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016101d0565b34801561039757600080fd5b5061022760015481565b3480156103ad57600080fd5b506104146103bc3660046158ae565b6005602081905260009182526040909120805460018201546002830154600384015460048501549585015460069095015467ffffffffffffffff80861697680100000000000000009096041695939492939192919088565b6040805167ffffffffffffffff998a168152989097166020890152958701949094526060860192909252608085015260a084015260c083015260e0820152610100016101d0565b34801561046757600080fd5b5061026a610c89565b34801561047c57600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101f9565b3480156104b957600080fd5b506101a56104c83660046158c9565b610d73565b3480156104d957600080fd5b506102276104e8366004615910565b60808082015160a083015160c0840151604080516020810194909452830191909152606082015260009101604051602081830303815290604052805190602001209050919050565b34801561053c57600080fd5b506105796040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516101d09190615951565b34801561059257600080fd5b506006546105b89074010000000000000000000000000000000000000000900460ff1681565b60405190151581526020016101d0565b3480156105d457600080fd5b5061022760045481565b3480156105ea57600080fd5b506000546105fb9063ffffffff1681565b60405163ffffffff90911681526020016101d0565b34801561061c57600080fd5b506101a561062b36600461548b565b610f0e565b610638610f65565b6001600160a01b038116610678576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006546001600160a01b03908116908216036106c0576040517fa863aec900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600680547fffffffffffffffffffffff000000000000000000000000000000000000000000166001600160a01b0383811691909117740100000000000000000000000000000000000000001791829055604051911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072906020015b60405180910390a150565b60065474010000000000000000000000000000000000000000900460ff16801561077d57506006546001600160a01b03163314155b156107f6576006546001600160a01b03166107c4576040517f25cda3ce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fa3a6478000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107fe610c89565b51825167ffffffffffffffff918216911611158061083f575061081f610c89565b6020015167ffffffffffffffff16826020015167ffffffffffffffff1611155b15610876576040517f051c46ef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080546108a59063ffffffff8116906c01000000000000000000000000900467ffffffffffffffff1661599a565b6000805463ffffffff68010000000000000000918290041682526005602052604090912054919250900467ffffffffffffffff9081169082161480158161090357508167ffffffffffffffff16846020015167ffffffffffffffff16115b1561094b576040517f1b2335f800000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024015b60405180910390fd5b6109588460400151610fd9565b6109658460600151610fd9565b6109728460800151610fd9565b61097f8460a00151610fd9565b61098c8460c00151610fd9565b801561099a5761099a611049565b6109a484846111ab565b6000805463ffffffff680100000000000000009182900416825260056020818152604093849020885181548a84015167ffffffffffffffff9081169687027fffffffffffffffffffffffffffffffff000000000000000000000000000000009092169216918217178255898601516001830181905560608b0151600284015560808b0151600384015560a08b0151600484015560c08b01519483019490945560e08a015160069092019190915593519182529192917fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6910160405180910390a350505050565b610ae6604051806101000160405280600067ffffffffffffffff168152602001600067ffffffffffffffff1681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5060008054640100000000900463ffffffff16815260056020818152604092839020835161010081018552815467ffffffffffffffff80821683526801000000000000000090910416928101929092526001810154938201939093526002830154606082015260038301546080820152600483015460a08201529082015460c082015260069091015460e082015290565b610b7f6113c5565b610b8882611495565b610b9282826114d6565b5050565b6000610ba06115dc565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610bcd610f65565b60065474010000000000000000000000000000000000000000900460ff1615610c4357600680547fffffffffffffffffffffff0000000000000000000000000000000000000000001690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c0245090600090a1565b6040517fa863aec900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b610c7f610f65565b610c75600061163e565b610ce5604051806101000160405280600067ffffffffffffffff168152602001600067ffffffffffffffff1681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b506000805463ffffffff680100000000000000009182900416825260056020818152604093849020845161010081018652815467ffffffffffffffff8082168352959004909416918401919091526001810154938301939093526002830154606083015260038301546080830152600483015460a083015282015460c082015260069091015460e082015290565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff16600081158015610dbe5750825b905060008267ffffffffffffffff166001148015610ddb5750303b155b905081158015610de9575080155b15610e20576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011785558315610e6b57845468ff00000000000000001916680100000000000000001785555b610e74866116c7565b610e7c6116d8565b600080547fffffffffffffffffffffffffffffffffffffffff0000000000000000ffffffff1668010000000000000000179055610eb988886116e0565b8315610f0457845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610f16610f65565b6001600160a01b038116610f59576040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260006004820152602401610942565b610f628161163e565b50565b33610f977f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610c75576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610942565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001811080610b925760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606401610942565b600080546801000000000000000080820463ffffffff16808452600560208181526040808720815161010081018352815467ffffffffffffffff808216835297900487168185015260018083015482850152600280840154606080850191909152600380860154608080870182905260048089015460a08901819052898d015460c08a018190526006909a01805460e0909a01999099528a51808d0194909452838b015282850198909852885180830390940184520190965280519087012085548355948590558354905595895293909252915490559390929091600c916111439185916c010000000000000000000000009004166159be565b82546101009290920a67ffffffffffffffff8181021990931691831602179091556000546040516c0100000000000000000000000090910490911681527fdb3558259e039d7e50e816b9dcce30fb114d8a9c86eca5ab14b60194d6945d3f915060200161073d565b60006111b56119d0565b6040805160088082526101208201909252919250600091906020820161010080368337019050509050600254816000815181106111f4576111f46159df565b602002602001018181525050836000015167ffffffffffffffff1681600181518110611222576112226159df565b602002602001018181525050836020015167ffffffffffffffff1681600281518110611250576112506159df565b602002602001018181525050836040015181600381518110611274576112746159df565b602002602001018181525050836060015181600481518110611298576112986159df565b6020908102919091018101919091526000805468010000000000000000900463ffffffff168152600591829052604090206003015482519091839181106112e1576112e16159df565b6020908102919091018101919091526000805468010000000000000000900463ffffffff1681526005909152604090206004015481518290600690811061132a5761132a6159df565b6020908102919091018101919091526000805468010000000000000000900463ffffffff168152600591829052604090200154815182906007908110611372576113726159df565b602002602001018181525050611389828285611fb2565b6113bf576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061145e57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166114527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b15610c75576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61149d610f65565b6040516001600160a01b03821681527ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d9060200161073d565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611530575060408051601f3d908101601f1916820190925261152d918101906159f5565b60015b611571576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610942565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146115cd576040517faa1d49a400000000000000000000000000000000000000000000000000000000815260048101829052602401610942565b6115d7838361209d565b505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c75576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080547fffffffffffffffffffffffff000000000000000000000000000000000000000081166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6116cf6120f3565b610f628161215a565b610c756120f3565b815167ffffffffffffffff161515806117065750602082015167ffffffffffffffff1615155b8061171357506080820151155b80611720575060a0820151155b8061172d575060c0820151155b8061173a575060e0820151155b80611749575063ffffffff8116155b15611780576040517fa1ba07ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600560008060049054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060208201518160000160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010155606082015181600201556080820151816003015560a0820151816004015560c0820151816005015560e0820151816006015590505081600560008060089054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060208201518160000160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010155606082015181600201556080820151816003015560a0820151816004015560c0820151816005015560e08201518160060155905050600080600c6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550806000806101000a81548163ffffffff021916908363ffffffff16021790555060006119b38360808082015160a083015160c0840151604080516020810194909452830191909152606082015260009101604051602081830303815290604052805190602001209050919050565b600181905560e09093015160028190556003939093555050600455565b6119d8615167565b621000008152600860208201527f20c9403133dfde9a9d382df76fb0523571648725abc0a7c12830bb690ec83b336040820151527f03a0a9acc3e3815a7ed6cb1379f7d157e6343164729376392a693acbd3ec283c6020604083015101527f2866c18ad1df10ef13542cce6250ce02cb2a6b72ae00a9852e271187e9e4e0db6060820151527f21be232a42246a5663ebf483470cca666ffe9d4f0e63b929c596a7658714e9706020606083015101527f07d77873b9860074118e75808c79468b83c8ed64ba14db5cb5afa8e534de7b996080820151527f0be0f448839080132d47de17de0099b4cd74ae1e6b71cdda06cdebb868a50c6d6020608083015101527f13bd45a023491eadea44cc3f24cfbd1796eade9c0e39ee81d9f63ea0a580662560a0820151527f18f95cdda42ce11d9d10a3b335acc214e3807c578c5359405d810c208df60093602060a083015101527f0970d978763461f09e9ec63454073497386e4d282fedc2ac5b967cb9fd3fa8a960c0820151527f28c2217f7bacf6f8b2b8ee4a90fcf8b5bca04205ea84e8e1eb54b85dd41bde28602060c083015101527f02fe3d02988db718380052970aba46a3296df5f29b736ba1f2c4ccffc8b5969360e0820151527f202c3e390cee7c5c8525da2329a19f4936f6f71ca97dde6c6fa32b382d5acc03602060e083015101527f23ac10ae6ca5cacee8744bb939aaa835390954b91ae668a2c8d0edda558a89e7610100820151527f1c8c2b856cdade256ba3237f39afd5e170a9532012f7aecae49d459b29f6f6ad602061010083015101527f16ec03d260bd7ac1c50ffa63565d5274b4582ceea52ff40b81cdfe8f444f01e4610120820151527f29392152723097e07113c3d7786d245ec40c30928015cd50b5668a4f4ea17031602061012083015101527f2cdbfb3a4053c8489b0c94e74338ac19118df7a06bc56b1eb4d0e0dc4eae7248610140820151527f07fea127dae943b8dc148f1408d40cff465c9c4721943669b1e4fd5a39db7036602061014083015101527f031455a79a2e0ce78a6cb53526ec04ac19716a86b08a93df48d178f8b77e5619610160820151527f118623e6bc136ee6d3f9907cd4ad04a9418ea03ba99ad753227cdfee598e8415602061016083015101527f0861d1997761a852226aac7ba9717bf6ae56451099be774cdf02ef352a58cbc8610180820151527f0805e392bcbc12e40a722778632d73fe981e4bc6fa6d1178b70af7be1cb9a3a3602061018083015101527f101d1e3978cb9f1e303d413144ebe67682c9eb0cfe11242959aa6029d78cdbbc6101a0820151527f089eb9c727e6cb07082bc3e6f40cf04f439fe48000602b584774dad7efc6607c60206101a083015101527f2d489f2493263aa873bcd94f21efb45bf257a61d81c0c95c3297916506653b406101c0820151527f18e45d627aadd4df2794ecd9909fac1a753f0c6fa8a9c6654a7a58b0912fffd560206101c083015101527f0e43e3a4b13cb438e2ad924614261ad0240214fa1c83fcda6a0bf779eb39ffc56101e0820151527f0eaba9f429c5f6fc3103d4cc4056c500ff42425d8e6465c5b8e145219f9c5cd360206101e083015101527f29ae351d09dcf41c0a80ab05393738358baab37e6fbc464b3bb13258994a1fa4610200820151527f2b7bc74608d7ec7dadd0597d6a4010d8bfc2b31900281901cedc42bdbb0fb8fc602061020083015101527f066802c7ceb9e913d4f65433a20661e097acac1affecbb534a54f76a29782226610220820151527f27ec80e811e636f3348267923c8e641bd98a7e37c5216670cbff14ae323f9e0e602061022083015101527f12604d1f87c583f6c9710c73eaf590af9d07aa743d1381d0e9dff0eab2614239610240820151527f1588579e6c3378ea32cb641205ef762a63cd353a0bd670394528ad2081ee8dd4602061024083015101527f247d65261d3a4ab042ba937331f6d0c0c5eb9ea78753a92084db1a6939e19e82610260820151527f2ce6cc664a32147bfe6a0c94a95bf0496679405ccae01648cd4ec021145120d56020610260830151015290565b6000611fbd82612162565b611fe083600081518110611fd357611fd36159df565b6020026020010151610fd9565b611ff683600181518110611fd357611fd36159df565b61200c83600281518110611fd357611fd36159df565b61202283600381518110611fd357611fd36159df565b61203883600481518110611fd357611fd36159df565b61204e83600581518110611fd357611fd36159df565b61206483600681518110611fd357611fd36159df565b61207a83600781518110611fd357611fd36159df565b600061208785858561229a565b90506120928161241b565b9150505b9392505050565b6120a6826128e3565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156120eb576115d7828261298b565b610b92612a03565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff16610c75576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f166120f3565b805161216d90612a3b565b61217a8160200151612a3b565b6121878160400151612a3b565b6121948160600151612a3b565b6121a18160800151612a3b565b6121ae8160a00151612a3b565b6121bb8160c00151612a3b565b6121c88160e00151612a3b565b6121d6816101000151612a3b565b6121e4816101200151612a3b565b6121f2816101400151612a3b565b612200816101600151612a3b565b61220e816101800151612a3b565b61221c816101a00151610fd9565b61222a816101c00151610fd9565b612238816101e00151610fd9565b612246816102000151610fd9565b612254816102200151610fd9565b612262816102400151610fd9565b612270816102600151610fd9565b61227e816102800151610fd9565b61228c816102a00151610fd9565b610f62816102c00151610fd9565b6122a26153e5565b83602001518351146122e0576040517f41f53b1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006122ed858585612ae5565b905060006122fe8660000151612e16565b90506000612311828460a00151886131fa565b60408051601e8082526103e0820190925291925060009190602082016103c080368337505060408051601e8082526103e082019092529293506000929150602082015b6040805180820190915260008082526020820152815260200190600190039081612354579050509050600061238d8a858a89878761325a565b60a08701516060870151919250907f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600081838509604080516101008101825260e09c8d0151815260208101969096528501525050506060810191909152608081019290925260a082015261016086015160c082015261018090950151928501929092525091949350505050565b6040805180820182526000808252602080830182905283518085018552828152908101829052835160028082526060820190955291937f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001939285918160200160208202803683375050604080516002808252606082019092529293506000929150602082015b60408051808201909152600080825260208201528152602001906001900390816124a157905050905060006001905080836000815181106124e4576124e46159df565b6020026020010181815250508760c0015182600081518110612508576125086159df565b602002602001018190525087600001518360018151811061252b5761252b6159df565b6020026020010181815250508760e001518260018151811061254f5761254f6159df565b6020026020010181905250612564828461328f565b6080890151519095506060935083925090506000612583826002615a0e565b61258e906001615a0e565b90508067ffffffffffffffff8111156125a9576125a96154a6565b6040519080825280602002602001820160405280156125d2578160200160208202803683370190505b5093508067ffffffffffffffff8111156125ee576125ee6154a6565b60405190808252806020026020018201604052801561263357816020015b604080518082019091526000808252602082015281526020019060019003908161260c5790505b509250505060008060005b8960800151518110156126d75789608001518181518110612661576126616159df565b602002602001015185838151811061267b5761267b6159df565b6020026020010181815250508960a00151818151811061269d5761269d6159df565b60200260200101518483815181106126b7576126b76159df565b60209081029190910101526126cd600183615a0e565b915060010161263e565b5088602001518482815181106126ef576126ef6159df565b6020026020010181815250508860c00151838281518110612712576127126159df565b6020908102919091010152612728600182615a0e565b895160408b01519192509060008982840990508087858151811061274e5761274e6159df565b6020026020010181815250505050508860e00151838281518110612774576127746159df565b602090810291909101015261278a600182615a0e565b60608a0151909150878184089250506127a282613389565b8482815181106127b4576127b46159df565b6020026020010181815250506127ec604080518082018252600080825260209182015281518083019092526001825260029082015290565b8382815181106127fe576127fe6159df565b602002602001018190525061281b612816848661328f565b6133df565b945050505050600060405180608001604052807f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b081526020017f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c181526020017f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e5581526020017f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe481525090506128d98382846128d461347e565b61354f565b9695505050505050565b806001600160a01b03163b600003612932576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610942565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516129a89190615a21565b600060405180830381855af49150503d80600081146129e3576040519150601f19603f3d011682016040523d82523d6000602084013e6129e8565b606091505b50915091506129f8858383613633565b925050505b92915050565b3415610c75576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160208201516000917f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47911590151615612a7557505050565b8251602084015182600384858586098509088382830914838210848410161693505050816115d75760405162461bcd60e51b815260206004820152601760248201527f426e3235343a20696e76616c696420473120706f696e740000000000000000006044820152606401610942565b612b2d60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040805180820190915260608152600060208201527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001612b6e8287876136a8565b81518451612b7b90613a89565b612b888660200151613a89565b612b958760400151613a89565b612ba28860600151613a89565b612baf8960800151613a89565b604051602001612bc496959493929190615a3d565b60408051601f198184030181529190528252612bdf82613b4c565b50612be982613b4c565b6060840152612bf782613b4c565b6080840152815160a0850151612c0c90613a89565b604051602001612c1d929190615abc565b60408051601f198184030181529190528252612c3882613b4c565b8352815160c0850151612c4a90613a89565b612c578660e00151613a89565b612c65876101000151613a89565b612c73886101200151613a89565b612c81896101400151613a89565b604051602001612c9696959493929190615a3d565b60408051601f198184030181529190528252612cb182613b4c565b60a084015281516101a0850151612cc790613bc0565b612cd5866101c00151613bc0565b612ce3876101e00151613bc0565b612cf1886102000151613bc0565b612cff896102200151613bc0565b604051602001612d1496959493929190615aeb565b60408051601f19818403018152919052808352610240850151612d3690613bc0565b612d44866102600151613bc0565b612d52876102800151613bc0565b612d60886102a00151613bc0565b612d6e896102c00151613bc0565b604051602001612d8396959493929190615aeb565b60408051601f198184030181529190528252612d9e82613b4c565b60c08401528151610160850151612db490613a89565b612dc2866101800151613a89565b604051602001612dd493929190615b27565b60408051601f198184030181529190528252612def82613b4c565b60e08401528251818180098282820960208601919091526040850152509195945050505050565b612e486040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b816201000003612edc57506040805160a0810182526010815260208101929092527f30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c1001908201527eeeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b760608201527f0b5d56b77fe704e8e92338c0082f37e091126414c830e4c6922d5ac802d842d4608082015290565b816202000003612f7157506040805160a0810182526011815260208101929092527f30643640b9f82f90e83b698e5ea6179c7c05542e859533b48b9953a2f5360801908201527f1bf82deba7d74902c3708cc6e70e61f30512eca95655210e276e5858ce8f58e560608201527f244cf010c43ca87237d8b00bf9dd50c4c01c7f086bd4e8c920e75251d96f0d22608082015290565b81620400000361300657506040805160a0810182526012815260208101929092527f30644259cd94e7dd5045d7a27013b7fcd21c9e3b7fa75222e7bda49b729b0401908201527f19ddbcaf3a8d46c15c0176fbb5b95e4dc57088ff13f4d1bd84c6bfa57dcdc0e060608201527f036853f083780e87f8d7c71d111119c57dbe118c22d5ad707a82317466c5174c608082015290565b81620800000361309b57506040805160a0810182526013815260208101929092527f3064486657634403844b0eac78ca882cfd284341fcb0615a15cfcd17b14d8201908201527f2260e724844bca5251829353968e4915305258418357473a5c1d597f613f6cbd60608201527f06e402c0a314fb67a15cf806664ae1b722dbc0efe66e6c81d98f9924ca535321608082015290565b81621000000361313057506040805160a0810182526014815260208101929092527f30644b6c9c4a72169e4daa317d25f04512ae15c53b34e8f5acd8e155d0a6c101908201527f26125da10a0ed06327508aba06d1e303ac616632dbed349f53422da95333785760608201527f100c332d2100895fab6473bc2c51bfca521f45cb3baca6260852a8fde26c91f3608082015290565b816020036131c357506040805160a0810182526005815260208101929092527f2ee12bff4a2813286a8dc388cd754d9a3ef2490635eba50cb9c2e5e750800001908201527f09c532c6306b93d29678200d47c0b2a99c18d51b838eeb1d3eed4c533bb512d060608201527f2724713603bfbd790aeaf3e7df25d8e7ef8f311334905b4d8c99980cf210979d608082015290565b6040517fe2ef09e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b61321e60405180606001604052806000815260200160008152602001600081525090565b6132288484613d0c565b8082526132389085908590613d72565b6020820152805161324e90859084908690613df8565b60408201529392505050565b600080613268858789613fbf565b90506132788886898988886140c1565b6132838187866143df565b98975050505050505050565b604080518082019091526000808252602082015282518251146132f45760405162461bcd60e51b815260206004820181905260248201527f4d534d206572726f723a206c656e67746820646f6573206e6f74206d617463686044820152606401610942565b6133328360008151811061330a5761330a6159df565b602002602001015183600081518110613325576133256159df565b6020026020010151614441565b905060015b82518110156133825761337882613373868481518110613359576133596159df565b6020026020010151868581518110613325576133256159df565b6144e5565b9150600101613337565b5092915050565b60006133b57f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183615b80565b6129fd907f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001615ba2565b6040805180820190915260008082526020820152815160208301511590151615613407575090565b6040518060400160405280836000015181526020017f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47846020015161344c9190615b80565b613476907f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47615ba2565b905292915050565b6134a96040518060800160405280600081526020016000815260200160008152602001600081525090565b60405180608001604052807f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81526020017f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281526020017f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa81526020017f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b815250905090565b60008060006040518751815260208801516020820152602087015160408201528651606082015260608701516080820152604087015160a0820152855160c0820152602086015160e08201526020850151610100820152845161012082015260608501516101408201526040850151610160820152602060006101808360085afa9150506000519150806136255760405162461bcd60e51b815260206004820152601c60248201527f426e3235343a2050616972696e6720636865636b206661696c656421000000006044820152606401610942565b50151590505b949350505050565b606082613648576136438261458c565b612096565b815115801561365f57506001600160a01b0384163b155b156136a1576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610942565b5080612096565b825160fe906136e36136b983613bc0565b6040516020016136cb91815260200190565b604051602081830303815290604052600060046145ce565b61371d6136f38660000151613bc0565b60405160200161370591815260200190565b604051602081830303815290604052600060086145ce565b61372d6136f38760200151613bc0565b6040516020016137409493929190615bb5565b60408051601f1981840301815291905280855261375d6001613bc0565b6137867f2f8dd1f1a7583c42c4e12a44e110404c73ca6c94813f85835da4fb7bb1301d4a613bc0565b6137af7f1ee678a0470a75a6eaa8fe837060498ba828a3703b311d0f77f010424afeb025613bc0565b6137d87f2042a587a90c187b0a087c03e29c968b950b1db26d5c82d666905a6895790c0a613bc0565b6138017f2e2b91456103698adf57b799969dea1c8f739da5d8d40dd3eb9222db7c81e881613bc0565b60405160200161381696959493929190615aeb565b60408051601f1981840301815291905280855260e084015161383790613a89565b613845856101000151613a89565b613853866101200151613a89565b613861876101400151613a89565b61386f886101600151613a89565b61387d896101800151613a89565b61388b8a6101e00151613a89565b6040516020016138a2989796959493929190615c0c565b60408051601f198184030181529190528085526102008401516138c490613a89565b6138d2856102200151613a89565b6138e0866102400151613a89565b6138ee876101a00151613a89565b6138fc886101c00151613a89565b61390a896102600151613a89565b6040516020016139209796959493929190615cb1565b60408051601f1981840301815291815281865284015161393f90613a89565b61394c8560600151613a89565b6139598660800151613a89565b6139668760a00151613a89565b6139738860c00151613a89565b60405160200161398896959493929190615a3d565b60408051601f1981840301815291905280855282516139bf9084906000906139b2576139b26159df565b6020026020010151613bc0565b6139d5846001815181106139b2576139b26159df565b6139eb856002815181106139b2576139b26159df565b613a01866003815181106139b2576139b26159df565b613a17876004815181106139b2576139b26159df565b613a2d886005815181106139b2576139b26159df565b613a43896006815181106139b2576139b26159df565b613a598a6007815181106139b2576139b26159df565b604051602001613a7199989796959493929190615d43565b60408051601f19818403018152919052909352505050565b805160208201516060916000911590151615613ac2577f4000000000000000000000000000000000000000000000000000000000000000175b60208301517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760019190911b10613b1657507f80000000000000000000000000000000000000000000000000000000000000005b8251613b23908217613bc0565b604051602001613b3591815260200190565b604051602081830303815290604052915050919050565b602080820151825180516040518381526000948594939291908101855b83811015613b835760208186018101518383015201613b69565b505060209182019020908601819052925060006128d97f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185615b80565b60008190506008817eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff16901b6008827fff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff0016901c1790506010817dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff16901b6010827fffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff000016901c1790506020817bffffffff00000000ffffffff00000000ffffffff00000000ffffffff16901b6020827fffffffff00000000ffffffff00000000ffffffff00000000ffffffff0000000016901c17905060408177ffffffffffffffff0000000000000000ffffffffffffffff16901b6040827fffffffffffffffff0000000000000000ffffffffffffffff000000000000000016901c179050608081901b608082901c179050919050565b81516000907f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190838015613d625784935060005b82811015613d5657838586099450600101613d40565b50600184039350613d69565b6001830393505b50505092915050565b600082600103613d8457506001612096565b81600003613d9457506000612096565b60408401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190600090828186099050858015613dd657600187039250613ddd565b6001840392505b50613de7826146f6565b915082828209979650505050505050565b82516000907f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190838303613e8b57600160005b82811015613e7e57818703613e5f57878181518110613e4c57613e4c6159df565b602002602001015194505050505061362b565b8380613e6d57613e6d615b6a565b896060015183099150600101613e2b565b506000935050505061362b565b6000806000808a604001519050600080613ea58d886147ae565b905060008767ffffffffffffffff811115613ec257613ec26154a6565b604051908082528060200260200182016040528015613eeb578160200160208202803683370190505b509050888b850993506001925060005b88811015613f3057602081026020840101519550898d878c030896508987850960208281028401018890529350600101613efb565b50613f3a836146f6565b925060005b88811015613fad5760208102602084010151955089868609975089848909975060005b89811015613f8c57808214613f84576020810260208401015197508a888a0998505b600101613f62565b506020810260208f010151955089868909975089888c089a50600101613f3f565b50505050505050505050949350505050565b6000807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019050600083602001519050600084604001519050600060019050606088015160808901516101a08901516102408a01518788898387098a868608088609945050506101c08901516102608a01518788898387098a868608088609945050506101e08901516102808a01518788898387098a868608088609945050506102008901516102a08a01518788898387098a8686080886099450505061022089015191506102c0890151868782898587080985099350505050875160208901518586868309870385089650508485838309860387089998505050505050505050565b6140cf86868686858761489f565b60c085015182517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000191908190819086906014908110614110576141106159df565b602002602001018181525050856000015184601481518110614134576141346159df565b60200260200101819052508282820990508085601581518110614159576141596159df565b60200260200101818152505085602001518460158151811061417d5761417d6159df565b602002602001018190525082828209905080856016815181106141a2576141a26159df565b6020026020010181815250508560400151846016815181106141c6576141c66159df565b602002602001018190525082828209905080856017815181106141eb576141eb6159df565b60200260200101818152505085606001518460178151811061420f5761420f6159df565b60200260200101819052508282820990508085601881518110614234576142346159df565b602002602001018181525050856080015184601881518110614258576142586159df565b6020026020010181905250828282099050808560198151811061427d5761427d6159df565b6020026020010181815250508860400151846019815181106142a1576142a16159df565b60200260200101819052508282820990508085601a815181106142c6576142c66159df565b602002602001018181525050886060015184601a815181106142ea576142ea6159df565b60200260200101819052508282820990508085601b8151811061430f5761430f6159df565b602002602001018181525050886080015184601b81518110614333576143336159df565b60200260200101819052508282820990508085601c81518110614358576143586159df565b6020026020010181815250508860a0015184601c8151811061437c5761437c6159df565b60200260200101819052508282820990508760e0015185601d815181106143a5576143a56159df565b6020026020010181815250508560a0015184601d815181106143c9576143c96159df565b6020026020010181905250505050505050505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018381039060005b600a8110156144385760206015820102840151602082026101a0018601518384828409860894505050600101614407565b50509392505050565b604080518082019091526000808252602082015261445d615438565b835181526020808501519082015260408101839052600060608360808460076107d05a03fa9050808061448f57600080fd5b50806144dd5760405162461bcd60e51b815260206004820152601960248201527f426e3235343a207363616c6172206d756c206661696c656421000000000000006044820152606401610942565b505092915050565b6040805180820190915260008082526020820152614501615456565b8351815260208085015181830152835160408301528301516060808301919091526000908360c08460066107d05a03fa9050808061453e57600080fd5b50806144dd5760405162461bcd60e51b815260206004820152601d60248201527f426e3235343a2067726f7570206164646974696f6e206661696c6564210000006044820152606401610942565b80511561459c5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060816145dc81601f615a0e565b101561462a5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610942565b6146348284615a0e565b845110156146845760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610942565b6060821580156146a357604051915060008252602082016040526146ed565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156146dc5780518352602092830192016146c4565b5050858452601f01601f1916604052505b50949350505050565b60008060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001905060405160208152602080820152602060408201528460608201526002820360808201528160a08201526020600060c08360055afa9250506000519250816147a75760405162461bcd60e51b815260206004820152601d60248201527f426e3235343a20706f7720707265636f6d70696c65206661696c6564210000006044820152606401610942565b5050919050565b606082602001518211156147ee576040517f8c5e11f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606083015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018467ffffffffffffffff81111561482f5761482f6154a6565b604051908082528060200260200182016040528015614858578160200160208202803683370190505b50935084151915613d695760208401856020028101600182526020820191505b8082101561489457828585099350838252602082019150614878565b505050505092915050565b6000806000806000807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190508060208b015160208d01510995508a5193508060a08c015160608d0151099250806101a08a0151840891508060808c015183089150808483099350807f2f8dd1f1a7583c42c4e12a44e110404c73ca6c94813f85835da4fb7bb1301d4a84099150806101c08a0151830891508060808c015183089150808483099350807f1ee678a0470a75a6eaa8fe837060498ba828a3703b311d0f77f010424afeb02584099150806101e08a0151830891508060808c015183089150808483099350807f2042a587a90c187b0a087c03e29c968b950b1db26d5c82d666905a6895790c0a84099150806102008a0151830891508060808c015183089150808483099350807f2e2b91456103698adf57b799969dea1c8f739da5d8d40dd3eb9222db7c81e88184099150806102208a0151830891508060808c0151830891508084830993508084870895508860a0015188600081518110614a2857614a286159df565b60200260200101819052508587600081518110614a4757614a476159df565b6020026020010181815250508060608c01518c51099450806102c08a015186099450806102408a015160608d0151099250806101a08a0151840892508060808c015184089250808386099450806102608a015160608d0151099250806101c08a0151840892508060808c015184089250808386099450806102808a015160608d0151099250806101e08a0151840892508060808c015184089250808386099450806102a08a015160608d0151099250806102008a0151840892508060808c0151840892508083860994508b60c0015188600181518110614b2957614b296159df565b6020908102919091010152614b3e8582615ba2565b87600181518110614b5157614b516159df565b602002602001018181525050886101a0015187600281518110614b7657614b766159df565b602002602001018181525050886101c0015187600381518110614b9b57614b9b6159df565b602002602001018181525050886101e0015187600481518110614bc057614bc06159df565b60200260200101818152505088610200015187600581518110614be557614be56159df565b6020026020010181815250508b60e0015188600281518110614c0957614c096159df565b60200260200101819052508b610100015188600381518110614c2d57614c2d6159df565b60200260200101819052508b610120015188600481518110614c5157614c516159df565b60200260200101819052508b610140015188600581518110614c7557614c756159df565b6020026020010181905250806101c08a01516101a08b01510992508287600681518110614ca457614ca46159df565b6020026020010181815250508b610160015188600681518110614cc957614cc96159df565b6020026020010181905250806102008a01516101e08b01510992508287600781518110614cf857614cf86159df565b6020026020010181815250508b610180015188600781518110614d1d57614d1d6159df565b60200260200101819052506101a089015192508083840991508082830991508082840992508287600881518110614d5657614d566159df565b6020026020010181815250508b6101e0015188600881518110614d7b57614d7b6159df565b60200260200101819052506101c089015192508083840991508082830991508082840992508287600981518110614db457614db46159df565b6020026020010181815250508b610200015188600981518110614dd957614dd96159df565b60200260200101819052506101e089015192508083840991508082830991508082840992508287600a81518110614e1257614e126159df565b6020026020010181815250508b610220015188600a81518110614e3757614e376159df565b602002602001018190525061020089015192508083840991508082830991508082840992508287600b81518110614e7057614e706159df565b6020026020010181815250508b610240015188600b81518110614e9557614e956159df565b602002602001018190525088610220015181614eb19190615ba2565b87600c81518110614ec457614ec46159df565b6020026020010181815250508b6101a0015188600c81518110614ee957614ee96159df565b6020026020010181905250600187600d81518110614f0957614f096159df565b6020026020010181815250508b6101c0015188600d81518110614f2e57614f2e6159df565b6020026020010181905250806101c08a01516101a08b0151099250806101e08a015184099250806102008a015184099250806102208a0151840992508287600e81518110614f7e57614f7e6159df565b6020026020010181815250508b610260015188600e81518110614fa357614fa36159df565b60209081029190910101528951614fba9082615ba2565b87600f81518110614fcd57614fcd6159df565b6020026020010181815250508860c0015188600f81518110614ff157614ff16159df565b60200260200101819052508060018b510860a08c0151909350819080099150808284099250808360206010028901510991508187601081518110615037576150376159df565b6020026020010181815250508860e001518860108151811061505b5761505b6159df565b6020026020010181905250808360206011028901510991508187601181518110615087576150876159df565b602002602001018181525050886101000151886011815181106150ac576150ac6159df565b60200260200101819052508083602060120289015109915081876012815181106150d8576150d86159df565b602002602001018181525050886101200151886012815181106150fd576150fd6159df565b6020026020010181905250808360206013028901510991508187601381518110615129576151296159df565b6020026020010181815250508861014001518860138151811061514e5761514e6159df565b6020026020010181905250505050505050505050505050565b604051806102800160405280600081526020016000815260200161519e604051806040016040528060008152602001600081525090565b81526020016151c0604051806040016040528060008152602001600081525090565b81526020016151e2604051806040016040528060008152602001600081525090565b8152602001615204604051806040016040528060008152602001600081525090565b8152602001615226604051806040016040528060008152602001600081525090565b8152602001615248604051806040016040528060008152602001600081525090565b815260200161526a604051806040016040528060008152602001600081525090565b815260200161528c604051806040016040528060008152602001600081525090565b81526020016152ae604051806040016040528060008152602001600081525090565b81526020016152d0604051806040016040528060008152602001600081525090565b81526020016152f2604051806040016040528060008152602001600081525090565b8152602001615314604051806040016040528060008152602001600081525090565b8152602001615336604051806040016040528060008152602001600081525090565b8152602001615358604051806040016040528060008152602001600081525090565b815260200161537a604051806040016040528060008152602001600081525090565b815260200161539c604051806040016040528060008152602001600081525090565b81526020016153be604051806040016040528060008152602001600081525090565b81526020016153e0604051806040016040528060008152602001600081525090565b905290565b6040518061010001604052806000815260200160008152602001600081526020016000815260200160608152602001606081526020016153be604051806040016040528060008152602001600081525090565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b80356001600160a01b03811681146131f557600080fd5b60006020828403121561549d57600080fd5b61209682615474565b634e487b7160e01b600052604160045260246000fd5b6040516102e0810167ffffffffffffffff811182821017156154e0576154e06154a6565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561550f5761550f6154a6565b604052919050565b803567ffffffffffffffff811681146131f557600080fd5b600061010080838503121561554357600080fd5b6040519081019067ffffffffffffffff82118183101715615566576155666154a6565b8160405280925061557684615517565b815261558460208501615517565b602082015260408401356040820152606084013560608201526080840135608082015260a084013560a082015260c084013560c082015260e084013560e0820152505092915050565b6000604082840312156155df57600080fd5b6040516040810181811067ffffffffffffffff82111715615602576156026154a6565b604052823581526020928301359281019290925250919050565b60008082840361058081121561563157600080fd5b61563b858561552f565b9250610100610480807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008401121561567257600080fd5b61567a6154bc565b9250615688878388016155cd565b8352610140615699888289016155cd565b60208501526101806156ad89828a016155cd565b60408601526101c06156c18a828b016155cd565b60608701526102006156d58b828c016155cd565b60808801526102406156e98c828d016155cd565b60a08901526102806156fd8d828e016155cd565b60c08a01526102c06157118e828f016155cd565b60e08b01526157248e6103008f016155cd565b898b01526157368e6103408f016155cd565b6101208b015261574a8e6103808f016155cd565b878b015261575c8e6103c08f016155cd565b6101608b01526157708e6104008f016155cd565b868b01526104408d01356101a08b01526104608d0135858b0152878d01356101e08b01526104a08d0135848b01526104c08d01356102208b01526104e08d0135838b01526105008d01356102608b01526105208d0135828b01526105408d01356102a08b01526105608d0135818b0152505050505050505050809150509250929050565b6000806040838503121561580757600080fd5b61581083615474565b915060208084013567ffffffffffffffff8082111561582e57600080fd5b818601915086601f83011261584257600080fd5b813581811115615854576158546154a6565b61586684601f19601f840116016154e6565b9150808252878482850101111561587c57600080fd5b80848401858401376000848284010152508093505050509250929050565b803563ffffffff811681146131f557600080fd5b6000602082840312156158c057600080fd5b6120968261589a565b600080600061014084860312156158df57600080fd5b6158e9858561552f565b92506158f8610100850161589a565b91506159076101208501615474565b90509250925092565b6000610100828403121561592357600080fd5b612096838361552f565b60005b83811015615948578181015183820152602001615930565b50506000910152565b602081526000825180602084015261597081604085016020870161592d565b601f01601f19169190910160400192915050565b634e487b7160e01b600052601160045260246000fd5b67ffffffffffffffff8181168382160280821691908281146144dd576144dd615984565b67ffffffffffffffff81811683821601908082111561338257613382615984565b634e487b7160e01b600052603260045260246000fd5b600060208284031215615a0757600080fd5b5051919050565b808201808211156129fd576129fd615984565b60008251615a3381846020870161592d565b9190910192915050565b600087516020615a508285838d0161592d565b885191840191615a638184848d0161592d565b8851920191615a758184848c0161592d565b8751920191615a878184848b0161592d565b8651920191615a998184848a0161592d565b8551920191615aab818484890161592d565b919091019998505050505050505050565b60008351615ace81846020880161592d565b835190830190615ae281836020880161592d565b01949350505050565b60008751615afd818460208c0161592d565b9190910195865250602085019390935260408401919091526060830152608082015260a001919050565b60008451615b3981846020890161592d565b845190830190615b4d81836020890161592d565b8451910190615b6081836020880161592d565b0195945050505050565b634e487b7160e01b600052601260045260246000fd5b600082615b9d57634e487b7160e01b600052601260045260246000fd5b500690565b818103818111156129fd576129fd615984565b60008551615bc7818460208a0161592d565b855190830190615bdb818360208a0161592d565b8551910190615bee81836020890161592d565b8451910190615c0181836020880161592d565b019695505050505050565b600089516020615c1f8285838f0161592d565b8a5191840191615c328184848f0161592d565b8a51920191615c448184848e0161592d565b8951920191615c568184848d0161592d565b8851920191615c688184848c0161592d565b8751920191615c7a8184848b0161592d565b8651920191615c8c8184848a0161592d565b8551920191615c9e818484890161592d565b919091019b9a5050505050505050505050565b600088516020615cc48285838e0161592d565b895191840191615cd78184848e0161592d565b8951920191615ce98184848d0161592d565b8851920191615cfb8184848c0161592d565b8751920191615d0d8184848b0161592d565b8651920191615d1f8184848a0161592d565b8551920191615d31818484890161592d565b919091019a9950505050505050505050565b60008a51615d55818460208f0161592d565b9190910198895250602088019690965260408701949094526060860192909252608085015260a084015260c083015260e08201526101000191905056fea164736f6c6343000817000a"
+"0x60a0604052306080523480156200001557600080fd5b506200002062000026565b620000da565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000775760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d75780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051615a4962000104600039600081816114320152818161145b01526115c70152615a496000f3fe6080604052600436106101525760003560e01c8063013fa5fc146101575780630d8e6e2c14610179578063313df7b1146101ab578063382b215a146101d8578063409939b7146101fc5780634847ae5d1461021c5780634f1ef2861461029e57806352d1902d146102b157806354646085146102c657806362827733146102db57806369cc6a04146102f15780637053fc5114610306578063715018a61461031b578063766718081461033057806376b6b7cb146103645780637f17baad1461037a57806382d07ff31461042d5780638584d23f146104425780638da5cb5b14610486578063a244d5961461049b578063a51e6fea146104bb578063aa922732146104db578063ad3cb1cc146104fb578063bd32519a14610539578063ca6fe8551461056a578063db13b60a14610580578063e0303301146105bf578063f0682054146105df578063f2fde38b14610611575b600080fd5b34801561016357600080fd5b50610177610172366004614fa1565b610631565b005b34801561018557600080fd5b506040805160018152600060208201819052918101919091526060015b60405180910390f35b3480156101b757600080fd5b506006546101cb906001600160a01b031681565b6040516101a29190614fbc565b3480156101e457600080fd5b506101ee60035481565b6040519081526020016101a2565b34801561020857600080fd5b50610177610217366004615141565b6106f1565b34801561022857600080fd5b50610231610a1c565b6040516101a2919060006101008201905060018060401b038084511683528060208501511660208401525060408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015292915050565b6101776102ac3660046152fb565b610aae565b3480156102bd57600080fd5b506101ee610acd565b3480156102d257600080fd5b506008546101ee565b3480156102e757600080fd5b506101ee60025481565b3480156102fd57600080fd5b50610177610aea565b34801561031257600080fd5b506007546101ee565b34801561032757600080fd5b50610177610b5a565b34801561033c57600080fd5b5060005461035790600160601b90046001600160401b031681565b6040516101a291906153a0565b34801561037057600080fd5b506101ee60015481565b34801561038657600080fd5b506103e76103953660046153c8565b600560208190526000918252604090912080546001820154600283015460038401546004850154958501546006909501546001600160401b0380861697600160401b9096041695939492939192919088565b604080516001600160401b03998a168152989097166020890152958701949094526060860192909252608085015260a084015260c083015260e0820152610100016101a2565b34801561043957600080fd5b50610231610b6c565b34801561044e57600080fd5b5061046261045d3660046153e3565b610bfc565b6040805182516001600160401b0316815260209283015192810192909252016101a2565b34801561049257600080fd5b506101cb610d56565b3480156104a757600080fd5b506101776104b63660046153fc565b610d71565b3480156104c757600080fd5b506101ee6104d63660046153e3565b610e9c565b3480156104e757600080fd5b506101ee6104f6366004615443565b610ebd565b34801561050757600080fd5b5061052c604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101a29190615484565b34801561054557600080fd5b5060065461055a90600160a01b900460ff1681565b60405190151581526020016101a2565b34801561057657600080fd5b506101ee60045481565b34801561058c57600080fd5b506105a061059b3660046153e3565b610f05565b604080516001600160401b0390931683526020830191909152016101a2565b3480156105cb57600080fd5b5061055a6105da3660046154b7565b610f3d565b3480156105eb57600080fd5b506000546105fc9063ffffffff1681565b60405163ffffffff90911681526020016101a2565b34801561061d57600080fd5b5061017761062c366004614fa1565b611020565b61063961105e565b6001600160a01b0381166106605760405163e6c4247b60e01b815260040160405180910390fd5b6006546001600160a01b039081169082160361068f5760405163a863aec960e01b815260040160405180910390fd5b600680546001600160a81b0319166001600160a01b0380841691909117600160a01b17918290556040517f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072926106e6921690614fbc565b60405180910390a150565b600654600160a01b900460ff16801561071557506006546001600160a01b03163314155b1561075c576006546001600160a01b0316610743576040516312e6d1e760e11b815260040160405180910390fd5b6040516301474c8f60e71b815260040160405180910390fd5b610764610b6c565b5182516001600160401b0391821691161115806107a25750610784610b6c565b602001516001600160401b031682602001516001600160401b031611155b156107c05760405163051c46ef60e01b815260040160405180910390fd5b600080546107e59063ffffffff811690600160601b90046001600160401b03166154ef565b6000805463ffffffff600160401b91829004168252600560205260409091205491925090046001600160401b039081169082161480158161083b5750816001600160401b031684602001516001600160401b0316115b15610864578160405163036466bf60e31b815260040161085b91906153a0565b60405180910390fd5b6108718460400151611090565b61087e8460600151611090565b61088b8460800151611090565b6108988460a00151611090565b6108a58460c00151611090565b80156108b3576108b36110ec565b6108bd8484611237565b60008054600160401b9081900463ffffffff168252600560208181526040808520895181548b850180516001600160401b039384166001600160801b0319909316929092179183169097021782558a8301805160018085019190915560608d015160028086019190915560808e0151600386015560a08e0151600486015560c08e01519785019790975560e08d01516006909401939093556007805480850182559089524360008051602061591d833981519152909101558351808501855287518316815281518187019081526008805495860181559099525160008051602061599d8339815191529390960292830180546001600160401b0319169683169690961790955595516000805160206159dd83398151915290910155925188519251935193845284169391909116917fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6910160405180910390a350505050565b610a24614d9f565b5060008054600160201b900463ffffffff1681526005602081815260409283902083516101008101855281546001600160401b038082168352600160401b90910416928101929092526001810154938201939093526002830154606082015260038301546080820152600483015460a08201529082015460c082015260069091015460e082015290565b610ab6611427565b610abf826114cc565b610ac98282611503565b5050565b6000610ad76115bc565b5060008051602061595d83398151915290565b610af261105e565b600654600160a01b900460ff1615610b3f57600680546001600160a81b03191690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c0245090600090a1565b60405163a863aec960e01b815260040160405180910390fd5b565b610b6261105e565b610b586000611605565b610b74614d9f565b506000805463ffffffff600160401b918290041682526005602081815260409384902084516101008101865281546001600160401b038082168352959004909416918401919091526001810154938301939093526002830154606083015260038301546080830152600483015460a083015282015460c082015260069091015460e082015290565b60408051808201909152600080825260208201526008805490610c20600183615512565b81548110610c3057610c30615525565b60009182526020909120600290910201546001600160401b03168310610c6957604051631856a49960e21b815260040160405180910390fd5b60005b81811015610cfe578360088281548110610c8857610c88615525565b60009182526020909120600290910201546001600160401b03161115610cf65760088181548110610cbb57610cbb615525565b60009182526020918290206040805180820190915260029092020180546001600160401b031682526001015491810191909152949350505050565b600101610c6c565b506008610d0c600183615512565b81548110610d1c57610d1c615525565b60009182526020918290206040805180820190915260029092020180546001600160401b0316825260010154918101919091529392505050565b600080610d61611661565b546001600160a01b031692915050565b6000610d7b611685565b805490915060ff600160401b82041615906001600160401b0316600081158015610da25750825b90506000826001600160401b03166001148015610dbe5750303b155b905081158015610dcc575080155b15610dea5760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b03191660011785558315610e1357845460ff60401b1916600160401b1785555b610e1c866116a9565b610e246116ba565b60008054600160201b600160601b031916600160401b179055610e4788886116c2565b8315610e9257845460ff60401b191685556040517fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290610e89906001906153a0565b60405180910390a15b5050505050505050565b60078181548110610eac57600080fd5b600091825260209091200154905081565b60808082015160a083015160c0840151604080516020810194909452830191909152606082015260009101604051602081830303815290604052805190602001209050919050565b60088181548110610f1557600080fd5b6000918252602090912060029091020180546001909101546001600160401b03909116915082565b60075460009043841180610f515750600381105b15610f6f5760405163b0b4387760e01b815260040160405180910390fd5b60008080610f7e600185615512565b90505b81610fe9578660078281548110610f9a57610f9a615525565b906000526020600020015411610fcf576001915060078181548110610fc157610fc1615525565b906000526020600020015492505b60028110610fe95780610fe18161553b565b915050610f81565b816110075760405163b0b4387760e01b815260040160405180910390fd5b856110128489615512565b119450505050505b92915050565b61102861105e565b6001600160a01b038116611052576000604051631e4fbdf760e01b815260040161085b9190614fbc565b61105b81611605565b50565b33611067610d56565b6001600160a01b031614610b58573360405163118cdaa760e01b815260040161085b9190614fbc565b60008051602061597d833981519152811080610ac95760405162461bcd60e51b815260206004820152601b60248201527a109b8c8d4d0e881a5b9d985b1a59081cd8d85b185c88199a595b19602a1b604482015260640161085b565b6000805463ffffffff600160401b9182900416825260056020818152604080852081516101008101835281546001600160401b038082168352969004909516928501929092526001820154908401526002810154606084015260038101546080840152600481015460a08401529081015460c08301526006015460e082015261117490610ebd565b600380546001908155908290556004805460025560008054600160401b810463ffffffff16825260056020526040822060060154909255929350909190600c906111cf908490600160601b90046001600160401b0316615552565b92506101000a8154816001600160401b0302191690836001600160401b031602179055507fdb3558259e039d7e50e816b9dcce30fb114d8a9c86eca5ab14b60194d6945d3f6000600c9054906101000a90046001600160401b03166040516106e691906153a0565b60006112416119e5565b60408051600880825261012082019092529192506000919060208201610100803683370190505090506002548160008151811061128057611280615525565b60200260200101818152505083600001516001600160401b0316816001815181106112ad576112ad615525565b60200260200101818152505083602001516001600160401b0316816002815181106112da576112da615525565b6020026020010181815250508360400151816003815181106112fe576112fe615525565b60200260200101818152505083606001518160048151811061132257611322615525565b60209081029190910181019190915260008054600160401b900463ffffffff1681526005918290526040902060030154825190918391811061136657611366615525565b60209081029190910181019190915260008054600160401b900463ffffffff168152600590915260409020600401548151829060069081106113aa576113aa615525565b60209081029190910181019190915260008054600160401b900463ffffffff1681526005918290526040902001548151829060079081106113ed576113ed615525565b602002602001018181525050611404828285611fc7565b611421576040516309bde33960e01b815260040160405180910390fd5b50505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806114ae57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166114a260008051602061595d833981519152546001600160a01b031690565b6001600160a01b031614155b15610b585760405163703e46dd60e11b815260040160405180910390fd5b6114d461105e565b7ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d816040516106e69190614fbc565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561155d575060408051601f3d908101601f1916820190925261155a91810190615572565b60015b61157c5781604051634c9c8ce360e01b815260040161085b9190614fbc565b60008051602061595d83398151915281146115ad57604051632a87526960e21b81526004810182905260240161085b565b6115b783836120b2565b505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b585760405163703e46dd60e11b815260040160405180910390fd5b600061160f611661565b80546001600160a01b038481166001600160a01b031983168117845560405193945091169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930090565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0090565b6116b1612108565b61105b8161212d565b610b58612108565b81516001600160401b03161515806116e6575060208201516001600160401b031615155b806116f357506080820151155b80611700575060a0820151155b8061170d575060c0820151155b8061171a575060e0820151155b80611729575063ffffffff8116155b15611747576040516350dd03f760e11b815260040160405180910390fd5b81600560008060049054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b0316021790555060208201518160000160086101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160010155606082015181600201556080820151816003015560a0820151816004015560c0820151816005015560e0820151816006015590505081600560008060089054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b0316021790555060208201518160000160086101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160010155606082015181600201556080820151816003015560a0820151816004015560c0820151816005015560e08201518160060155905050600080600c6101000a8154816001600160401b0302191690836001600160401b03160217905550806000806101000a81548163ffffffff021916908363ffffffff160217905550600061192d83610ebd565b600181815560e0850151600281815560039390935560045560078054808301825560009182524360008051602061591d833981519152909101556040805180820182526020808901516001600160401b0390811683529290980151978101978852600880549485018155909252905160008051602061599d8339815191529290930291820180546001600160401b031916939091169290921790915592516000805160206159dd833981519152909301929092555050565b6119ed614df6565b621000008152600860208201527f20c9403133dfde9a9d382df76fb0523571648725abc0a7c12830bb690ec83b336040820151527f03a0a9acc3e3815a7ed6cb1379f7d157e6343164729376392a693acbd3ec283c6020604083015101527f2866c18ad1df10ef13542cce6250ce02cb2a6b72ae00a9852e271187e9e4e0db6060820151527f21be232a42246a5663ebf483470cca666ffe9d4f0e63b929c596a7658714e9706020606083015101527f07d77873b9860074118e75808c79468b83c8ed64ba14db5cb5afa8e534de7b996080820151527f0be0f448839080132d47de17de0099b4cd74ae1e6b71cdda06cdebb868a50c6d6020608083015101527f13bd45a023491eadea44cc3f24cfbd1796eade9c0e39ee81d9f63ea0a580662560a0820151527f18f95cdda42ce11d9d10a3b335acc214e3807c578c5359405d810c208df60093602060a083015101527f0970d978763461f09e9ec63454073497386e4d282fedc2ac5b967cb9fd3fa8a960c0820151527f28c2217f7bacf6f8b2b8ee4a90fcf8b5bca04205ea84e8e1eb54b85dd41bde28602060c083015101527f02fe3d02988db718380052970aba46a3296df5f29b736ba1f2c4ccffc8b5969360e0820151527f202c3e390cee7c5c8525da2329a19f4936f6f71ca97dde6c6fa32b382d5acc03602060e083015101527f23ac10ae6ca5cacee8744bb939aaa835390954b91ae668a2c8d0edda558a89e7610100820151527f1c8c2b856cdade256ba3237f39afd5e170a9532012f7aecae49d459b29f6f6ad602061010083015101527f16ec03d260bd7ac1c50ffa63565d5274b4582ceea52ff40b81cdfe8f444f01e4610120820151527f29392152723097e07113c3d7786d245ec40c30928015cd50b5668a4f4ea17031602061012083015101527f2cdbfb3a4053c8489b0c94e74338ac19118df7a06bc56b1eb4d0e0dc4eae7248610140820151527f07fea127dae943b8dc148f1408d40cff465c9c4721943669b1e4fd5a39db7036602061014083015101527f031455a79a2e0ce78a6cb53526ec04ac19716a86b08a93df48d178f8b77e5619610160820151527f118623e6bc136ee6d3f9907cd4ad04a9418ea03ba99ad753227cdfee598e8415602061016083015101527f0861d1997761a852226aac7ba9717bf6ae56451099be774cdf02ef352a58cbc8610180820151527f0805e392bcbc12e40a722778632d73fe981e4bc6fa6d1178b70af7be1cb9a3a3602061018083015101527f101d1e3978cb9f1e303d413144ebe67682c9eb0cfe11242959aa6029d78cdbbc6101a0820151527f089eb9c727e6cb07082bc3e6f40cf04f439fe48000602b584774dad7efc6607c60206101a083015101527f2d489f2493263aa873bcd94f21efb45bf257a61d81c0c95c3297916506653b406101c0820151527f18e45d627aadd4df2794ecd9909fac1a753f0c6fa8a9c6654a7a58b0912fffd560206101c083015101527f0e43e3a4b13cb438e2ad924614261ad0240214fa1c83fcda6a0bf779eb39ffc56101e0820151527f0eaba9f429c5f6fc3103d4cc4056c500ff42425d8e6465c5b8e145219f9c5cd360206101e083015101527f29ae351d09dcf41c0a80ab05393738358baab37e6fbc464b3bb13258994a1fa4610200820151527f2b7bc74608d7ec7dadd0597d6a4010d8bfc2b31900281901cedc42bdbb0fb8fc602061020083015101527f066802c7ceb9e913d4f65433a20661e097acac1affecbb534a54f76a29782226610220820151527f27ec80e811e636f3348267923c8e641bd98a7e37c5216670cbff14ae323f9e0e602061022083015101527f12604d1f87c583f6c9710c73eaf590af9d07aa743d1381d0e9dff0eab2614239610240820151527f1588579e6c3378ea32cb641205ef762a63cd353a0bd670394528ad2081ee8dd4602061024083015101527f247d65261d3a4ab042ba937331f6d0c0c5eb9ea78753a92084db1a6939e19e82610260820151527f2ce6cc664a32147bfe6a0c94a95bf0496679405ccae01648cd4ec021145120d56020610260830151015290565b6000611fd282612135565b611ff583600081518110611fe857611fe8615525565b6020026020010151611090565b61200b83600181518110611fe857611fe8615525565b61202183600281518110611fe857611fe8615525565b61203783600381518110611fe857611fe8615525565b61204d83600481518110611fe857611fe8615525565b61206383600581518110611fe857611fe8615525565b61207983600681518110611fe857611fe8615525565b61208f83600781518110611fe857611fe8615525565b600061209c85858561226d565b90506120a7816123b7565b9150505b9392505050565b6120bb82612816565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115612100576115b78282612872565b610ac96128e8565b612110612907565b610b5857604051631afcd79f60e31b815260040160405180910390fd5b611028612108565b805161214090612921565b61214d8160200151612921565b61215a8160400151612921565b6121678160600151612921565b6121748160800151612921565b6121818160a00151612921565b61218e8160c00151612921565b61219b8160e00151612921565b6121a9816101000151612921565b6121b7816101200151612921565b6121c5816101400151612921565b6121d3816101600151612921565b6121e1816101800151612921565b6121ef816101a00151611090565b6121fd816101c00151611090565b61220b816101e00151611090565b612219816102000151611090565b612227816102200151611090565b612235816102400151611090565b612243816102600151611090565b612251816102800151611090565b61225f816102a00151611090565b61105b816102c00151611090565b612275614efa565b836020015183511461229a576040516320fa9d8960e11b815260040160405180910390fd5b60006122a78585856129af565b905060006122b88660000151612cce565b905060006122cb828460a0015188613099565b60408051601e8082526103e0820190925291925060009190602082016103c080368337505060408051601e8082526103e082019092529293506000929150602082015b612316614f34565b81526020019060019003908161230e579050509050600061233b8a858a8987876130f9565b60a087015160608701519192509060008051602061597d833981519152600081838509604080516101008101825260e09c8d0151815260208101969096528501525050506060810191909152608081019290925260a082015261016086015160c082015261018090950151928501929092525091949350505050565b600060008051602061597d8339815191526123d0614f34565b6123d8614f34565b6040805160028082526060820183526000926020830190803683375050604080516002808252606082019092529293506000929150602082015b61241a614f34565b815260200190600190039081612412579050509050600060019050808360008151811061244957612449615525565b6020026020010181815250508760c001518260008151811061246d5761246d615525565b602002602001018190525087600001518360018151811061249057612490615525565b6020026020010181815250508760e00151826001815181106124b4576124b4615525565b60200260200101819052506124c9828461312e565b60808901515190955060609350839250905060006124e882600261558b565b6124f390600161558b565b9050806001600160401b0381111561250d5761250d614fd0565b604051908082528060200260200182016040528015612536578160200160208202803683370190505b509350806001600160401b0381111561255157612551614fd0565b60405190808252806020026020018201604052801561258a57816020015b612577614f34565b81526020019060019003908161256f5790505b509250505060008060005b89608001515181101561262e57896080015181815181106125b8576125b8615525565b60200260200101518583815181106125d2576125d2615525565b6020026020010181815250508960a0015181815181106125f4576125f4615525565b602002602001015184838151811061260e5761260e615525565b602090810291909101015261262460018361558b565b9150600101612595565b50886020015184828151811061264657612646615525565b6020026020010181815250508860c0015183828151811061266957612669615525565b602090810291909101015261267f60018261558b565b895160408b0151919250906000898284099050808785815181106126a5576126a5615525565b6020026020010181815250505050508860e001518382815181106126cb576126cb615525565b60209081029190910101526126e160018261558b565b60608a0151909150878184089250506126f98261321c565b84828151811061270b5761270b615525565b60200260200101818152505061271f61324e565b83828151811061273157612731615525565b602002602001018190525061274e612749848661312e565b61326f565b945050505050600060405180608001604052807f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b081526020017f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c181526020017f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e5581526020017f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4815250905061280c8382846128076132dc565b6133ad565b9695505050505050565b806001600160a01b03163b6000036128435780604051634c9c8ce360e01b815260040161085b9190614fbc565b60008051602061595d83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b03168460405161288f919061559e565b600060405180830381855af49150503d80600081146128ca576040519150601f19603f3d011682016040523d82523d6000602084013e6128cf565b606091505b50915091506128df858383613490565b95945050505050565b3415610b585760405163b398979f60e01b815260040160405180910390fd5b6000612911611685565b54600160401b900460ff16919050565b60006000805160206158fd83398151915261293b836134e3565b1561294557505050565b8251602084015182600384858586098509088382830914838210848410161693505050816115b75760405162461bcd60e51b8152602060048201526017602482015276109b8c8d4d0e881a5b9d985b1a590811cc481c1bda5b9d604a1b604482015260640161085b565b6129f760405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60408051808201909152606081526000602082015260008051602061597d833981519152612a268287876134f2565b81518451612a339061388b565b612a40866020015161388b565b612a4d876040015161388b565b612a5a886060015161388b565b612a67896080015161388b565b604051602001612a7c969594939291906155ba565b60408051601f198184030181529190528252612a9782613900565b50612aa182613900565b6060840152612aaf82613900565b6080840152815160a0850151612ac49061388b565b604051602001612ad5929190615639565b60408051601f198184030181529190528252612af082613900565b8352815160c0850151612b029061388b565b612b0f8660e0015161388b565b612b1d87610100015161388b565b612b2b88610120015161388b565b612b3989610140015161388b565b604051602001612b4e969594939291906155ba565b60408051601f198184030181529190528252612b6982613900565b60a084015281516101a0850151612b7f90613962565b612b8d866101c00151613962565b612b9b876101e00151613962565b612ba9886102000151613962565b612bb7896102200151613962565b604051602001612bcc96959493929190615668565b60408051601f19818403018152919052808352610240850151612bee90613962565b612bfc866102600151613962565b612c0a876102800151613962565b612c18886102a00151613962565b612c26896102c00151613962565b604051602001612c3b96959493929190615668565b60408051601f198184030181529190528252612c5682613900565b60c08401528151610160850151612c6c9061388b565b612c7a86610180015161388b565b604051602001612c8c939291906156a4565b60408051601f198184030181529190528252612ca782613900565b60e08401528251818180098282820960208601919091526040850152509195945050505050565b612d006040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b816201000003612d9457506040805160a0810182526010815260208101929092527f30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c1001908201527eeeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b760608201527f0b5d56b77fe704e8e92338c0082f37e091126414c830e4c6922d5ac802d842d4608082015290565b816202000003612e2957506040805160a0810182526011815260208101929092527f30643640b9f82f90e83b698e5ea6179c7c05542e859533b48b9953a2f5360801908201527f1bf82deba7d74902c3708cc6e70e61f30512eca95655210e276e5858ce8f58e560608201527f244cf010c43ca87237d8b00bf9dd50c4c01c7f086bd4e8c920e75251d96f0d22608082015290565b816204000003612ebe57506040805160a0810182526012815260208101929092527f30644259cd94e7dd5045d7a27013b7fcd21c9e3b7fa75222e7bda49b729b0401908201527f19ddbcaf3a8d46c15c0176fbb5b95e4dc57088ff13f4d1bd84c6bfa57dcdc0e060608201527f036853f083780e87f8d7c71d111119c57dbe118c22d5ad707a82317466c5174c608082015290565b816208000003612f5357506040805160a0810182526013815260208101929092527f3064486657634403844b0eac78ca882cfd284341fcb0615a15cfcd17b14d8201908201527f2260e724844bca5251829353968e4915305258418357473a5c1d597f613f6cbd60608201527f06e402c0a314fb67a15cf806664ae1b722dbc0efe66e6c81d98f9924ca535321608082015290565b816210000003612fe857506040805160a0810182526014815260208101929092527f30644b6c9c4a72169e4daa317d25f04512ae15c53b34e8f5acd8e155d0a6c101908201527f26125da10a0ed06327508aba06d1e303ac616632dbed349f53422da95333785760608201527f100c332d2100895fab6473bc2c51bfca521f45cb3baca6260852a8fde26c91f3608082015290565b8160200361307b57506040805160a0810182526005815260208101929092527f2ee12bff4a2813286a8dc388cd754d9a3ef2490635eba50cb9c2e5e750800001908201527f09c532c6306b93d29678200d47c0b2a99c18d51b838eeb1d3eed4c533bb512d060608201527f2724713603bfbd790aeaf3e7df25d8e7ef8f311334905b4d8c99980cf210979d608082015290565b60405163e2ef09e560e01b815260040160405180910390fd5b919050565b6130bd60405180606001604052806000815260200160008152602001600081525090565b6130c78484613a99565b8082526130d79085908590613aed565b602082015280516130ed90859084908690613b61565b60408201529392505050565b600080613107858789613d15565b9050613117888689898888613e05565b613122818786614111565b98975050505050505050565b613136614f34565b82518251146131875760405162461bcd60e51b815260206004820181905260248201527f4d534d206572726f723a206c656e67746820646f6573206e6f74206d61746368604482015260640161085b565b6131c58360008151811061319d5761319d615525565b6020026020010151836000815181106131b8576131b8615525565b6020026020010151614161565b905060015b82518110156132155761320b826132068684815181106131ec576131ec615525565b60200260200101518685815181106131b8576131b8615525565b6141f5565b91506001016131ca565b5092915050565b600061323660008051602061597d833981519152836156fd565b61101a9060008051602061597d833981519152615512565b613256614f34565b5060408051808201909152600181526002602082015290565b613277614f34565b613280826134e3565b15613289575090565b6040518060400160405280836000015181526020016000805160206158fd83398151915284602001516132bc91906156fd565b6132d4906000805160206158fd833981519152615512565b905292915050565b6133076040518060800160405280600081526020016000815260200160008152602001600081525090565b60405180608001604052807f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81526020017f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281526020017f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa81526020017f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b815250905090565b60008060006040518751815260208801516020820152602087015160408201528651606082015260608701516080820152604087015160a0820152855160c0820152602086015160e08201526020850151610100820152845161012082015260608501516101408201526040850151610160820152602060006101808360085afa9150506000519150806134825760405162461bcd60e51b815260206004820152601c60248201527b426e3235343a2050616972696e6720636865636b206661696c65642160201b604482015260640161085b565b50151590505b949350505050565b6060826134a5576134a082614290565b6120ab565b81511580156134bc57506001600160a01b0384163b155b156134dc5783604051639996b31560e01b815260040161085b9190614fbc565b50806120ab565b80516020909101511590151690565b825160fe9061352d61350383613962565b60405160200161351591815260200190565b604051602081830303815290604052600060046142b9565b61356761353d8660000151613962565b60405160200161354f91815260200190565b604051602081830303815290604052600060086142b9565b61357761353d8760200151613962565b60405160200161358a949392919061571f565b60408051601f198184030181529190528085526135a76001613962565b6135be600080516020615a1d833981519152613962565b6135d56000805160206159bd833981519152613962565b6135ec6000805160206159fd833981519152613962565b61360360008051602061593d833981519152613962565b60405160200161361896959493929190615668565b60408051601f1981840301815291905280855260e08401516136399061388b565b61364785610100015161388b565b61365586610120015161388b565b61366387610140015161388b565b61367188610160015161388b565b61367f89610180015161388b565b61368d8a6101e0015161388b565b6040516020016136a4989796959493929190615776565b60408051601f198184030181529190528085526102008401516136c69061388b565b6136d485610220015161388b565b6136e286610240015161388b565b6136f0876101a0015161388b565b6136fe886101c0015161388b565b61370c89610260015161388b565b604051602001613722979695949392919061581b565b60408051601f198184030181529181528186528401516137419061388b565b61374e856060015161388b565b61375b866080015161388b565b6137688760a0015161388b565b6137758860c0015161388b565b60405160200161378a969594939291906155ba565b60408051601f1981840301815291905280855282516137c19084906000906137b4576137b4615525565b6020026020010151613962565b6137d7846001815181106137b4576137b4615525565b6137ed856002815181106137b4576137b4615525565b613803866003815181106137b4576137b4615525565b613819876004815181106137b4576137b4615525565b61382f886005815181106137b4576137b4615525565b613845896006815181106137b4576137b4615525565b61385b8a6007815181106137b4576137b4615525565b604051602001613873999897969594939291906158ad565b60408051601f19818403018152919052909352505050565b60606000613898836134e3565b156138a457600160fe1b175b60208301516000805160206158fd83398151915260019190911b106138ca5750600160ff1b5b82516138d7908217613962565b6040516020016138e991815260200190565b604051602081830303815290604052915050919050565b602080820151825180516040518381526000948594939291908101855b83811015613937576020818601810151838301520161391d565b5050602091820190209086018190529250600061280c60008051602061597d833981519152856156fd565b60008190506008817eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff16901b6008827fff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff0016901c1790506010817dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff16901b6010827dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff1916901c1790506020817bffffffff00000000ffffffff00000000ffffffff00000000ffffffff16901b6020827bffffffff00000000ffffffff00000000ffffffff00000000ffffffff1916901c1790506040816001600160401b03600160801b03600160c01b0316901b6040826001600160401b03600160801b03600160c01b031916901c179050608081901b608082901c179050919050565b815160009060008051602061597d83398151915290838015613add5784935060005b82811015613ad157838586099450600101613abb565b50600184039350613ae4565b6001830393505b50505092915050565b600082600103613aff575060016120ab565b81600003613b0f575060006120ab565b604084015160008051602061597d83398151915290600090828186099050858015613b3f57600187039250613b46565b6001840392505b50613b50826143c6565b915082828209979650505050505050565b825160009060008051602061597d83398151915290838303613be257600160005b82811015613bd557818703613bb657878181518110613ba357613ba3615525565b6020026020010151945050505050613488565b8380613bc457613bc46156e7565b896060015183099150600101613b82565b5060009350505050613488565b6000806000808a604001519050600080613bfc8d8861446c565b90506000876001600160401b03811115613c1857613c18614fd0565b604051908082528060200260200182016040528015613c41578160200160208202803683370190505b509050888b850993506001925060005b88811015613c8657602081026020840101519550898d878c030896508987850960208281028401018890529350600101613c51565b50613c90836143c6565b925060005b88811015613d035760208102602084010151955089868609975089848909975060005b89811015613ce257808214613cda576020810260208401015197508a888a0998505b600101613cb8565b506020810260208f010151955089868909975089888c089a50600101613c95565b50505050505050505050949350505050565b60008060008051602061597d8339815191529050600083602001519050600084604001519050600060019050606088015160808901516101a08901516102408a01518788898387098a868608088609945050506101c08901516102608a01518788898387098a868608088609945050506101e08901516102808a01518788898387098a868608088609945050506102008901516102a08a01518788898387098a8686080886099450505061022089015191506102c0890151868782898587080985099350505050875160208901518586868309870385089650508485838309860387089998505050505050505050565b613e13868686868587614531565b60c0850151825160008051602061597d83398151915291908190819086906014908110613e4257613e42615525565b602002602001018181525050856000015184601481518110613e6657613e66615525565b60200260200101819052508282820990508085601581518110613e8b57613e8b615525565b602002602001018181525050856020015184601581518110613eaf57613eaf615525565b60200260200101819052508282820990508085601681518110613ed457613ed4615525565b602002602001018181525050856040015184601681518110613ef857613ef8615525565b60200260200101819052508282820990508085601781518110613f1d57613f1d615525565b602002602001018181525050856060015184601781518110613f4157613f41615525565b60200260200101819052508282820990508085601881518110613f6657613f66615525565b602002602001018181525050856080015184601881518110613f8a57613f8a615525565b60200260200101819052508282820990508085601981518110613faf57613faf615525565b602002602001018181525050886040015184601981518110613fd357613fd3615525565b60200260200101819052508282820990508085601a81518110613ff857613ff8615525565b602002602001018181525050886060015184601a8151811061401c5761401c615525565b60200260200101819052508282820990508085601b8151811061404157614041615525565b602002602001018181525050886080015184601b8151811061406557614065615525565b60200260200101819052508282820990508085601c8151811061408a5761408a615525565b6020026020010181815250508860a0015184601c815181106140ae576140ae615525565b60200260200101819052508282820990508760e0015185601d815181106140d7576140d7615525565b6020026020010181815250508560a0015184601d815181106140fb576140fb615525565b6020026020010181905250505050505050505050565b60008051602061597d8339815191528381039060005b600a8110156141585760206015820102840151602082026101a0018601518384828409860894505050600101614127565b50509392505050565b614169614f34565b614171614f4e565b835181526020808501519082015260408101839052600060608360808460076107d05a03fa905080806141a357600080fd5b50806141ed5760405162461bcd60e51b8152602060048201526019602482015278426e3235343a207363616c6172206d756c206661696c65642160381b604482015260640161085b565b505092915050565b6141fd614f34565b614205614f6c565b8351815260208085015181830152835160408301528301516060808301919091526000908360c08460066107d05a03fa9050808061424257600080fd5b50806141ed5760405162461bcd60e51b815260206004820152601d60248201527f426e3235343a2067726f7570206164646974696f6e206661696c656421000000604482015260640161085b565b8051156142a05780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6060816142c781601f61558b565b10156143065760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015260640161085b565b614310828461558b565b845110156143545760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015260640161085b565b60608215801561437357604051915060008252602082016040526143bd565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156143ac578051835260209283019201614394565b5050858452601f01601f1916604052505b50949350505050565b600080600060008051602061597d833981519152905060405160208152602080820152602060408201528460608201526002820360808201528160a08201526020600060c08360055afa9250506000519250816144655760405162461bcd60e51b815260206004820152601d60248201527f426e3235343a20706f7720707265636f6d70696c65206661696c656421000000604482015260640161085b565b5050919050565b6060826020015182111561449357604051638c5e11f160e01b815260040160405180910390fd5b6060830151600160008051602061597d833981519152846001600160401b038111156144c1576144c1614fd0565b6040519080825280602002602001820160405280156144ea578160200160208202803683370190505b50935084151915613ae45760208401856020028101600182526020820191505b808210156145265782858509935083825260208201915061450a565b505050505092915050565b60008060008060008060008051602061597d83398151915290508060208b015160208d01510995508a5193508060a08c015160608d0151099250806101a08a0151840891508060808c01518308915080848309935080600080516020615a1d83398151915284099150806101c08a0151830891508060808c015183089150808483099350806000805160206159bd83398151915284099150806101e08a0151830891508060808c015183089150808483099350806000805160206159fd83398151915284099150806102008a0151830891508060808c0151830891508084830993508060008051602061593d83398151915284099150806102208a0151830891508060808c0151830891508084830993508084870895508860a001518860008151811061466057614660615525565b6020026020010181905250858760008151811061467f5761467f615525565b6020026020010181815250508060608c01518c51099450806102c08a015186099450806102408a015160608d0151099250806101a08a0151840892508060808c015184089250808386099450806102608a015160608d0151099250806101c08a0151840892508060808c015184089250808386099450806102808a015160608d0151099250806101e08a0151840892508060808c015184089250808386099450806102a08a015160608d0151099250806102008a0151840892508060808c0151840892508083860994508b60c001518860018151811061476157614761615525565b60209081029190910101526147768582615512565b8760018151811061478957614789615525565b602002602001018181525050886101a00151876002815181106147ae576147ae615525565b602002602001018181525050886101c00151876003815181106147d3576147d3615525565b602002602001018181525050886101e00151876004815181106147f8576147f8615525565b6020026020010181815250508861020001518760058151811061481d5761481d615525565b6020026020010181815250508b60e001518860028151811061484157614841615525565b60200260200101819052508b61010001518860038151811061486557614865615525565b60200260200101819052508b61012001518860048151811061488957614889615525565b60200260200101819052508b6101400151886005815181106148ad576148ad615525565b6020026020010181905250806101c08a01516101a08b015109925082876006815181106148dc576148dc615525565b6020026020010181815250508b61016001518860068151811061490157614901615525565b6020026020010181905250806102008a01516101e08b0151099250828760078151811061493057614930615525565b6020026020010181815250508b61018001518860078151811061495557614955615525565b60200260200101819052506101a08901519250808384099150808283099150808284099250828760088151811061498e5761498e615525565b6020026020010181815250508b6101e00151886008815181106149b3576149b3615525565b60200260200101819052506101c0890151925080838409915080828309915080828409925082876009815181106149ec576149ec615525565b6020026020010181815250508b610200015188600981518110614a1157614a11615525565b60200260200101819052506101e089015192508083840991508082830991508082840992508287600a81518110614a4a57614a4a615525565b6020026020010181815250508b610220015188600a81518110614a6f57614a6f615525565b602002602001018190525061020089015192508083840991508082830991508082840992508287600b81518110614aa857614aa8615525565b6020026020010181815250508b610240015188600b81518110614acd57614acd615525565b602002602001018190525088610220015181614ae99190615512565b87600c81518110614afc57614afc615525565b6020026020010181815250508b6101a0015188600c81518110614b2157614b21615525565b6020026020010181905250600187600d81518110614b4157614b41615525565b6020026020010181815250508b6101c0015188600d81518110614b6657614b66615525565b6020026020010181905250806101c08a01516101a08b0151099250806101e08a015184099250806102008a015184099250806102208a0151840992508287600e81518110614bb657614bb6615525565b6020026020010181815250508b610260015188600e81518110614bdb57614bdb615525565b60209081029190910101528951614bf29082615512565b87600f81518110614c0557614c05615525565b6020026020010181815250508860c0015188600f81518110614c2957614c29615525565b60200260200101819052508060018b510860a08c0151909350819080099150808284099250808360206010028901510991508187601081518110614c6f57614c6f615525565b6020026020010181815250508860e0015188601081518110614c9357614c93615525565b6020026020010181905250808360206011028901510991508187601181518110614cbf57614cbf615525565b60200260200101818152505088610100015188601181518110614ce457614ce4615525565b6020026020010181905250808360206012028901510991508187601281518110614d1057614d10615525565b60200260200101818152505088610120015188601281518110614d3557614d35615525565b6020026020010181905250808360206013028901510991508187601381518110614d6157614d61615525565b60200260200101818152505088610140015188601381518110614d8657614d86615525565b6020026020010181905250505050505050505050505050565b60405180610100016040528060006001600160401b0316815260200160006001600160401b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518061028001604052806000815260200160008152602001614e18614f34565b8152602001614e25614f34565b8152602001614e32614f34565b8152602001614e3f614f34565b8152602001614e4c614f34565b8152602001614e59614f34565b8152602001614e66614f34565b8152602001614e73614f34565b8152602001614e80614f34565b8152602001614e8d614f34565b8152602001614e9a614f34565b8152602001614ea7614f34565b8152602001614eb4614f34565b8152602001614ec1614f34565b8152602001614ece614f34565b8152602001614edb614f34565b8152602001614ee8614f34565b8152602001614ef5614f34565b905290565b604051806101000160405280600081526020016000815260200160008152602001600081526020016060815260200160608152602001614ee85b604051806040016040528060008152602001600081525090565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b80356001600160a01b038116811461309457600080fd5b600060208284031215614fb357600080fd5b6120ab82614f8a565b6001600160a01b0391909116815260200190565b634e487b7160e01b600052604160045260246000fd5b6040516102e081016001600160401b038111828210171561500957615009614fd0565b60405290565b604051601f8201601f191681016001600160401b038111828210171561503757615037614fd0565b604052919050565b80356001600160401b038116811461309457600080fd5b600061010080838503121561506a57600080fd5b604051908101906001600160401b038211818310171561508c5761508c614fd0565b8160405280925061509c8461503f565b81526150aa6020850161503f565b602082015260408401356040820152606084013560608201526080840135608082015260a084013560a082015260c084013560c082015260e084013560e0820152505092915050565b60006040828403121561510557600080fd5b604080519081016001600160401b038111828210171561512757615127614fd0565b604052823581526020928301359281019290925250919050565b60008082840361058081121561515657600080fd5b6151608585615056565b92506101006104808060ff198401121561517957600080fd5b615181614fe6565b925061518f878388016150f3565b83526101406151a0888289016150f3565b60208501526101806151b489828a016150f3565b60408601526101c06151c88a828b016150f3565b60608701526102006151dc8b828c016150f3565b60808801526102406151f08c828d016150f3565b60a08901526102806152048d828e016150f3565b60c08a01526102c06152188e828f016150f3565b60e08b015261522b8e6103008f016150f3565b898b015261523d8e6103408f016150f3565b6101208b01526152518e6103808f016150f3565b878b01526152638e6103c08f016150f3565b6101608b01526152778e6104008f016150f3565b868b01526104408d01356101a08b01526104608d0135858b0152878d01356101e08b01526104a08d0135848b01526104c08d01356102208b01526104e08d0135838b01526105008d01356102608b01526105208d0135828b01526105408d01356102a08b01526105608d0135818b0152505050505050505050809150509250929050565b6000806040838503121561530e57600080fd5b61531783614f8a565b91506020838101356001600160401b038082111561533457600080fd5b818601915086601f83011261534857600080fd5b81358181111561535a5761535a614fd0565b61536c601f8201601f1916850161500f565b9150808252878482850101111561538257600080fd5b80848401858401376000848284010152508093505050509250929050565b6001600160401b0391909116815260200190565b803563ffffffff8116811461309457600080fd5b6000602082840312156153da57600080fd5b6120ab826153b4565b6000602082840312156153f557600080fd5b5035919050565b6000806000610140848603121561541257600080fd5b61541c8585615056565b925061542b61010085016153b4565b915061543a6101208501614f8a565b90509250925092565b6000610100828403121561545657600080fd5b6120ab8383615056565b60005b8381101561547b578181015183820152602001615463565b50506000910152565b60208152600082518060208401526154a3816040850160208701615460565b601f01601f19169190910160400192915050565b600080604083850312156154ca57600080fd5b50508035926020909101359150565b634e487b7160e01b600052601160045260246000fd5b6001600160401b038181168382160280821691908281146141ed576141ed6154d9565b8181038181111561101a5761101a6154d9565b634e487b7160e01b600052603260045260246000fd5b60008161554a5761554a6154d9565b506000190190565b6001600160401b03818116838216019080821115613215576132156154d9565b60006020828403121561558457600080fd5b5051919050565b8082018082111561101a5761101a6154d9565b600082516155b0818460208701615460565b9190910192915050565b6000875160206155cd8285838d01615460565b8851918401916155e08184848d01615460565b88519201916155f28184848c01615460565b87519201916156048184848b01615460565b86519201916156168184848a01615460565b85519201916156288184848901615460565b919091019998505050505050505050565b6000835161564b818460208801615460565b83519083019061565f818360208801615460565b01949350505050565b6000875161567a818460208c01615460565b9190910195865250602085019390935260408401919091526060830152608082015260a001919050565b600084516156b6818460208901615460565b8451908301906156ca818360208901615460565b84519101906156dd818360208801615460565b0195945050505050565b634e487b7160e01b600052601260045260246000fd5b60008261571a57634e487b7160e01b600052601260045260246000fd5b500690565b60008551615731818460208a01615460565b855190830190615745818360208a01615460565b8551910190615758818360208901615460565b845191019061576b818360208801615460565b019695505050505050565b6000895160206157898285838f01615460565b8a519184019161579c8184848f01615460565b8a519201916157ae8184848e01615460565b89519201916157c08184848d01615460565b88519201916157d28184848c01615460565b87519201916157e48184848b01615460565b86519201916157f68184848a01615460565b85519201916158088184848901615460565b919091019b9a5050505050505050505050565b60008851602061582e8285838e01615460565b8951918401916158418184848e01615460565b89519201916158538184848d01615460565b88519201916158658184848c01615460565b87519201916158778184848b01615460565b86519201916158898184848a01615460565b855192019161589b8184848901615460565b919091019a9950505050505050505050565b60008a516158bf818460208f01615460565b9190910198895250602088019690965260408701949094526060860192909252608085015260a084015260c083015260e08201526101000191905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47a66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6882e2b91456103698adf57b799969dea1c8f739da5d8d40dd3eb9222db7c81e881360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001f3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee31ee678a0470a75a6eaa8fe837060498ba828a3703b311d0f77f010424afeb025f3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee42042a587a90c187b0a087c03e29c968b950b1db26d5c82d666905a6895790c0a2f8dd1f1a7583c42c4e12a44e110404c73ca6c94813f85835da4fb7bb1301d4aa164736f6c6343000817000a"
diff --git a/contract-bindings/src/erc1967_proxy.rs b/contract-bindings/src/erc1967_proxy.rs
index 08d99abf0..b3e9992b6 100644
--- a/contract-bindings/src/erc1967_proxy.rs
+++ b/contract-bindings/src/erc1967_proxy.rs
@@ -94,12 +94,12 @@ pub mod erc1967_proxy {
pub static ERC1967PROXY_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> =
::ethers::contract::Lazy::new(__abi);
#[rustfmt::skip]
- const __BYTECODE: &[u8] = b"`\x80`@R`@Qa\x03\xEE8\x03\x80a\x03\xEE\x839\x81\x01`@\x81\x90Ra\0\"\x91a\x02hV[a\0,\x82\x82a\x003V[PPa\x03RV[a\0<\x82a\0\x92V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a\0\x86Wa\0\x81\x82\x82a\x01\x0EV[PPPV[a\0\x8Ea\x01\x85V[PPV[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a\0\xCDW`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa\x01+\x91\x90a\x036V[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a\x01fW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\x01kV[``\x91P[P\x90\x92P\x90Pa\x01|\x85\x83\x83a\x01\xA6V[\x95\x94PPPPPV[4\x15a\x01\xA4W`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[``\x82a\x01\xBBWa\x01\xB6\x82a\x02\x05V[a\x01\xFEV[\x81Q\x15\x80\x15a\x01\xD2WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\x01\xFBW`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\0\xC4V[P\x80[\x93\x92PPPV[\x80Q\x15a\x02\x15W\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`\0[\x83\x81\x10\x15a\x02_W\x81\x81\x01Q\x83\x82\x01R` \x01a\x02GV[PP`\0\x91\x01RV[`\0\x80`@\x83\x85\x03\x12\x15a\x02{W`\0\x80\xFD[\x82Q`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x02\x92W`\0\x80\xFD[` \x84\x01Q\x90\x92P`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a\x02\xAFW`\0\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\x02\xC3W`\0\x80\xFD[\x81Q\x81\x81\x11\x15a\x02\xD5Wa\x02\xD5a\x02.V[`@Q`\x1F\x82\x01`\x1F\x19\x90\x81\x16`?\x01\x16\x81\x01\x90\x83\x82\x11\x81\x83\x10\x17\x15a\x02\xFDWa\x02\xFDa\x02.V[\x81`@R\x82\x81R\x88` \x84\x87\x01\x01\x11\x15a\x03\x16W`\0\x80\xFD[a\x03'\x83` \x83\x01` \x88\x01a\x02DV[\x80\x95PPPPPP\x92P\x92\x90PV[`\0\x82Qa\x03H\x81\x84` \x87\x01a\x02DV[\x91\x90\x91\x01\x92\x91PPV[`\x8E\x80a\x03``\09`\0\xF3\xFE`\x80`@R`\n`\x0CV[\0[`\x18`\x14`\x1AV[`^V[V[`\0`Y\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBCTs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90V[\x90P\x90V[6`\0\x807`\0\x806`\0\x84Z\xF4=`\0\x80>\x80\x80\x15`|W=`\0\xF3[=`\0\xFD\xFE\xA1dsolcC\0\x08\x17\0\n";
+ const __BYTECODE: &[u8] = b"`\x80`@R`@Qa\x03\xE78\x03\x80a\x03\xE7\x839\x81\x01`@\x81\x90Ra\0\"\x91a\x02ZV[a\0,\x82\x82a\x003V[PPa\x03XV[a\0<\x82a\0\x92V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a\0\x86Wa\0\x81\x82\x82a\x01\tV[PPPV[a\0\x8Ea\x01\x80V[PPV[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a\0\xC8W\x80`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x04\x01a\0\xBF\x91\x90a\x03(V[`@Q\x80\x91\x03\x90\xFD[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa\x01&\x91\x90a\x03a\x01fV[``\x91P[P\x90\x92P\x90Pa\x01w\x85\x83\x83a\x01\xA1V[\x95\x94PPPPPV[4\x15a\x01\x9FW`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[``\x82a\x01\xB6Wa\x01\xB1\x82a\x01\xF7V[a\x01\xF0V[\x81Q\x15\x80\x15a\x01\xCDWP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\x01\xEDW\x83`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x04\x01a\0\xBF\x91\x90a\x03(V[P\x80[\x93\x92PPPV[\x80Q\x15a\x02\x07W\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`\0[\x83\x81\x10\x15a\x02QW\x81\x81\x01Q\x83\x82\x01R` \x01a\x029V[PP`\0\x91\x01RV[`\0\x80`@\x83\x85\x03\x12\x15a\x02mW`\0\x80\xFD[\x82Q`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x02\x84W`\0\x80\xFD[` \x84\x01Q\x90\x92P`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a\x02\xA1W`\0\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\x02\xB5W`\0\x80\xFD[\x81Q\x81\x81\x11\x15a\x02\xC7Wa\x02\xC7a\x02 V[`@Q`\x1F\x82\x01`\x1F\x19\x90\x81\x16`?\x01\x16\x81\x01\x90\x83\x82\x11\x81\x83\x10\x17\x15a\x02\xEFWa\x02\xEFa\x02 V[\x81`@R\x82\x81R\x88` \x84\x87\x01\x01\x11\x15a\x03\x08W`\0\x80\xFD[a\x03\x19\x83` \x83\x01` \x88\x01a\x026V[\x80\x95PPPPPP\x92P\x92\x90PV[`\x01`\x01`\xA0\x1B\x03\x91\x90\x91\x16\x81R` \x01\x90V[`\0\x82Qa\x03N\x81\x84` \x87\x01a\x026V[\x91\x90\x91\x01\x92\x91PPV[`\x81\x80a\x03f`\09`\0\xF3\xFE`\x80`@R`\n`\x0CV[\0[`\x18`\x14`\x1AV[`QV[V[`\0`L\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBCT`\x01`\x01`\xA0\x1B\x03\x16\x90V[\x90P\x90V[6`\0\x807`\0\x806`\0\x84Z\xF4=`\0\x80>\x80\x80\x15`oW=`\0\xF3[=`\0\xFD\xFE\xA1dsolcC\0\x08\x17\0\n";
/// The bytecode of the contract.
pub static ERC1967PROXY_BYTECODE: ::ethers::core::types::Bytes =
::ethers::core::types::Bytes::from_static(__BYTECODE);
#[rustfmt::skip]
- const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R`\n`\x0CV[\0[`\x18`\x14`\x1AV[`^V[V[`\0`Y\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBCTs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90V[\x90P\x90V[6`\0\x807`\0\x806`\0\x84Z\xF4=`\0\x80>\x80\x80\x15`|W=`\0\xF3[=`\0\xFD\xFE\xA1dsolcC\0\x08\x17\0\n";
+ const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R`\n`\x0CV[\0[`\x18`\x14`\x1AV[`QV[V[`\0`L\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBCT`\x01`\x01`\xA0\x1B\x03\x16\x90V[\x90P\x90V[6`\0\x807`\0\x806`\0\x84Z\xF4=`\0\x80>\x80\x80\x15`oW=`\0\xF3[=`\0\xFD\xFE\xA1dsolcC\0\x08\x17\0\n";
/// The deployed bytecode of the contract.
pub static ERC1967PROXY_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes =
::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE);
diff --git a/contract-bindings/src/fee_contract.rs b/contract-bindings/src/fee_contract.rs
index 48968ef88..bcb9e9476 100644
--- a/contract-bindings/src/fee_contract.rs
+++ b/contract-bindings/src/fee_contract.rs
@@ -475,12 +475,12 @@ pub mod fee_contract {
pub static FEECONTRACT_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> =
::ethers::contract::Lazy::new(__abi);
#[rustfmt::skip]
- const __BYTECODE: &[u8] = b"`\xA0`@R0`\x80R4\x80\x15a\0\x14W`\0\x80\xFD[Pa\0\x1Da\0\"V[a\0\xD4V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16\x15a\0rW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80T`\x01`\x01`@\x1B\x03\x90\x81\x16\x14a\0\xD1W\x80T`\x01`\x01`@\x1B\x03\x19\x16`\x01`\x01`@\x1B\x03\x90\x81\x17\x82U`@Q\x90\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PV[`\x80Qa\x0E\xBAa\0\xFD`\09`\0\x81\x81a\x06^\x01R\x81\x81a\x06\x87\x01Ra\x08{\x01Ra\x0E\xBA`\0\xF3\xFE`\x80`@R`\x046\x10a\0\xCBW`\x005`\xE0\x1C\x80c\x8D\xA5\xCB[\x11a\0tW\x80c\xC4\xD6m\xE8\x11a\0NW\x80c\xC4\xD6m\xE8\x14a\x02\xA9W\x80c\xF2\xFD\xE3\x8B\x14a\x02\xC9W\x80c\xF3@\xFA\x01\x14a\x02\xE9Wa\x01\x02V[\x80c\x8D\xA5\xCB[\x14a\x01\xF6W\x80c\x8E\xD82q\x14a\x02=W\x80c\xAD<\xB1\xCC\x14a\x02SWa\x01\x02V[\x80cR\xD1\x90-\x11a\0\xA5W\x80cR\xD1\x90-\x14a\x01\xB6W\x80cdP\x06\xCA\x14a\x01\xCBW\x80cqP\x18\xA6\x14a\x01\xE1Wa\x01\x02V[\x80c\r\x8En,\x14a\x014W\x80c'\xE25\xE3\x14a\x01fW\x80cO\x1E\xF2\x86\x14a\x01\xA1Wa\x01\x02V[6a\x01\x02W`@Q\x7F\xBC\x8E\xCA\x1B\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Q\x7F\xA9\xADb\xF8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[4\x80\x15a\x01@W`\0\x80\xFD[P`@\x80Q`\x01\x81R`\0` \x82\x01\x81\x90R\x91\x81\x01\x91\x90\x91R``\x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01rW`\0\x80\xFD[Pa\x01\x93a\x01\x816`\x04a\x0C\xDBV[`\x02` R`\0\x90\x81R`@\x90 T\x81V[`@Q\x90\x81R` \x01a\x01]V[a\x01\xB4a\x01\xAF6`\x04a\r%V[a\x02\xFCV[\0[4\x80\x15a\x01\xC2W`\0\x80\xFD[Pa\x01\x93a\x03\x1BV[4\x80\x15a\x01\xD7W`\0\x80\xFD[Pa\x01\x93`\x01T\x81V[4\x80\x15a\x01\xEDW`\0\x80\xFD[Pa\x01\xB4a\x03JV[4\x80\x15a\x02\x02W`\0\x80\xFD[P\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x01]V[4\x80\x15a\x02IW`\0\x80\xFD[Pa\x01\x93`\0T\x81V[4\x80\x15a\x02_W`\0\x80\xFD[Pa\x02\x9C`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01\x7F5.0.0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RP\x81V[`@Qa\x01]\x91\x90a\x0E\x0BV[4\x80\x15a\x02\xB5W`\0\x80\xFD[Pa\x01\xB4a\x02\xC46`\x04a\x0C\xDBV[a\x03^V[4\x80\x15a\x02\xD5W`\0\x80\xFD[Pa\x01\xB4a\x02\xE46`\x04a\x0C\xDBV[a\x04\xD1V[a\x01\xB4a\x02\xF76`\x04a\x0C\xDBV[a\x05-V[a\x03\x04a\x06SV[a\x03\r\x82a\x07#V[a\x03\x17\x82\x82a\x07jV[PPV[`\0a\x03%a\x08pV[P\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x90V[a\x03Ra\x08\xD2V[a\x03\\`\0a\tFV[V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x81\x04`\xFF\x16\x15\x90g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\0\x81\x15\x80\x15a\x03\xA9WP\x82[\x90P`\0\x82g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\x01\x14\x80\x15a\x03\xC6WP0;\x15[\x90P\x81\x15\x80\x15a\x03\xD4WP\x80\x15[\x15a\x04\x0BW`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\x16`\x01\x17\x85U\x83\x15a\x04VW\x84Th\xFF\0\0\0\0\0\0\0\0\x19\x16h\x01\0\0\0\0\0\0\0\0\x17\x85U[a\x04_\x86a\t\xCFV[a\x04ga\t\xE0V[g\r\xE0\xB6\xB3\xA7d\0\0`\0Uf\x03\x8D~\xA4\xC6\x80\0`\x01U\x83\x15a\x04\xC9W\x84Th\xFF\0\0\0\0\0\0\0\0\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPV[a\x04\xD9a\x08\xD2V[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x05!W`@Q\x7F\x1EO\xBD\xF7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\0`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[a\x05*\x81a\tFV[PV[`\x01T4\x10\x15a\x05iW`@Q\x7Fk\xA4\xA1\xC7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0T4\x11\x15a\x05\xA5W`@Q\x7F\xC5mF\xD3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x05\xE5W`@Q\x7Fp+=\x90\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x81\x16`\0\x90\x81R`\x02` R`@\x81 \x80T4\x92\x90a\x06\r\x90\x84\x90a\x0E>V[\x90\x91UPP`@Q4\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16\x90\x7F\xE1\xFF\xFC\xC4\x92=\x04\xB5Y\xF4\xD2\x9A\x8B\xFCl\xDA\x04\xEB[\r v\xCC75\xA9 \xA3\xCAP]8+\xBCT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\x03\\W`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x07+a\x08\xD2V[`@Q`\x01`\x01`\xA0\x1B\x03\x82\x16\x81R\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x90` \x01`@Q\x80\x91\x03\x90\xA1PV[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x07\xC4WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x07\xC1\x91\x81\x01\x90a\x0ExV[`\x01[a\x08\x05W`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\x05\x18V[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x81\x14a\x08aW`@Q\x7F\xAA\x1DI\xA4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x81\x01\x82\x90R`$\x01a\x05\x18V[a\x08k\x83\x83a\t\xE8V[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\x03\\W`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[3a\t\x04\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\x03\\W`@Q\x7F\x11\x8C\xDA\xA7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R3`\x04\x82\x01R`$\x01a\x05\x18V[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81\x16`\x01`\x01`\xA0\x1B\x03\x84\x81\x16\x91\x82\x17\x84U`@Q\x92\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90`\0\x90\xA3PPPV[a\t\xD7a\n>V[a\x05*\x81a\n\xA5V[a\x03\\a\n>V[a\t\xF1\x82a\n\xADV[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a\n6Wa\x08k\x82\x82a\x0BUV[a\x03\x17a\x0B\xCDV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0Th\x01\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16a\x03\\W`@Q\x7F\xD7\xE6\xBC\xF8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x04\xD9a\n>V[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a\n\xFCW`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x05\x18V[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa\x0Br\x91\x90a\x0E\x91V[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a\x0B\xADW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\x0B\xB2V[``\x91P[P\x91P\x91Pa\x0B\xC2\x85\x83\x83a\x0C\x05V[\x92PPP[\x92\x91PPV[4\x15a\x03\\W`@Q\x7F\xB3\x98\x97\x9F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x82a\x0C\x1AWa\x0C\x15\x82a\x0C}V[a\x0CvV[\x81Q\x15\x80\x15a\x0C1WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\x0CsW`@Q\x7F\x99\x96\xB3\x15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\x05\x18V[P\x80[\x93\x92PPPV[\x80Q\x15a\x0C\x8DW\x80Q\x80\x82` \x01\xFD[`@Q\x7F\x14%\xEAB\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x0C\xD6W`\0\x80\xFD[\x91\x90PV[`\0` \x82\x84\x03\x12\x15a\x0C\xEDW`\0\x80\xFD[a\x0Cv\x82a\x0C\xBFV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0R`A`\x04R`$`\0\xFD[`\0\x80`@\x83\x85\x03\x12\x15a\r8W`\0\x80\xFD[a\rA\x83a\x0C\xBFV[\x91P` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\r^W`\0\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\rrW`\0\x80\xFD[\x815\x81\x81\x11\x15a\r\x84Wa\r\x84a\x0C\xF6V[`@Q`\x1F\x82\x01`\x1F\x19\x90\x81\x16`?\x01\x16\x81\x01\x90\x83\x82\x11\x81\x83\x10\x17\x15a\r\xACWa\r\xACa\x0C\xF6V[\x81`@R\x82\x81R\x88` \x84\x87\x01\x01\x11\x15a\r\xC5W`\0\x80\xFD[\x82` \x86\x01` \x83\x017`\0` \x84\x83\x01\x01R\x80\x95PPPPPP\x92P\x92\x90PV[`\0[\x83\x81\x10\x15a\x0E\x02W\x81\x81\x01Q\x83\x82\x01R` \x01a\r\xEAV[PP`\0\x91\x01RV[` \x81R`\0\x82Q\x80` \x84\x01Ra\x0E*\x81`@\x85\x01` \x87\x01a\r\xE7V[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[\x80\x82\x01\x80\x82\x11\x15a\x0B\xC7W\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0R`\x11`\x04R`$`\0\xFD[`\0` \x82\x84\x03\x12\x15a\x0E\x8AW`\0\x80\xFD[PQ\x91\x90PV[`\0\x82Qa\x0E\xA3\x81\x84` \x87\x01a\r\xE7V[\x91\x90\x91\x01\x92\x91PPV\xFE\xA1dsolcC\0\x08\x17\0\n";
+ const __BYTECODE: &[u8] = b"`\xA0`@R0`\x80R4\x80\x15a\0\x14W`\0\x80\xFD[Pa\0\x1Da\0\"V[a\0\xD4V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16\x15a\0rW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80T`\x01`\x01`@\x1B\x03\x90\x81\x16\x14a\0\xD1W\x80T`\x01`\x01`@\x1B\x03\x19\x16`\x01`\x01`@\x1B\x03\x90\x81\x17\x82U`@Q\x90\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PV[`\x80Qa\x0B\xE5a\0\xFD`\09`\0\x81\x81a\x05\r\x01R\x81\x81a\x056\x01Ra\x06\xAD\x01Ra\x0B\xE5`\0\xF3\xFE`\x80`@R`\x046\x10a\0\x9BW`\x005`\xE0\x1C\x80c\r\x8En,\x14a\0\xD2W\x80c'\xE25\xE3\x14a\x01\x04W\x80cO\x1E\xF2\x86\x14a\x01?W\x80cR\xD1\x90-\x14a\x01TW\x80cdP\x06\xCA\x14a\x01iW\x80cqP\x18\xA6\x14a\x01\x7FW\x80c\x8D\xA5\xCB[\x14a\x01\x94W\x80c\x8E\xD82q\x14a\x01\xB6W\x80c\xAD<\xB1\xCC\x14a\x01\xCCW\x80c\xC4\xD6m\xE8\x14a\x02\nW\x80c\xF2\xFD\xE3\x8B\x14a\x02*W\x80c\xF3@\xFA\x01\x14a\x02JWa\0\xB9V[6a\0\xB9W`@Qc\xBC\x8E\xCA\x1B`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Qc\x155\xAC_`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[4\x80\x15a\0\xDEW`\0\x80\xFD[P`@\x80Q`\x01\x81R`\0` \x82\x01\x81\x90R\x91\x81\x01\x91\x90\x91R``\x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\x10W`\0\x80\xFD[Pa\x011a\x01\x1F6`\x04a\n\x05V[`\x02` R`\0\x90\x81R`@\x90 T\x81V[`@Q\x90\x81R` \x01a\0\xFBV[a\x01Ra\x01M6`\x04a\n6V[a\x02]V[\0[4\x80\x15a\x01`W`\0\x80\xFD[Pa\x011a\x02|V[4\x80\x15a\x01uW`\0\x80\xFD[Pa\x011`\x01T\x81V[4\x80\x15a\x01\x8BW`\0\x80\xFD[Pa\x01Ra\x02\x99V[4\x80\x15a\x01\xA0W`\0\x80\xFD[Pa\x01\xA9a\x02\xADV[`@Qa\0\xFB\x91\x90a\n\xF7V[4\x80\x15a\x01\xC2W`\0\x80\xFD[Pa\x011`\0T\x81V[4\x80\x15a\x01\xD8W`\0\x80\xFD[Pa\x01\xFD`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01d\x03R\xE3\x02\xE3`\xDC\x1B\x81RP\x81V[`@Qa\0\xFB\x91\x90a\x0B/V[4\x80\x15a\x02\x16W`\0\x80\xFD[Pa\x01Ra\x02%6`\x04a\n\x05V[a\x02\xC8V[4\x80\x15a\x026W`\0\x80\xFD[Pa\x01Ra\x02E6`\x04a\n\x05V[a\x03\xE0V[a\x01Ra\x02X6`\x04a\n\x05V[a\x04'V[a\x02ea\x05\x02V[a\x02n\x82a\x05\xA7V[a\x02x\x82\x82a\x05\xE9V[PPV[`\0a\x02\x86a\x06\xA2V[P`\0\x80Q` a\x0B\xB9\x839\x81Q\x91R\x90V[a\x02\xA1a\x06\xEBV[a\x02\xAB`\0a\x07\x1DV[V[`\0\x80a\x02\xB8a\x07yV[T`\x01`\x01`\xA0\x1B\x03\x16\x92\x91PPV[`\0a\x02\xD2a\x07\x9DV[\x80T\x90\x91P`\xFF`\x01`@\x1B\x82\x04\x16\x15\x90`\x01`\x01`@\x1B\x03\x16`\0\x81\x15\x80\x15a\x02\xF9WP\x82[\x90P`\0\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a\x03\x15WP0;\x15[\x90P\x81\x15\x80\x15a\x03#WP\x80\x15[\x15a\x03AW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84T`\x01`\x01`@\x1B\x03\x19\x16`\x01\x17\x85U\x83\x15a\x03jW\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[a\x03s\x86a\x07\xC1V[a\x03{a\x07\xD2V[g\r\xE0\xB6\xB3\xA7d\0\0`\0Uf\x03\x8D~\xA4\xC6\x80\0`\x01U\x83\x15a\x03\xD8W\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPV[a\x03\xE8a\x06\xEBV[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x04\x1BW`\0`@Qc\x1EO\xBD\xF7`\xE0\x1B\x81R`\x04\x01a\x04\x12\x91\x90a\n\xF7V[`@Q\x80\x91\x03\x90\xFD[a\x04$\x81a\x07\x1DV[PV[`\x01T4\x10\x15a\x04JW`@Qck\xA4\xA1\xC7`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0T4\x11\x15a\x04mW`@Qc\xC5mF\xD3`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x04\x94W`@Qc\x07\x02\xB3\xD9`\xE4\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x81\x16`\0\x90\x81R`\x02` R`@\x81 \x80T4\x92\x90a\x04\xBC\x90\x84\x90a\x0BbV[\x90\x91UPP`@Q4\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16\x90\x7F\xE1\xFF\xFC\xC4\x92=\x04\xB5Y\xF4\xD2\x9A\x8B\xFCl\xDA\x04\xEB[\rF\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x05\xAFa\x06\xEBV[\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x81`@Qa\x05\xDE\x91\x90a\n\xF7V[`@Q\x80\x91\x03\x90\xA1PV[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x06CWP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x06@\x91\x81\x01\x90a\x0B\x83V[`\x01[a\x06bW\x81`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x04\x01a\x04\x12\x91\x90a\n\xF7V[`\0\x80Q` a\x0B\xB9\x839\x81Q\x91R\x81\x14a\x06\x93W`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x04\x12V[a\x06\x9D\x83\x83a\x07\xDAV[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\x02\xABW`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[3a\x06\xF4a\x02\xADV[`\x01`\x01`\xA0\x1B\x03\x16\x14a\x02\xABW3`@Qc\x11\x8C\xDA\xA7`\xE0\x1B\x81R`\x04\x01a\x04\x12\x91\x90a\n\xF7V[`\0a\x07'a\x07yV[\x80T`\x01`\x01`\xA0\x1B\x03\x84\x81\x16`\x01`\x01`\xA0\x1B\x03\x19\x83\x16\x81\x17\x84U`@Q\x93\x94P\x91\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90`\0\x90\xA3PPPV[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x90V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90V[a\x07\xC9a\x080V[a\x04$\x81a\x08UV[a\x02\xABa\x080V[a\x07\xE3\x82a\x08]V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a\x08(Wa\x06\x9D\x82\x82a\x08\xB9V[a\x02xa\t1V[a\x088a\tPV[a\x02\xABW`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x03\xE8a\x080V[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a\x08\x8AW\x80`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x04\x01a\x04\x12\x91\x90a\n\xF7V[`\0\x80Q` a\x0B\xB9\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa\x08\xD6\x91\x90a\x0B\x9CV[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a\t\x11W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\t\x16V[``\x91P[P\x91P\x91Pa\t&\x85\x83\x83a\tjV[\x92PPP[\x92\x91PPV[4\x15a\x02\xABW`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\tZa\x07\x9DV[T`\x01`@\x1B\x90\x04`\xFF\x16\x91\x90PV[``\x82a\t\x7FWa\tz\x82a\t\xC0V[a\t\xB9V[\x81Q\x15\x80\x15a\t\x96WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\t\xB6W\x83`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x04\x01a\x04\x12\x91\x90a\n\xF7V[P\x80[\x93\x92PPPV[\x80Q\x15a\t\xD0W\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\n\0W`\0\x80\xFD[\x91\x90PV[`\0` \x82\x84\x03\x12\x15a\n\x17W`\0\x80\xFD[a\t\xB9\x82a\t\xE9V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`\0\x80`@\x83\x85\x03\x12\x15a\nIW`\0\x80\xFD[a\nR\x83a\t\xE9V[\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a\nnW`\0\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\n\x82W`\0\x80\xFD[\x815\x81\x81\x11\x15a\n\x94Wa\n\x94a\n V[`@Q`\x1F\x82\x01`\x1F\x19\x90\x81\x16`?\x01\x16\x81\x01\x90\x83\x82\x11\x81\x83\x10\x17\x15a\n\xBCWa\n\xBCa\n V[\x81`@R\x82\x81R\x88` \x84\x87\x01\x01\x11\x15a\n\xD5W`\0\x80\xFD[\x82` \x86\x01` \x83\x017`\0` \x84\x83\x01\x01R\x80\x95PPPPPP\x92P\x92\x90PV[`\x01`\x01`\xA0\x1B\x03\x91\x90\x91\x16\x81R` \x01\x90V[`\0[\x83\x81\x10\x15a\x0B&W\x81\x81\x01Q\x83\x82\x01R` \x01a\x0B\x0EV[PP`\0\x91\x01RV[` \x81R`\0\x82Q\x80` \x84\x01Ra\x0BN\x81`@\x85\x01` \x87\x01a\x0B\x0BV[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[\x80\x82\x01\x80\x82\x11\x15a\t+WcNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\0` \x82\x84\x03\x12\x15a\x0B\x95W`\0\x80\xFD[PQ\x91\x90PV[`\0\x82Qa\x0B\xAE\x81\x84` \x87\x01a\x0B\x0BV[\x91\x90\x91\x01\x92\x91PPV\xFE6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\xA1dsolcC\0\x08\x17\0\n";
/// The bytecode of the contract.
pub static FEECONTRACT_BYTECODE: ::ethers::core::types::Bytes =
::ethers::core::types::Bytes::from_static(__BYTECODE);
#[rustfmt::skip]
- const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R`\x046\x10a\0\xCBW`\x005`\xE0\x1C\x80c\x8D\xA5\xCB[\x11a\0tW\x80c\xC4\xD6m\xE8\x11a\0NW\x80c\xC4\xD6m\xE8\x14a\x02\xA9W\x80c\xF2\xFD\xE3\x8B\x14a\x02\xC9W\x80c\xF3@\xFA\x01\x14a\x02\xE9Wa\x01\x02V[\x80c\x8D\xA5\xCB[\x14a\x01\xF6W\x80c\x8E\xD82q\x14a\x02=W\x80c\xAD<\xB1\xCC\x14a\x02SWa\x01\x02V[\x80cR\xD1\x90-\x11a\0\xA5W\x80cR\xD1\x90-\x14a\x01\xB6W\x80cdP\x06\xCA\x14a\x01\xCBW\x80cqP\x18\xA6\x14a\x01\xE1Wa\x01\x02V[\x80c\r\x8En,\x14a\x014W\x80c'\xE25\xE3\x14a\x01fW\x80cO\x1E\xF2\x86\x14a\x01\xA1Wa\x01\x02V[6a\x01\x02W`@Q\x7F\xBC\x8E\xCA\x1B\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Q\x7F\xA9\xADb\xF8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[4\x80\x15a\x01@W`\0\x80\xFD[P`@\x80Q`\x01\x81R`\0` \x82\x01\x81\x90R\x91\x81\x01\x91\x90\x91R``\x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01rW`\0\x80\xFD[Pa\x01\x93a\x01\x816`\x04a\x0C\xDBV[`\x02` R`\0\x90\x81R`@\x90 T\x81V[`@Q\x90\x81R` \x01a\x01]V[a\x01\xB4a\x01\xAF6`\x04a\r%V[a\x02\xFCV[\0[4\x80\x15a\x01\xC2W`\0\x80\xFD[Pa\x01\x93a\x03\x1BV[4\x80\x15a\x01\xD7W`\0\x80\xFD[Pa\x01\x93`\x01T\x81V[4\x80\x15a\x01\xEDW`\0\x80\xFD[Pa\x01\xB4a\x03JV[4\x80\x15a\x02\x02W`\0\x80\xFD[P\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x01]V[4\x80\x15a\x02IW`\0\x80\xFD[Pa\x01\x93`\0T\x81V[4\x80\x15a\x02_W`\0\x80\xFD[Pa\x02\x9C`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01\x7F5.0.0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RP\x81V[`@Qa\x01]\x91\x90a\x0E\x0BV[4\x80\x15a\x02\xB5W`\0\x80\xFD[Pa\x01\xB4a\x02\xC46`\x04a\x0C\xDBV[a\x03^V[4\x80\x15a\x02\xD5W`\0\x80\xFD[Pa\x01\xB4a\x02\xE46`\x04a\x0C\xDBV[a\x04\xD1V[a\x01\xB4a\x02\xF76`\x04a\x0C\xDBV[a\x05-V[a\x03\x04a\x06SV[a\x03\r\x82a\x07#V[a\x03\x17\x82\x82a\x07jV[PPV[`\0a\x03%a\x08pV[P\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x90V[a\x03Ra\x08\xD2V[a\x03\\`\0a\tFV[V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x81\x04`\xFF\x16\x15\x90g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\0\x81\x15\x80\x15a\x03\xA9WP\x82[\x90P`\0\x82g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\x01\x14\x80\x15a\x03\xC6WP0;\x15[\x90P\x81\x15\x80\x15a\x03\xD4WP\x80\x15[\x15a\x04\x0BW`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\x16`\x01\x17\x85U\x83\x15a\x04VW\x84Th\xFF\0\0\0\0\0\0\0\0\x19\x16h\x01\0\0\0\0\0\0\0\0\x17\x85U[a\x04_\x86a\t\xCFV[a\x04ga\t\xE0V[g\r\xE0\xB6\xB3\xA7d\0\0`\0Uf\x03\x8D~\xA4\xC6\x80\0`\x01U\x83\x15a\x04\xC9W\x84Th\xFF\0\0\0\0\0\0\0\0\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPV[a\x04\xD9a\x08\xD2V[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x05!W`@Q\x7F\x1EO\xBD\xF7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\0`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[a\x05*\x81a\tFV[PV[`\x01T4\x10\x15a\x05iW`@Q\x7Fk\xA4\xA1\xC7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0T4\x11\x15a\x05\xA5W`@Q\x7F\xC5mF\xD3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x05\xE5W`@Q\x7Fp+=\x90\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x81\x16`\0\x90\x81R`\x02` R`@\x81 \x80T4\x92\x90a\x06\r\x90\x84\x90a\x0E>V[\x90\x91UPP`@Q4\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16\x90\x7F\xE1\xFF\xFC\xC4\x92=\x04\xB5Y\xF4\xD2\x9A\x8B\xFCl\xDA\x04\xEB[\r v\xCC75\xA9 \xA3\xCAP]8+\xBCT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\x03\\W`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x07+a\x08\xD2V[`@Q`\x01`\x01`\xA0\x1B\x03\x82\x16\x81R\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x90` \x01`@Q\x80\x91\x03\x90\xA1PV[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x07\xC4WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x07\xC1\x91\x81\x01\x90a\x0ExV[`\x01[a\x08\x05W`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\x05\x18V[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x81\x14a\x08aW`@Q\x7F\xAA\x1DI\xA4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x81\x01\x82\x90R`$\x01a\x05\x18V[a\x08k\x83\x83a\t\xE8V[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\x03\\W`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[3a\t\x04\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\x03\\W`@Q\x7F\x11\x8C\xDA\xA7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R3`\x04\x82\x01R`$\x01a\x05\x18V[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81\x16`\x01`\x01`\xA0\x1B\x03\x84\x81\x16\x91\x82\x17\x84U`@Q\x92\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90`\0\x90\xA3PPPV[a\t\xD7a\n>V[a\x05*\x81a\n\xA5V[a\x03\\a\n>V[a\t\xF1\x82a\n\xADV[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a\n6Wa\x08k\x82\x82a\x0BUV[a\x03\x17a\x0B\xCDV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0Th\x01\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16a\x03\\W`@Q\x7F\xD7\xE6\xBC\xF8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x04\xD9a\n>V[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a\n\xFCW`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x05\x18V[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa\x0Br\x91\x90a\x0E\x91V[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a\x0B\xADW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\x0B\xB2V[``\x91P[P\x91P\x91Pa\x0B\xC2\x85\x83\x83a\x0C\x05V[\x92PPP[\x92\x91PPV[4\x15a\x03\\W`@Q\x7F\xB3\x98\x97\x9F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x82a\x0C\x1AWa\x0C\x15\x82a\x0C}V[a\x0CvV[\x81Q\x15\x80\x15a\x0C1WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\x0CsW`@Q\x7F\x99\x96\xB3\x15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\x05\x18V[P\x80[\x93\x92PPPV[\x80Q\x15a\x0C\x8DW\x80Q\x80\x82` \x01\xFD[`@Q\x7F\x14%\xEAB\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x0C\xD6W`\0\x80\xFD[\x91\x90PV[`\0` \x82\x84\x03\x12\x15a\x0C\xEDW`\0\x80\xFD[a\x0Cv\x82a\x0C\xBFV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0R`A`\x04R`$`\0\xFD[`\0\x80`@\x83\x85\x03\x12\x15a\r8W`\0\x80\xFD[a\rA\x83a\x0C\xBFV[\x91P` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\r^W`\0\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\rrW`\0\x80\xFD[\x815\x81\x81\x11\x15a\r\x84Wa\r\x84a\x0C\xF6V[`@Q`\x1F\x82\x01`\x1F\x19\x90\x81\x16`?\x01\x16\x81\x01\x90\x83\x82\x11\x81\x83\x10\x17\x15a\r\xACWa\r\xACa\x0C\xF6V[\x81`@R\x82\x81R\x88` \x84\x87\x01\x01\x11\x15a\r\xC5W`\0\x80\xFD[\x82` \x86\x01` \x83\x017`\0` \x84\x83\x01\x01R\x80\x95PPPPPP\x92P\x92\x90PV[`\0[\x83\x81\x10\x15a\x0E\x02W\x81\x81\x01Q\x83\x82\x01R` \x01a\r\xEAV[PP`\0\x91\x01RV[` \x81R`\0\x82Q\x80` \x84\x01Ra\x0E*\x81`@\x85\x01` \x87\x01a\r\xE7V[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[\x80\x82\x01\x80\x82\x11\x15a\x0B\xC7W\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0R`\x11`\x04R`$`\0\xFD[`\0` \x82\x84\x03\x12\x15a\x0E\x8AW`\0\x80\xFD[PQ\x91\x90PV[`\0\x82Qa\x0E\xA3\x81\x84` \x87\x01a\r\xE7V[\x91\x90\x91\x01\x92\x91PPV\xFE\xA1dsolcC\0\x08\x17\0\n";
+ const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R`\x046\x10a\0\x9BW`\x005`\xE0\x1C\x80c\r\x8En,\x14a\0\xD2W\x80c'\xE25\xE3\x14a\x01\x04W\x80cO\x1E\xF2\x86\x14a\x01?W\x80cR\xD1\x90-\x14a\x01TW\x80cdP\x06\xCA\x14a\x01iW\x80cqP\x18\xA6\x14a\x01\x7FW\x80c\x8D\xA5\xCB[\x14a\x01\x94W\x80c\x8E\xD82q\x14a\x01\xB6W\x80c\xAD<\xB1\xCC\x14a\x01\xCCW\x80c\xC4\xD6m\xE8\x14a\x02\nW\x80c\xF2\xFD\xE3\x8B\x14a\x02*W\x80c\xF3@\xFA\x01\x14a\x02JWa\0\xB9V[6a\0\xB9W`@Qc\xBC\x8E\xCA\x1B`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Qc\x155\xAC_`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[4\x80\x15a\0\xDEW`\0\x80\xFD[P`@\x80Q`\x01\x81R`\0` \x82\x01\x81\x90R\x91\x81\x01\x91\x90\x91R``\x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\x10W`\0\x80\xFD[Pa\x011a\x01\x1F6`\x04a\n\x05V[`\x02` R`\0\x90\x81R`@\x90 T\x81V[`@Q\x90\x81R` \x01a\0\xFBV[a\x01Ra\x01M6`\x04a\n6V[a\x02]V[\0[4\x80\x15a\x01`W`\0\x80\xFD[Pa\x011a\x02|V[4\x80\x15a\x01uW`\0\x80\xFD[Pa\x011`\x01T\x81V[4\x80\x15a\x01\x8BW`\0\x80\xFD[Pa\x01Ra\x02\x99V[4\x80\x15a\x01\xA0W`\0\x80\xFD[Pa\x01\xA9a\x02\xADV[`@Qa\0\xFB\x91\x90a\n\xF7V[4\x80\x15a\x01\xC2W`\0\x80\xFD[Pa\x011`\0T\x81V[4\x80\x15a\x01\xD8W`\0\x80\xFD[Pa\x01\xFD`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01d\x03R\xE3\x02\xE3`\xDC\x1B\x81RP\x81V[`@Qa\0\xFB\x91\x90a\x0B/V[4\x80\x15a\x02\x16W`\0\x80\xFD[Pa\x01Ra\x02%6`\x04a\n\x05V[a\x02\xC8V[4\x80\x15a\x026W`\0\x80\xFD[Pa\x01Ra\x02E6`\x04a\n\x05V[a\x03\xE0V[a\x01Ra\x02X6`\x04a\n\x05V[a\x04'V[a\x02ea\x05\x02V[a\x02n\x82a\x05\xA7V[a\x02x\x82\x82a\x05\xE9V[PPV[`\0a\x02\x86a\x06\xA2V[P`\0\x80Q` a\x0B\xB9\x839\x81Q\x91R\x90V[a\x02\xA1a\x06\xEBV[a\x02\xAB`\0a\x07\x1DV[V[`\0\x80a\x02\xB8a\x07yV[T`\x01`\x01`\xA0\x1B\x03\x16\x92\x91PPV[`\0a\x02\xD2a\x07\x9DV[\x80T\x90\x91P`\xFF`\x01`@\x1B\x82\x04\x16\x15\x90`\x01`\x01`@\x1B\x03\x16`\0\x81\x15\x80\x15a\x02\xF9WP\x82[\x90P`\0\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a\x03\x15WP0;\x15[\x90P\x81\x15\x80\x15a\x03#WP\x80\x15[\x15a\x03AW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84T`\x01`\x01`@\x1B\x03\x19\x16`\x01\x17\x85U\x83\x15a\x03jW\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[a\x03s\x86a\x07\xC1V[a\x03{a\x07\xD2V[g\r\xE0\xB6\xB3\xA7d\0\0`\0Uf\x03\x8D~\xA4\xC6\x80\0`\x01U\x83\x15a\x03\xD8W\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPV[a\x03\xE8a\x06\xEBV[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x04\x1BW`\0`@Qc\x1EO\xBD\xF7`\xE0\x1B\x81R`\x04\x01a\x04\x12\x91\x90a\n\xF7V[`@Q\x80\x91\x03\x90\xFD[a\x04$\x81a\x07\x1DV[PV[`\x01T4\x10\x15a\x04JW`@Qck\xA4\xA1\xC7`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0T4\x11\x15a\x04mW`@Qc\xC5mF\xD3`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x04\x94W`@Qc\x07\x02\xB3\xD9`\xE4\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x81\x16`\0\x90\x81R`\x02` R`@\x81 \x80T4\x92\x90a\x04\xBC\x90\x84\x90a\x0BbV[\x90\x91UPP`@Q4\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16\x90\x7F\xE1\xFF\xFC\xC4\x92=\x04\xB5Y\xF4\xD2\x9A\x8B\xFCl\xDA\x04\xEB[\rF\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x05\xAFa\x06\xEBV[\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x81`@Qa\x05\xDE\x91\x90a\n\xF7V[`@Q\x80\x91\x03\x90\xA1PV[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x06CWP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x06@\x91\x81\x01\x90a\x0B\x83V[`\x01[a\x06bW\x81`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x04\x01a\x04\x12\x91\x90a\n\xF7V[`\0\x80Q` a\x0B\xB9\x839\x81Q\x91R\x81\x14a\x06\x93W`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x04\x12V[a\x06\x9D\x83\x83a\x07\xDAV[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\x02\xABW`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[3a\x06\xF4a\x02\xADV[`\x01`\x01`\xA0\x1B\x03\x16\x14a\x02\xABW3`@Qc\x11\x8C\xDA\xA7`\xE0\x1B\x81R`\x04\x01a\x04\x12\x91\x90a\n\xF7V[`\0a\x07'a\x07yV[\x80T`\x01`\x01`\xA0\x1B\x03\x84\x81\x16`\x01`\x01`\xA0\x1B\x03\x19\x83\x16\x81\x17\x84U`@Q\x93\x94P\x91\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90`\0\x90\xA3PPPV[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x90V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90V[a\x07\xC9a\x080V[a\x04$\x81a\x08UV[a\x02\xABa\x080V[a\x07\xE3\x82a\x08]V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a\x08(Wa\x06\x9D\x82\x82a\x08\xB9V[a\x02xa\t1V[a\x088a\tPV[a\x02\xABW`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x03\xE8a\x080V[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a\x08\x8AW\x80`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x04\x01a\x04\x12\x91\x90a\n\xF7V[`\0\x80Q` a\x0B\xB9\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa\x08\xD6\x91\x90a\x0B\x9CV[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a\t\x11W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\t\x16V[``\x91P[P\x91P\x91Pa\t&\x85\x83\x83a\tjV[\x92PPP[\x92\x91PPV[4\x15a\x02\xABW`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\tZa\x07\x9DV[T`\x01`@\x1B\x90\x04`\xFF\x16\x91\x90PV[``\x82a\t\x7FWa\tz\x82a\t\xC0V[a\t\xB9V[\x81Q\x15\x80\x15a\t\x96WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\t\xB6W\x83`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x04\x01a\x04\x12\x91\x90a\n\xF7V[P\x80[\x93\x92PPPV[\x80Q\x15a\t\xD0W\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\n\0W`\0\x80\xFD[\x91\x90PV[`\0` \x82\x84\x03\x12\x15a\n\x17W`\0\x80\xFD[a\t\xB9\x82a\t\xE9V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`\0\x80`@\x83\x85\x03\x12\x15a\nIW`\0\x80\xFD[a\nR\x83a\t\xE9V[\x91P` \x83\x015`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a\nnW`\0\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\n\x82W`\0\x80\xFD[\x815\x81\x81\x11\x15a\n\x94Wa\n\x94a\n V[`@Q`\x1F\x82\x01`\x1F\x19\x90\x81\x16`?\x01\x16\x81\x01\x90\x83\x82\x11\x81\x83\x10\x17\x15a\n\xBCWa\n\xBCa\n V[\x81`@R\x82\x81R\x88` \x84\x87\x01\x01\x11\x15a\n\xD5W`\0\x80\xFD[\x82` \x86\x01` \x83\x017`\0` \x84\x83\x01\x01R\x80\x95PPPPPP\x92P\x92\x90PV[`\x01`\x01`\xA0\x1B\x03\x91\x90\x91\x16\x81R` \x01\x90V[`\0[\x83\x81\x10\x15a\x0B&W\x81\x81\x01Q\x83\x82\x01R` \x01a\x0B\x0EV[PP`\0\x91\x01RV[` \x81R`\0\x82Q\x80` \x84\x01Ra\x0BN\x81`@\x85\x01` \x87\x01a\x0B\x0BV[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[\x80\x82\x01\x80\x82\x11\x15a\t+WcNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\0` \x82\x84\x03\x12\x15a\x0B\x95W`\0\x80\xFD[PQ\x91\x90PV[`\0\x82Qa\x0B\xAE\x81\x84` \x87\x01a\x0B\x0BV[\x91\x90\x91\x01\x92\x91PPV\xFE6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\xA1dsolcC\0\x08\x17\0\n";
/// The deployed bytecode of the contract.
pub static FEECONTRACT_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes =
::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE);
diff --git a/contract-bindings/src/hot_shot.rs b/contract-bindings/src/hot_shot.rs
index e1a101b3a..792d4644d 100644
--- a/contract-bindings/src/hot_shot.rs
+++ b/contract-bindings/src/hot_shot.rs
@@ -283,12 +283,12 @@ pub mod hot_shot {
pub static HOTSHOT_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> =
::ethers::contract::Lazy::new(__abi);
#[rustfmt::skip]
- const __BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[Pa\x06\x07\x80a\0 `\09`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0rW`\x005`\xE0\x1C\x80cg\xA2\x1Ep\x11a\0PW\x80cg\xA2\x1Ep\x14a\0\xC8W\x80c\xF1\xF4]\x99\x14a\x01\x12W\x80c\xF4O\xF7\x12\x14a\x01%W`\0\x80\xFD[\x80c\n2\x1C\xFF\x14a\0wW\x80c&\x83=\xCC\x14a\0\x8CW\x80cI\xCE\x89\x97\x14a\0\xA8W[`\0\x80\xFD[a\0\x8Aa\0\x856`\x04a\x04\xA9V[a\x01.V[\0[a\0\x95a\x01\xF4\x81V[`@Q\x90\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\x95a\0\xB66`\x04a\x05\x1EV[`\0` \x81\x90R\x90\x81R`@\x90 T\x81V[a\0\xDBa\0\xD66`\x04a\x05\x1EV[a\x02\xEDV[`@\x80Q\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R\x83\x82\x01Q\x91\x81\x01\x91\x90\x91R``\x92\x83\x01Q\x92\x81\x01\x92\x90\x92R`\x80\x82\x01R`\xA0\x01a\0\x9FV[a\0\x8Aa\x01 6`\x04a\x057V[a\x03\x81V[a\0\x95`\x01T\x81V[a\x01\xF4\x81\x11\x15a\x01rW`@Q\x7F\xE0\x82\x84\x0B\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x81\x01\x82\x90R`$\x01[`@Q\x80\x91\x03\x90\xFD[`\x01T`\0[\x82\x81\x10\x15a\x02\xADW`\x01T\x84\x84\x83\x81\x81\x10a\x01\x95Wa\x01\x95a\x05\xBDV[\x90P`\x80\x02\x01`\0\x015\x14a\x02\0W\x83\x83\x82\x81\x81\x10a\x01\xB6Wa\x01\xB6a\x05\xBDV[\x90P`\x80\x02\x01`\0\x015`\x01T`@Q\x7F4\xE4#\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x01i\x92\x91\x90\x91\x82R` \x82\x01R`@\x01\x90V[a\x02\x1E\x84\x84\x83\x81\x81\x10a\x02\x15Wa\x02\x15a\x05\xBDV[\x90PPP`\x01\x90V[a\x02ZW`\x01T`@Q\x7Fx\x18g\x19\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x01i\x91\x81R` \x01\x90V[\x83\x83\x82\x81\x81\x10a\x02lWa\x02la\x05\xBDV[\x90P`\x80\x02\x01` \x015`\0\x80`\x01T\x81R` \x01\x90\x81R` \x01`\0 \x81\x90UP`\x01\x80`\0\x82\x82Ta\x02\xA0\x91\x90a\x05\xD3V[\x90\x91UPP`\x01\x01a\x01xV[P`@\x80Q\x82\x81R` \x81\x01\x84\x90R\x7F\x82\x03\xA2\x1EO\x95\xF7.P\x81\xD5\xE0\x92\x9B\x1A\x8CR\x14\x1E\x12?\x9A\x14\xE1\xE7K\x02`\xFA_R\xF1\x91\x01[`@Q\x80\x91\x03\x90\xA1PPPV[a\x03\x18`@Q\x80`\x80\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`\0`\x03\x83\x81T\x81\x10a\x03-Wa\x03-a\x05\xBDV[`\0\x91\x82R` \x80\x83 \x95\x83R`\x02\x80\x82R`@\x93\x84\x90 T\x84Q`\x80\x81\x01\x86R`\x04\x90\x94\x02\x90\x97\x01\x80T\x84R`\x01\x81\x01T\x92\x84\x01\x92\x90\x92R\x81\x01T\x92\x82\x01\x92\x90\x92R`\x03\x90\x91\x01T``\x82\x01R\x93\x91PPV[`\x03\x80T`\0\x81\x81R`\x02` \x90\x81R`@\x80\x83 \x86\x90U\x84T`\x01\x81\x01\x86U\x94\x90\x92R\x85Q`\x04\x90\x94\x02\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8[\x81\x01\x85\x90U\x86\x82\x01\x80Q\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8\\\x83\x01U\x87\x84\x01\x80Q\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8]\x84\x01U``\x80\x8A\x01\x80Q\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8^\x90\x95\x01\x94\x90\x94U\x85Q\x97\x88R\x91Q\x93\x87\x01\x93\x90\x93R\x91Q\x92\x85\x01\x92\x90\x92R\x90Q\x90\x83\x01R`\x80\x82\x01\x83\x90R`\xA0\x82\x01\x81\x90R\x90\x7F\xD7/\xE1\xACW\xD3\xE6\xD5\x1C\x92*\xE4\xD8\x11\xCCP\xAA:\xD7\x02b\x83\xAE\xA67IJ\x072RVZ\x90`\xC0\x01a\x02\xE0V[`\0\x80` \x83\x85\x03\x12\x15a\x04\xBCW`\0\x80\xFD[\x825g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x04\xD4W`\0\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\x04\xE8W`\0\x80\xFD[\x815\x81\x81\x11\x15a\x04\xF7W`\0\x80\xFD[\x86` \x82`\x07\x1B\x85\x01\x01\x11\x15a\x05\x0CW`\0\x80\xFD[` \x92\x90\x92\x01\x96\x91\x95P\x90\x93PPPPV[`\0` \x82\x84\x03\x12\x15a\x050W`\0\x80\xFD[P5\x91\x90PV[`\0\x80\x82\x84\x03`\xA0\x81\x12\x15a\x05KW`\0\x80\xFD[`\x80\x81\x12\x15a\x05YW`\0\x80\xFD[P`@Q`\x80\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a\x05\x8BWcNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@\x90\x81R\x845\x82R` \x80\x86\x015\x90\x83\x01R\x84\x81\x015\x90\x82\x01R``\x80\x85\x015\x90\x82\x01R\x94`\x80\x90\x93\x015\x93PPPV[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[\x80\x82\x01\x80\x82\x11\x15a\x05\xF4WcNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x92\x91PPV\xFE\xA1dsolcC\0\x08\x17\0\n";
+ const __BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[Pa\x05\xB8\x80a\0 `\09`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0bW`\x005`\xE0\x1C\x80c\n2\x1C\xFF\x14a\0gW\x80c&\x83=\xCC\x14a\0|W\x80cI\xCE\x89\x97\x14a\0\x98W\x80cg\xA2\x1Ep\x14a\0\xB8W\x80c\xF1\xF4]\x99\x14a\0\xD9W\x80c\xF4O\xF7\x12\x14a\0\xECW[`\0\x80\xFD[a\0za\0u6`\x04a\x03\xFCV[a\0\xF5V[\0[a\0\x85a\x01\xF4\x81V[`@Q\x90\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\x85a\0\xA66`\x04a\x04pV[`\0` \x81\x90R\x90\x81R`@\x90 T\x81V[a\0\xCBa\0\xC66`\x04a\x04pV[a\x02iV[`@Qa\0\x8F\x92\x91\x90a\x04\xAFV[a\0za\0\xE76`\x04a\x04\xCAV[a\x02\xFDV[a\0\x85`\x01T\x81V[a\x01\xF4\x81\x11\x15a\x01 W`@Qc\xE0\x82\x84\x0B`\xE0\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01[`@Q\x80\x91\x03\x90\xFD[`\x01T`\0[\x82\x81\x10\x15a\x02)W`\x01T\x84\x84\x83\x81\x81\x10a\x01CWa\x01Ca\x05OV[\x90P`\x80\x02\x01`\0\x015\x14a\x01\x95W\x83\x83\x82\x81\x81\x10a\x01dWa\x01da\x05OV[\x90P`\x80\x02\x01`\0\x015`\x01T`@Qc4\xE4#\xFF`\xE0\x1B\x81R`\x04\x01a\x01\x17\x92\x91\x90\x91\x82R` \x82\x01R`@\x01\x90V[a\x01\xB3\x84\x84\x83\x81\x81\x10a\x01\xAAWa\x01\xAAa\x05OV[\x90PPP`\x01\x90V[a\x01\xD6W`\x01T`@Qcx\x18g\x19`\xE0\x1B\x81R`\x04\x01a\x01\x17\x91\x81R` \x01\x90V[\x83\x83\x82\x81\x81\x10a\x01\xE8Wa\x01\xE8a\x05OV[\x90P`\x80\x02\x01` \x015`\0\x80`\x01T\x81R` \x01\x90\x81R` \x01`\0 \x81\x90UP`\x01\x80`\0\x82\x82Ta\x02\x1C\x91\x90a\x05eV[\x90\x91UPP`\x01\x01a\x01&V[P`@\x80Q\x82\x81R` \x81\x01\x84\x90R\x7F\x82\x03\xA2\x1EO\x95\xF7.P\x81\xD5\xE0\x92\x9B\x1A\x8CR\x14\x1E\x12?\x9A\x14\xE1\xE7K\x02`\xFA_R\xF1\x91\x01[`@Q\x80\x91\x03\x90\xA1PPPV[a\x02\x94`@Q\x80`\x80\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`\0`\x03\x83\x81T\x81\x10a\x02\xA9Wa\x02\xA9a\x05OV[`\0\x91\x82R` \x80\x83 \x95\x83R`\x02\x80\x82R`@\x93\x84\x90 T\x84Q`\x80\x81\x01\x86R`\x04\x90\x94\x02\x90\x97\x01\x80T\x84R`\x01\x81\x01T\x92\x84\x01\x92\x90\x92R\x81\x01T\x92\x82\x01\x92\x90\x92R`\x03\x90\x91\x01T``\x82\x01R\x93\x91PPV[`\x03\x80T`\0\x81\x81R`\x02` \x90\x81R`@\x80\x83 \x86\x90U\x84T`\x01\x81\x01\x86U\x94\x90\x92R\x85Q\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8[`\x04\x90\x95\x02\x94\x85\x01U\x85\x01Q\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8\\\x84\x01U\x84\x81\x01Q\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8]\x84\x01U``\x85\x01Q\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8^\x90\x93\x01\x92\x90\x92U\x90Q\x7F\xD7/\xE1\xACW\xD3\xE6\xD5\x1C\x92*\xE4\xD8\x11\xCCP\xAA:\xD7\x02b\x83\xAE\xA67IJ\x072RVZ\x90a\x02\\\x90\x85\x90\x85\x90\x85\x90a\x05\x8CV[`\0\x80` \x83\x85\x03\x12\x15a\x04\x0FW`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a\x04&W`\0\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\x04:W`\0\x80\xFD[\x815\x81\x81\x11\x15a\x04IW`\0\x80\xFD[\x86` \x82`\x07\x1B\x85\x01\x01\x11\x15a\x04^W`\0\x80\xFD[` \x92\x90\x92\x01\x96\x91\x95P\x90\x93PPPPV[`\0` \x82\x84\x03\x12\x15a\x04\x82W`\0\x80\xFD[P5\x91\x90PV[\x80Q\x82R` \x81\x01Q` \x83\x01R`@\x81\x01Q`@\x83\x01R``\x81\x01Q``\x83\x01RPPV[`\xA0\x81\x01a\x04\xBD\x82\x85a\x04\x89V[\x82`\x80\x83\x01R\x93\x92PPPV[`\0\x80\x82\x84\x03`\xA0\x81\x12\x15a\x04\xDEW`\0\x80\xFD[`\x80\x81\x12\x15a\x04\xECW`\0\x80\xFD[P`@Q`\x80\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x05\x1DWcNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@\x90\x81R\x845\x82R` \x80\x86\x015\x90\x83\x01R\x84\x81\x015\x90\x82\x01R``\x80\x85\x015\x90\x82\x01R\x94`\x80\x90\x93\x015\x93PPPV[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[\x80\x82\x01\x80\x82\x11\x15a\x05\x86WcNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x92\x91PPV[`\xC0\x81\x01a\x05\x9A\x82\x86a\x04\x89V[`\x80\x82\x01\x93\x90\x93R`\xA0\x01R\x91\x90PV\xFE\xA1dsolcC\0\x08\x17\0\n";
/// The bytecode of the contract.
pub static HOTSHOT_BYTECODE: ::ethers::core::types::Bytes =
::ethers::core::types::Bytes::from_static(__BYTECODE);
#[rustfmt::skip]
- const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0rW`\x005`\xE0\x1C\x80cg\xA2\x1Ep\x11a\0PW\x80cg\xA2\x1Ep\x14a\0\xC8W\x80c\xF1\xF4]\x99\x14a\x01\x12W\x80c\xF4O\xF7\x12\x14a\x01%W`\0\x80\xFD[\x80c\n2\x1C\xFF\x14a\0wW\x80c&\x83=\xCC\x14a\0\x8CW\x80cI\xCE\x89\x97\x14a\0\xA8W[`\0\x80\xFD[a\0\x8Aa\0\x856`\x04a\x04\xA9V[a\x01.V[\0[a\0\x95a\x01\xF4\x81V[`@Q\x90\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\x95a\0\xB66`\x04a\x05\x1EV[`\0` \x81\x90R\x90\x81R`@\x90 T\x81V[a\0\xDBa\0\xD66`\x04a\x05\x1EV[a\x02\xEDV[`@\x80Q\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R\x83\x82\x01Q\x91\x81\x01\x91\x90\x91R``\x92\x83\x01Q\x92\x81\x01\x92\x90\x92R`\x80\x82\x01R`\xA0\x01a\0\x9FV[a\0\x8Aa\x01 6`\x04a\x057V[a\x03\x81V[a\0\x95`\x01T\x81V[a\x01\xF4\x81\x11\x15a\x01rW`@Q\x7F\xE0\x82\x84\x0B\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x81\x01\x82\x90R`$\x01[`@Q\x80\x91\x03\x90\xFD[`\x01T`\0[\x82\x81\x10\x15a\x02\xADW`\x01T\x84\x84\x83\x81\x81\x10a\x01\x95Wa\x01\x95a\x05\xBDV[\x90P`\x80\x02\x01`\0\x015\x14a\x02\0W\x83\x83\x82\x81\x81\x10a\x01\xB6Wa\x01\xB6a\x05\xBDV[\x90P`\x80\x02\x01`\0\x015`\x01T`@Q\x7F4\xE4#\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x01i\x92\x91\x90\x91\x82R` \x82\x01R`@\x01\x90V[a\x02\x1E\x84\x84\x83\x81\x81\x10a\x02\x15Wa\x02\x15a\x05\xBDV[\x90PPP`\x01\x90V[a\x02ZW`\x01T`@Q\x7Fx\x18g\x19\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01a\x01i\x91\x81R` \x01\x90V[\x83\x83\x82\x81\x81\x10a\x02lWa\x02la\x05\xBDV[\x90P`\x80\x02\x01` \x015`\0\x80`\x01T\x81R` \x01\x90\x81R` \x01`\0 \x81\x90UP`\x01\x80`\0\x82\x82Ta\x02\xA0\x91\x90a\x05\xD3V[\x90\x91UPP`\x01\x01a\x01xV[P`@\x80Q\x82\x81R` \x81\x01\x84\x90R\x7F\x82\x03\xA2\x1EO\x95\xF7.P\x81\xD5\xE0\x92\x9B\x1A\x8CR\x14\x1E\x12?\x9A\x14\xE1\xE7K\x02`\xFA_R\xF1\x91\x01[`@Q\x80\x91\x03\x90\xA1PPPV[a\x03\x18`@Q\x80`\x80\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`\0`\x03\x83\x81T\x81\x10a\x03-Wa\x03-a\x05\xBDV[`\0\x91\x82R` \x80\x83 \x95\x83R`\x02\x80\x82R`@\x93\x84\x90 T\x84Q`\x80\x81\x01\x86R`\x04\x90\x94\x02\x90\x97\x01\x80T\x84R`\x01\x81\x01T\x92\x84\x01\x92\x90\x92R\x81\x01T\x92\x82\x01\x92\x90\x92R`\x03\x90\x91\x01T``\x82\x01R\x93\x91PPV[`\x03\x80T`\0\x81\x81R`\x02` \x90\x81R`@\x80\x83 \x86\x90U\x84T`\x01\x81\x01\x86U\x94\x90\x92R\x85Q`\x04\x90\x94\x02\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8[\x81\x01\x85\x90U\x86\x82\x01\x80Q\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8\\\x83\x01U\x87\x84\x01\x80Q\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8]\x84\x01U``\x80\x8A\x01\x80Q\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8^\x90\x95\x01\x94\x90\x94U\x85Q\x97\x88R\x91Q\x93\x87\x01\x93\x90\x93R\x91Q\x92\x85\x01\x92\x90\x92R\x90Q\x90\x83\x01R`\x80\x82\x01\x83\x90R`\xA0\x82\x01\x81\x90R\x90\x7F\xD7/\xE1\xACW\xD3\xE6\xD5\x1C\x92*\xE4\xD8\x11\xCCP\xAA:\xD7\x02b\x83\xAE\xA67IJ\x072RVZ\x90`\xC0\x01a\x02\xE0V[`\0\x80` \x83\x85\x03\x12\x15a\x04\xBCW`\0\x80\xFD[\x825g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x04\xD4W`\0\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\x04\xE8W`\0\x80\xFD[\x815\x81\x81\x11\x15a\x04\xF7W`\0\x80\xFD[\x86` \x82`\x07\x1B\x85\x01\x01\x11\x15a\x05\x0CW`\0\x80\xFD[` \x92\x90\x92\x01\x96\x91\x95P\x90\x93PPPPV[`\0` \x82\x84\x03\x12\x15a\x050W`\0\x80\xFD[P5\x91\x90PV[`\0\x80\x82\x84\x03`\xA0\x81\x12\x15a\x05KW`\0\x80\xFD[`\x80\x81\x12\x15a\x05YW`\0\x80\xFD[P`@Q`\x80\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a\x05\x8BWcNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@\x90\x81R\x845\x82R` \x80\x86\x015\x90\x83\x01R\x84\x81\x015\x90\x82\x01R``\x80\x85\x015\x90\x82\x01R\x94`\x80\x90\x93\x015\x93PPPV[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[\x80\x82\x01\x80\x82\x11\x15a\x05\xF4WcNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x92\x91PPV\xFE\xA1dsolcC\0\x08\x17\0\n";
+ const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0bW`\x005`\xE0\x1C\x80c\n2\x1C\xFF\x14a\0gW\x80c&\x83=\xCC\x14a\0|W\x80cI\xCE\x89\x97\x14a\0\x98W\x80cg\xA2\x1Ep\x14a\0\xB8W\x80c\xF1\xF4]\x99\x14a\0\xD9W\x80c\xF4O\xF7\x12\x14a\0\xECW[`\0\x80\xFD[a\0za\0u6`\x04a\x03\xFCV[a\0\xF5V[\0[a\0\x85a\x01\xF4\x81V[`@Q\x90\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\x85a\0\xA66`\x04a\x04pV[`\0` \x81\x90R\x90\x81R`@\x90 T\x81V[a\0\xCBa\0\xC66`\x04a\x04pV[a\x02iV[`@Qa\0\x8F\x92\x91\x90a\x04\xAFV[a\0za\0\xE76`\x04a\x04\xCAV[a\x02\xFDV[a\0\x85`\x01T\x81V[a\x01\xF4\x81\x11\x15a\x01 W`@Qc\xE0\x82\x84\x0B`\xE0\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01[`@Q\x80\x91\x03\x90\xFD[`\x01T`\0[\x82\x81\x10\x15a\x02)W`\x01T\x84\x84\x83\x81\x81\x10a\x01CWa\x01Ca\x05OV[\x90P`\x80\x02\x01`\0\x015\x14a\x01\x95W\x83\x83\x82\x81\x81\x10a\x01dWa\x01da\x05OV[\x90P`\x80\x02\x01`\0\x015`\x01T`@Qc4\xE4#\xFF`\xE0\x1B\x81R`\x04\x01a\x01\x17\x92\x91\x90\x91\x82R` \x82\x01R`@\x01\x90V[a\x01\xB3\x84\x84\x83\x81\x81\x10a\x01\xAAWa\x01\xAAa\x05OV[\x90PPP`\x01\x90V[a\x01\xD6W`\x01T`@Qcx\x18g\x19`\xE0\x1B\x81R`\x04\x01a\x01\x17\x91\x81R` \x01\x90V[\x83\x83\x82\x81\x81\x10a\x01\xE8Wa\x01\xE8a\x05OV[\x90P`\x80\x02\x01` \x015`\0\x80`\x01T\x81R` \x01\x90\x81R` \x01`\0 \x81\x90UP`\x01\x80`\0\x82\x82Ta\x02\x1C\x91\x90a\x05eV[\x90\x91UPP`\x01\x01a\x01&V[P`@\x80Q\x82\x81R` \x81\x01\x84\x90R\x7F\x82\x03\xA2\x1EO\x95\xF7.P\x81\xD5\xE0\x92\x9B\x1A\x8CR\x14\x1E\x12?\x9A\x14\xE1\xE7K\x02`\xFA_R\xF1\x91\x01[`@Q\x80\x91\x03\x90\xA1PPPV[a\x02\x94`@Q\x80`\x80\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`\0`\x03\x83\x81T\x81\x10a\x02\xA9Wa\x02\xA9a\x05OV[`\0\x91\x82R` \x80\x83 \x95\x83R`\x02\x80\x82R`@\x93\x84\x90 T\x84Q`\x80\x81\x01\x86R`\x04\x90\x94\x02\x90\x97\x01\x80T\x84R`\x01\x81\x01T\x92\x84\x01\x92\x90\x92R\x81\x01T\x92\x82\x01\x92\x90\x92R`\x03\x90\x91\x01T``\x82\x01R\x93\x91PPV[`\x03\x80T`\0\x81\x81R`\x02` \x90\x81R`@\x80\x83 \x86\x90U\x84T`\x01\x81\x01\x86U\x94\x90\x92R\x85Q\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8[`\x04\x90\x95\x02\x94\x85\x01U\x85\x01Q\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8\\\x84\x01U\x84\x81\x01Q\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8]\x84\x01U``\x85\x01Q\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8^\x90\x93\x01\x92\x90\x92U\x90Q\x7F\xD7/\xE1\xACW\xD3\xE6\xD5\x1C\x92*\xE4\xD8\x11\xCCP\xAA:\xD7\x02b\x83\xAE\xA67IJ\x072RVZ\x90a\x02\\\x90\x85\x90\x85\x90\x85\x90a\x05\x8CV[`\0\x80` \x83\x85\x03\x12\x15a\x04\x0FW`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a\x04&W`\0\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\x04:W`\0\x80\xFD[\x815\x81\x81\x11\x15a\x04IW`\0\x80\xFD[\x86` \x82`\x07\x1B\x85\x01\x01\x11\x15a\x04^W`\0\x80\xFD[` \x92\x90\x92\x01\x96\x91\x95P\x90\x93PPPPV[`\0` \x82\x84\x03\x12\x15a\x04\x82W`\0\x80\xFD[P5\x91\x90PV[\x80Q\x82R` \x81\x01Q` \x83\x01R`@\x81\x01Q`@\x83\x01R``\x81\x01Q``\x83\x01RPPV[`\xA0\x81\x01a\x04\xBD\x82\x85a\x04\x89V[\x82`\x80\x83\x01R\x93\x92PPPV[`\0\x80\x82\x84\x03`\xA0\x81\x12\x15a\x04\xDEW`\0\x80\xFD[`\x80\x81\x12\x15a\x04\xECW`\0\x80\xFD[P`@Q`\x80\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x05\x1DWcNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@\x90\x81R\x845\x82R` \x80\x86\x015\x90\x83\x01R\x84\x81\x015\x90\x82\x01R``\x80\x85\x015\x90\x82\x01R\x94`\x80\x90\x93\x015\x93PPPV[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[\x80\x82\x01\x80\x82\x11\x15a\x05\x86WcNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x92\x91PPV[`\xC0\x81\x01a\x05\x9A\x82\x86a\x04\x89V[`\x80\x82\x01\x93\x90\x93R`\xA0\x01R\x91\x90PV\xFE\xA1dsolcC\0\x08\x17\0\n";
/// The deployed bytecode of the contract.
pub static HOTSHOT_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes =
::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE);
diff --git a/contract-bindings/src/light_client.rs b/contract-bindings/src/light_client.rs
index d5ff02b7a..f74ae81c7 100644
--- a/contract-bindings/src/light_client.rs
+++ b/contract-bindings/src/light_client.rs
@@ -195,6 +195,65 @@ pub mod light_client {
state_mutability: ::ethers::core::abi::ethabi::StateMutability::View,
},],
),
+ (
+ ::std::borrow::ToOwned::to_owned("getHotShotBlockCommitmentsCount"),
+ ::std::vec![::ethers::core::abi::ethabi::Function {
+ name: ::std::borrow::ToOwned::to_owned("getHotShotBlockCommitmentsCount",),
+ inputs: ::std::vec![],
+ outputs: ::std::vec![::ethers::core::abi::ethabi::Param {
+ name: ::std::string::String::new(),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint256"),
+ ),
+ },],
+ constant: ::core::option::Option::None,
+ state_mutability: ::ethers::core::abi::ethabi::StateMutability::View,
+ },],
+ ),
+ (
+ ::std::borrow::ToOwned::to_owned("getHotShotCommitment"),
+ ::std::vec![::ethers::core::abi::ethabi::Function {
+ name: ::std::borrow::ToOwned::to_owned("getHotShotCommitment",),
+ inputs: ::std::vec![::ethers::core::abi::ethabi::Param {
+ name: ::std::borrow::ToOwned::to_owned("hotShotBlockHeight",),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint256"),
+ ),
+ },],
+ outputs: ::std::vec![::ethers::core::abi::ethabi::Param {
+ name: ::std::string::String::new(),
+ kind: ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![
+ ::ethers::core::abi::ethabi::ParamType::Uint(64usize),
+ ::ethers::core::abi::ethabi::ParamType::Uint(256usize),
+ ],),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned(
+ "struct LightClient.HotShotCommitment",
+ ),
+ ),
+ },],
+ constant: ::core::option::Option::None,
+ state_mutability: ::ethers::core::abi::ethabi::StateMutability::View,
+ },],
+ ),
+ (
+ ::std::borrow::ToOwned::to_owned("getStateUpdateBlockNumbersCount"),
+ ::std::vec![::ethers::core::abi::ethabi::Function {
+ name: ::std::borrow::ToOwned::to_owned("getStateUpdateBlockNumbersCount",),
+ inputs: ::std::vec![],
+ outputs: ::std::vec![::ethers::core::abi::ethabi::Param {
+ name: ::std::string::String::new(),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint256"),
+ ),
+ },],
+ constant: ::core::option::Option::None,
+ state_mutability: ::ethers::core::abi::ethabi::StateMutability::View,
+ },],
+ ),
(
::std::borrow::ToOwned::to_owned("getVersion"),
::std::vec![::ethers::core::abi::ethabi::Function {
@@ -227,6 +286,37 @@ pub mod light_client {
state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure,
},],
),
+ (
+ ::std::borrow::ToOwned::to_owned("hotShotCommitments"),
+ ::std::vec![::ethers::core::abi::ethabi::Function {
+ name: ::std::borrow::ToOwned::to_owned("hotShotCommitments"),
+ inputs: ::std::vec![::ethers::core::abi::ethabi::Param {
+ name: ::std::string::String::new(),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint256"),
+ ),
+ },],
+ outputs: ::std::vec![
+ ::ethers::core::abi::ethabi::Param {
+ name: ::std::borrow::ToOwned::to_owned("blockHeight"),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint64"),
+ ),
+ },
+ ::ethers::core::abi::ethabi::Param {
+ name: ::std::borrow::ToOwned::to_owned("blockCommRoot"),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("BN254.ScalarField"),
+ ),
+ },
+ ],
+ constant: ::core::option::Option::None,
+ state_mutability: ::ethers::core::abi::ethabi::StateMutability::View,
+ },],
+ ),
(
::std::borrow::ToOwned::to_owned("initialize"),
::std::vec![::ethers::core::abi::ethabi::Function {
@@ -270,6 +360,37 @@ pub mod light_client {
state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable,
},],
),
+ (
+ ::std::borrow::ToOwned::to_owned("lagOverEscapeHatchThreshold"),
+ ::std::vec![::ethers::core::abi::ethabi::Function {
+ name: ::std::borrow::ToOwned::to_owned("lagOverEscapeHatchThreshold",),
+ inputs: ::std::vec![
+ ::ethers::core::abi::ethabi::Param {
+ name: ::std::borrow::ToOwned::to_owned("blockNumber"),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint256"),
+ ),
+ },
+ ::ethers::core::abi::ethabi::Param {
+ name: ::std::borrow::ToOwned::to_owned("threshold"),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint256"),
+ ),
+ },
+ ],
+ outputs: ::std::vec![::ethers::core::abi::ethabi::Param {
+ name: ::std::string::String::new(),
+ kind: ::ethers::core::abi::ethabi::ParamType::Bool,
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("bool"),
+ ),
+ },],
+ constant: ::core::option::Option::None,
+ state_mutability: ::ethers::core::abi::ethabi::StateMutability::View,
+ },],
+ ),
(
::std::borrow::ToOwned::to_owned("newFinalizedState"),
::std::vec![::ethers::core::abi::ethabi::Function {
@@ -461,6 +582,28 @@ pub mod light_client {
state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable,
},],
),
+ (
+ ::std::borrow::ToOwned::to_owned("stateUpdateBlockNumbers"),
+ ::std::vec![::ethers::core::abi::ethabi::Function {
+ name: ::std::borrow::ToOwned::to_owned("stateUpdateBlockNumbers",),
+ inputs: ::std::vec![::ethers::core::abi::ethabi::Param {
+ name: ::std::string::String::new(),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint256"),
+ ),
+ },],
+ outputs: ::std::vec![::ethers::core::abi::ethabi::Param {
+ name: ::std::string::String::new(),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint256"),
+ ),
+ },],
+ constant: ::core::option::Option::None,
+ state_mutability: ::ethers::core::abi::ethabi::StateMutability::View,
+ },],
+ ),
(
::std::borrow::ToOwned::to_owned("states"),
::std::vec![::ethers::core::abi::ethabi::Function {
@@ -762,6 +905,13 @@ pub mod light_client {
inputs: ::std::vec![],
},],
),
+ (
+ ::std::borrow::ToOwned::to_owned("InsufficientSnapshotHistory"),
+ ::std::vec![::ethers::core::abi::ethabi::AbiError {
+ name: ::std::borrow::ToOwned::to_owned("InsufficientSnapshotHistory",),
+ inputs: ::std::vec![],
+ },],
+ ),
(
::std::borrow::ToOwned::to_owned("InvalidAddress"),
::std::vec![::ethers::core::abi::ethabi::AbiError {
@@ -776,6 +926,15 @@ pub mod light_client {
inputs: ::std::vec![],
},],
),
+ (
+ ::std::borrow::ToOwned::to_owned("InvalidHotShotBlockForCommitmentCheck"),
+ ::std::vec![::ethers::core::abi::ethabi::AbiError {
+ name: ::std::borrow::ToOwned::to_owned(
+ "InvalidHotShotBlockForCommitmentCheck",
+ ),
+ inputs: ::std::vec![],
+ },],
+ ),
(
::std::borrow::ToOwned::to_owned("InvalidInitialization"),
::std::vec![::ethers::core::abi::ethabi::AbiError {
@@ -921,12 +1080,12 @@ pub mod light_client {
pub static LIGHTCLIENT_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> =
::ethers::contract::Lazy::new(__abi);
#[rustfmt::skip]
- const __BYTECODE: &[u8] = b"`\xA0`@R0`\x80R4\x80\x15b\0\0\x15W`\0\x80\xFD[Pb\0\0 b\0\0&V[b\0\0\xDAV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16\x15b\0\0wW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80T`\x01`\x01`@\x1B\x03\x90\x81\x16\x14b\0\0\xD7W\x80T`\x01`\x01`@\x1B\x03\x19\x16`\x01`\x01`@\x1B\x03\x90\x81\x17\x82U`@Q\x90\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PV[`\x80Qa]\x9Fb\0\x01\x04`\09`\0\x81\x81a\x13\xD0\x01R\x81\x81a\x13\xF9\x01Ra\x15\xE7\x01Ra]\x9F`\0\xF3\xFE`\x80`@R`\x046\x10a\x01\x80W`\x005`\xE0\x1C\x80cvg\x18\x08\x11a\0\xD6W\x80c\xAA\x92'2\x11a\0\x7FW\x80c\xCAo\xE8U\x11a\0YW\x80c\xCAo\xE8U\x14a\x05\xC8W\x80c\xF0h T\x14a\x05\xDEW\x80c\xF2\xFD\xE3\x8B\x14a\x06\x10W`\0\x80\xFD[\x80c\xAA\x92'2\x14a\x04\xCDW\x80c\xAD<\xB1\xCC\x14a\x050W\x80c\xBD2Q\x9A\x14a\x05\x86W`\0\x80\xFD[\x80c\x82\xD0\x7F\xF3\x11a\0\xB0W\x80c\x82\xD0\x7F\xF3\x14a\x04[W\x80c\x8D\xA5\xCB[\x14a\x04pW\x80c\xA2D\xD5\x96\x14a\x04\xADW`\0\x80\xFD[\x80cvg\x18\x08\x14a\x03AW\x80cv\xB6\xB7\xCB\x14a\x03\x8BW\x80c\x7F\x17\xBA\xAD\x14a\x03\xA1W`\0\x80\xFD[\x80cHG\xAE]\x11a\x018W\x80cb\x82w3\x11a\x01\x12W\x80cb\x82w3\x14a\x03\x01W\x80ci\xCCj\x04\x14a\x03\x17W\x80cqP\x18\xA6\x14a\x03,W`\0\x80\xFD[\x80cHG\xAE]\x14a\x02UW\x80cO\x1E\xF2\x86\x14a\x02\xD9W\x80cR\xD1\x90-\x14a\x02\xECW`\0\x80\xFD[\x80c1=\xF7\xB1\x11a\x01iW\x80c1=\xF7\xB1\x14a\x01\xD9W\x80c8+!Z\x14a\x02\x11W\x80c@\x999\xB7\x14a\x025W`\0\x80\xFD[\x80c\x01?\xA5\xFC\x14a\x01\x85W\x80c\r\x8En,\x14a\x01\xA7W[`\0\x80\xFD[4\x80\x15a\x01\x91W`\0\x80\xFD[Pa\x01\xA5a\x01\xA06`\x04aT\x8BV[a\x060V[\0[4\x80\x15a\x01\xB3W`\0\x80\xFD[P`@\x80Q`\x01\x81R`\0` \x82\x01\x81\x90R\x91\x81\x01\x91\x90\x91R``\x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\xE5W`\0\x80\xFD[P`\x06Ta\x01\xF9\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x01\xD0V[4\x80\x15a\x02\x1DW`\0\x80\xFD[Pa\x02'`\x03T\x81V[`@Q\x90\x81R` \x01a\x01\xD0V[4\x80\x15a\x02AW`\0\x80\xFD[Pa\x01\xA5a\x02P6`\x04aV\x1CV[a\x07HV[4\x80\x15a\x02aW`\0\x80\xFD[Pa\x02ja\n\x8AV[`@Qa\x01\xD0\x91\x90`\0a\x01\0\x82\x01\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x84Q\x16\x83R\x80` \x85\x01Q\x16` \x84\x01RP`@\x83\x01Q`@\x83\x01R``\x83\x01Q``\x83\x01R`\x80\x83\x01Q`\x80\x83\x01R`\xA0\x83\x01Q`\xA0\x83\x01R`\xC0\x83\x01Q`\xC0\x83\x01R`\xE0\x83\x01Q`\xE0\x83\x01R\x92\x91PPV[a\x01\xA5a\x02\xE76`\x04aW\xF4V[a\x0BwV[4\x80\x15a\x02\xF8W`\0\x80\xFD[Pa\x02'a\x0B\x96V[4\x80\x15a\x03\rW`\0\x80\xFD[Pa\x02'`\x02T\x81V[4\x80\x15a\x03#W`\0\x80\xFD[Pa\x01\xA5a\x0B\xC5V[4\x80\x15a\x038W`\0\x80\xFD[Pa\x01\xA5a\x0CwV[4\x80\x15a\x03MW`\0\x80\xFD[P`\0Ta\x03r\x90l\x01\0\0\0\0\0\0\0\0\0\0\0\0\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81V[`@Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x91\x16\x81R` \x01a\x01\xD0V[4\x80\x15a\x03\x97W`\0\x80\xFD[Pa\x02'`\x01T\x81V[4\x80\x15a\x03\xADW`\0\x80\xFD[Pa\x04\x14a\x03\xBC6`\x04aX\xAEV[`\x05` \x81\x90R`\0\x91\x82R`@\x90\x91 \x80T`\x01\x82\x01T`\x02\x83\x01T`\x03\x84\x01T`\x04\x85\x01T\x95\x85\x01T`\x06\x90\x95\x01Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x86\x16\x97h\x01\0\0\0\0\0\0\0\0\x90\x96\x04\x16\x95\x93\x94\x92\x93\x91\x92\x91\x90\x88V[`@\x80Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x99\x8A\x16\x81R\x98\x90\x97\x16` \x89\x01R\x95\x87\x01\x94\x90\x94R``\x86\x01\x92\x90\x92R`\x80\x85\x01R`\xA0\x84\x01R`\xC0\x83\x01R`\xE0\x82\x01Ra\x01\0\x01a\x01\xD0V[4\x80\x15a\x04gW`\0\x80\xFD[Pa\x02ja\x0C\x89V[4\x80\x15a\x04|W`\0\x80\xFD[P\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16a\x01\xF9V[4\x80\x15a\x04\xB9W`\0\x80\xFD[Pa\x01\xA5a\x04\xC86`\x04aX\xC9V[a\rsV[4\x80\x15a\x04\xD9W`\0\x80\xFD[Pa\x02'a\x04\xE86`\x04aY\x10V[`\x80\x80\x82\x01Q`\xA0\x83\x01Q`\xC0\x84\x01Q`@\x80Q` \x81\x01\x94\x90\x94R\x83\x01\x91\x90\x91R``\x82\x01R`\0\x91\x01`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x91\x90PV[4\x80\x15a\x05 v\xCC75\xA9 \xA3\xCAP]8+\xBC\x90V[a\x0B\xCDa\x0FeV[`\x06Tt\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16\x15a\x0CCW`\x06\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x90U`@Q\x7F\x9A_W\xDE\x85m\xD6h\xC5M\xD9^\\U\xDF\x93C!q\xCB\xCAI\xA8wmV \xEAY\xC0$P\x90`\0\x90\xA1V[`@Q\x7F\xA8c\xAE\xC9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[a\x0C\x7Fa\x0FeV[a\x0Cu`\0a\x16>V[a\x0C\xE5`@Q\x80a\x01\0\x01`@R\x80`\0g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\0g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[P`\0\x80Tc\xFF\xFF\xFF\xFFh\x01\0\0\0\0\0\0\0\0\x91\x82\x90\x04\x16\x82R`\x05` \x81\x81R`@\x93\x84\x90 \x84Qa\x01\0\x81\x01\x86R\x81Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x16\x83R\x95\x90\x04\x90\x94\x16\x91\x84\x01\x91\x90\x91R`\x01\x81\x01T\x93\x83\x01\x93\x90\x93R`\x02\x83\x01T``\x83\x01R`\x03\x83\x01T`\x80\x83\x01R`\x04\x83\x01T`\xA0\x83\x01R\x82\x01T`\xC0\x82\x01R`\x06\x90\x91\x01T`\xE0\x82\x01R\x90V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x81\x04`\xFF\x16\x15\x90g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\0\x81\x15\x80\x15a\r\xBEWP\x82[\x90P`\0\x82g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\x01\x14\x80\x15a\r\xDBWP0;\x15[\x90P\x81\x15\x80\x15a\r\xE9WP\x80\x15[\x15a\x0E W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\x16`\x01\x17\x85U\x83\x15a\x0EkW\x84Th\xFF\0\0\0\0\0\0\0\0\x19\x16h\x01\0\0\0\0\0\0\0\0\x17\x85U[a\x0Et\x86a\x16\xC7V[a\x0E|a\x16\xD8V[`\0\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\xFF\xFF\xFF\xFF\x16h\x01\0\0\0\0\0\0\0\0\x17\x90Ua\x0E\xB9\x88\x88a\x16\xE0V[\x83\x15a\x0F\x04W\x84Th\xFF\0\0\0\0\0\0\0\0\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPPPV[a\x0F\x16a\x0FeV[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x0FYW`@Q\x7F\x1EO\xBD\xF7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\0`\x04\x82\x01R`$\x01a\tBV[a\x0Fb\x81a\x16>V[PV[3a\x0F\x97\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\x0CuW`@Q\x7F\x11\x8C\xDA\xA7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R3`\x04\x82\x01R`$\x01a\tBV[\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x81\x10\x80a\x0B\x92W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1B`$\x82\x01R\x7FBn254: invalid scalar field\0\0\0\0\0`D\x82\x01R`d\x01a\tBV[`\0\x80Th\x01\0\0\0\0\0\0\0\0\x80\x82\x04c\xFF\xFF\xFF\xFF\x16\x80\x84R`\x05` \x81\x81R`@\x80\x87 \x81Qa\x01\0\x81\x01\x83R\x81Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x16\x83R\x97\x90\x04\x87\x16\x81\x85\x01R`\x01\x80\x83\x01T\x82\x85\x01R`\x02\x80\x84\x01T``\x80\x85\x01\x91\x90\x91R`\x03\x80\x86\x01T`\x80\x80\x87\x01\x82\x90R`\x04\x80\x89\x01T`\xA0\x89\x01\x81\x90R\x89\x8D\x01T`\xC0\x8A\x01\x81\x90R`\x06\x90\x9A\x01\x80T`\xE0\x90\x9A\x01\x99\x90\x99R\x8AQ\x80\x8D\x01\x94\x90\x94R\x83\x8B\x01R\x82\x85\x01\x98\x90\x98R\x88Q\x80\x83\x03\x90\x94\x01\x84R\x01\x90\x96R\x80Q\x90\x87\x01 \x85T\x83U\x94\x85\x90U\x83T\x90U\x95\x89R\x93\x90\x92R\x91T\x90U\x93\x90\x92\x90\x91`\x0C\x91a\x11C\x91\x85\x91l\x01\0\0\0\0\0\0\0\0\0\0\0\0\x90\x04\x16aY\xBEV[\x82Ta\x01\0\x92\x90\x92\ng\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x81\x02\x19\x90\x93\x16\x91\x83\x16\x02\x17\x90\x91U`\0T`@Ql\x01\0\0\0\0\0\0\0\0\0\0\0\0\x90\x91\x04\x90\x91\x16\x81R\x7F\xDB5X%\x9E\x03\x9D~P\xE8\x16\xB9\xDC\xCE0\xFB\x11M\x8A\x9C\x86\xEC\xA5\xAB\x14\xB6\x01\x94\xD6\x94]?\x91P` \x01a\x07=V[`\0a\x11\xB5a\x19\xD0V[`@\x80Q`\x08\x80\x82Ra\x01 \x82\x01\x90\x92R\x91\x92P`\0\x91\x90` \x82\x01a\x01\0\x806\x837\x01\x90PP\x90P`\x02T\x81`\0\x81Q\x81\x10a\x11\xF4Wa\x11\xF4aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x83`\0\x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81`\x01\x81Q\x81\x10a\x12\"Wa\x12\"aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x83` \x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81`\x02\x81Q\x81\x10a\x12PWa\x12PaY\xDFV[` \x02` \x01\x01\x81\x81RPP\x83`@\x01Q\x81`\x03\x81Q\x81\x10a\x12tWa\x12taY\xDFV[` \x02` \x01\x01\x81\x81RPP\x83``\x01Q\x81`\x04\x81Q\x81\x10a\x12\x98Wa\x12\x98aY\xDFV[` \x90\x81\x02\x91\x90\x91\x01\x81\x01\x91\x90\x91R`\0\x80Th\x01\0\0\0\0\0\0\0\0\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05\x91\x82\x90R`@\x90 `\x03\x01T\x82Q\x90\x91\x83\x91\x81\x10a\x12\xE1Wa\x12\xE1aY\xDFV[` \x90\x81\x02\x91\x90\x91\x01\x81\x01\x91\x90\x91R`\0\x80Th\x01\0\0\0\0\0\0\0\0\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05\x90\x91R`@\x90 `\x04\x01T\x81Q\x82\x90`\x06\x90\x81\x10a\x13*Wa\x13*aY\xDFV[` \x90\x81\x02\x91\x90\x91\x01\x81\x01\x91\x90\x91R`\0\x80Th\x01\0\0\0\0\0\0\0\0\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05\x91\x82\x90R`@\x90 \x01T\x81Q\x82\x90`\x07\x90\x81\x10a\x13rWa\x13raY\xDFV[` \x02` \x01\x01\x81\x81RPPa\x13\x89\x82\x82\x85a\x1F\xB2V[a\x13\xBFW`@Q\x7F\t\xBD\xE39\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[PPPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14\x80a\x14^WP\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\x01`\x01`\xA0\x1B\x03\x16a\x14R\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBCT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\x0CuW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x14\x9Da\x0FeV[`@Q`\x01`\x01`\xA0\x1B\x03\x82\x16\x81R\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x90` \x01a\x07=V[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x150WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x15-\x91\x81\x01\x90aY\xF5V[`\x01[a\x15qW`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\tBV[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x81\x14a\x15\xCDW`@Q\x7F\xAA\x1DI\xA4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x81\x01\x82\x90R`$\x01a\tBV[a\x15\xD7\x83\x83a \x9DV[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\x0CuW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81\x16`\x01`\x01`\xA0\x1B\x03\x84\x81\x16\x91\x82\x17\x84U`@Q\x92\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90`\0\x90\xA3PPPV[a\x16\xCFa \xF3V[a\x0Fb\x81a!ZV[a\x0Cua \xF3V[\x81Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x15\x15\x80a\x17\x06WP` \x82\x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x15\x15[\x80a\x17\x13WP`\x80\x82\x01Q\x15[\x80a\x17 WP`\xA0\x82\x01Q\x15[\x80a\x17-WP`\xC0\x82\x01Q\x15[\x80a\x17:WP`\xE0\x82\x01Q\x15[\x80a\x17IWPc\xFF\xFF\xFF\xFF\x81\x16\x15[\x15a\x17\x80W`@Q\x7F\xA1\xBA\x07\xEE\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81`\x05`\0\x80`\x04\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP\x81`\x05`\0\x80`\x08\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP`\0\x80`\x0Ca\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x80`\0\x80a\x01\0\n\x81T\x81c\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83c\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\0a\x19\xB3\x83`\x80\x80\x82\x01Q`\xA0\x83\x01Q`\xC0\x84\x01Q`@\x80Q` \x81\x01\x94\x90\x94R\x83\x01\x91\x90\x91R``\x82\x01R`\0\x91\x01`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x91\x90PV[`\x01\x81\x90U`\xE0\x90\x93\x01Q`\x02\x81\x90U`\x03\x93\x90\x93UPP`\x04UV[a\x19\xD8aQgV[b\x10\0\0\x81R`\x08` \x82\x01R\x7F \xC9@13\xDF\xDE\x9A\x9D8-\xF7o\xB0R5qd\x87%\xAB\xC0\xA7\xC1(0\xBBi\x0E\xC8;3`@\x82\x01QR\x7F\x03\xA0\xA9\xAC\xC3\xE3\x81Z~\xD6\xCB\x13y\xF7\xD1W\xE641dr\x93v9*i:\xCB\xD3\xEC(<` `@\x83\x01Q\x01R\x7F(f\xC1\x8A\xD1\xDF\x10\xEF\x13T,\xCEbP\xCE\x02\xCB*kr\xAE\0\xA9\x85.'\x11\x87\xE9\xE4\xE0\xDB``\x82\x01QR\x7F!\xBE#*B$jVc\xEB\xF4\x83G\x0C\xCAfo\xFE\x9DO\x0Ec\xB9)\xC5\x96\xA7e\x87\x14\xE9p` ``\x83\x01Q\x01R\x7F\x07\xD7xs\xB9\x86\0t\x11\x8Eu\x80\x8CyF\x8B\x83\xC8\xEDd\xBA\x14\xDB\\\xB5\xAF\xA8\xE54\xDE{\x99`\x80\x82\x01QR\x7F\x0B\xE0\xF4H\x83\x90\x80\x13-G\xDE\x17\xDE\0\x99\xB4\xCDt\xAE\x1Ekq\xCD\xDA\x06\xCD\xEB\xB8h\xA5\x0Cm` `\x80\x83\x01Q\x01R\x7F\x13\xBDE\xA0#I\x1E\xAD\xEAD\xCC?$\xCF\xBD\x17\x96\xEA\xDE\x9C\x0E9\xEE\x81\xD9\xF6>\xA0\xA5\x80f%`\xA0\x82\x01QR\x7F\x18\xF9\\\xDD\xA4,\xE1\x1D\x9D\x10\xA3\xB35\xAC\xC2\x14\xE3\x80|W\x8CSY@]\x81\x0C \x8D\xF6\0\x93` `\xA0\x83\x01Q\x01R\x7F\tp\xD9xv4a\xF0\x9E\x9E\xC64T\x074\x978nM(/\xED\xC2\xAC[\x96|\xB9\xFD?\xA8\xA9`\xC0\x82\x01QR\x7F(\xC2!\x7F{\xAC\xF6\xF8\xB2\xB8\xEEJ\x90\xFC\xF8\xB5\xBC\xA0B\x05\xEA\x84\xE8\xE1\xEBT\xB8]\xD4\x1B\xDE(` `\xC0\x83\x01Q\x01R\x7F\x02\xFE=\x02\x98\x8D\xB7\x188\0R\x97\n\xBAF\xA3)m\xF5\xF2\x9Bsk\xA1\xF2\xC4\xCC\xFF\xC8\xB5\x96\x93`\xE0\x82\x01QR\x7F ,>9\x0C\xEE|\\\x85%\xDA#)\xA1\x9FI6\xF6\xF7\x1C\xA9}\xDElo\xA3+8-Z\xCC\x03` `\xE0\x83\x01Q\x01R\x7F#\xAC\x10\xAEl\xA5\xCA\xCE\xE8tK\xB99\xAA\xA859\tT\xB9\x1A\xE6h\xA2\xC8\xD0\xED\xDAU\x8A\x89\xE7a\x01\0\x82\x01QR\x7F\x1C\x8C+\x85l\xDA\xDE%k\xA3#\x7F9\xAF\xD5\xE1p\xA9S \x12\xF7\xAE\xCA\xE4\x9DE\x9B)\xF6\xF6\xAD` a\x01\0\x83\x01Q\x01R\x7F\x16\xEC\x03\xD2`\xBDz\xC1\xC5\x0F\xFAcV]Rt\xB4X,\xEE\xA5/\xF4\x0B\x81\xCD\xFE\x8FDO\x01\xE4a\x01 \x82\x01QR\x7F)9!Rr0\x97\xE0q\x13\xC3\xD7xm$^\xC4\x0C0\x92\x80\x15\xCDP\xB5f\x8AON\xA1p1` a\x01 \x83\x01Q\x01R\x7F,\xDB\xFB:@S\xC8H\x9B\x0C\x94\xE7C8\xAC\x19\x11\x8D\xF7\xA0k\xC5k\x1E\xB4\xD0\xE0\xDCN\xAErHa\x01@\x82\x01QR\x7F\x07\xFE\xA1'\xDA\xE9C\xB8\xDC\x14\x8F\x14\x08\xD4\x0C\xFFF\\\x9CG!\x946i\xB1\xE4\xFDZ9\xDBp6` a\x01@\x83\x01Q\x01R\x7F\x03\x14U\xA7\x9A.\x0C\xE7\x8Al\xB55&\xEC\x04\xAC\x19qj\x86\xB0\x8A\x93\xDFH\xD1x\xF8\xB7~V\x19a\x01`\x82\x01QR\x7F\x11\x86#\xE6\xBC\x13n\xE6\xD3\xF9\x90|\xD4\xAD\x04\xA9A\x8E\xA0;\xA9\x9A\xD7S\"|\xDF\xEEY\x8E\x84\x15` a\x01`\x83\x01Q\x01R\x7F\x08a\xD1\x99wa\xA8R\"j\xAC{\xA9q{\xF6\xAEVE\x10\x99\xBEwL\xDF\x02\xEF5*X\xCB\xC8a\x01\x80\x82\x01QR\x7F\x08\x05\xE3\x92\xBC\xBC\x12\xE4\nr'xc-s\xFE\x98\x1EK\xC6\xFAm\x11x\xB7\n\xF7\xBE\x1C\xB9\xA3\xA3` a\x01\x80\x83\x01Q\x01R\x7F\x10\x1D\x1E9x\xCB\x9F\x1E0=A1D\xEB\xE6v\x82\xC9\xEB\x0C\xFE\x11$)Y\xAA`)\xD7\x8C\xDB\xBCa\x01\xA0\x82\x01QR\x7F\x08\x9E\xB9\xC7'\xE6\xCB\x07\x08+\xC3\xE6\xF4\x0C\xF0OC\x9F\xE4\x80\0`+XGt\xDA\xD7\xEF\xC6`|` a\x01\xA0\x83\x01Q\x01R\x7F-H\x9F$\x93&:\xA8s\xBC\xD9O!\xEF\xB4[\xF2W\xA6\x1D\x81\xC0\xC9\\2\x97\x91e\x06e;@a\x01\xC0\x82\x01QR\x7F\x18\xE4]bz\xAD\xD4\xDF'\x94\xEC\xD9\x90\x9F\xAC\x1Au?\x0Co\xA8\xA9\xC6eJzX\xB0\x91/\xFF\xD5` a\x01\xC0\x83\x01Q\x01R\x7F\x0EC\xE3\xA4\xB1<\xB48\xE2\xAD\x92F\x14&\x1A\xD0$\x02\x14\xFA\x1C\x83\xFC\xDAj\x0B\xF7y\xEB9\xFF\xC5a\x01\xE0\x82\x01QR\x7F\x0E\xAB\xA9\xF4)\xC5\xF6\xFC1\x03\xD4\xCC@V\xC5\0\xFFBB]\x8Ede\xC5\xB8\xE1E!\x9F\x9C\\\xD3` a\x01\xE0\x83\x01Q\x01R\x7F)\xAE5\x1D\t\xDC\xF4\x1C\n\x80\xAB\x059785\x8B\xAA\xB3~o\xBCFK;\xB12X\x99J\x1F\xA4a\x02\0\x82\x01QR\x7F+{\xC7F\x08\xD7\xEC}\xAD\xD0Y}j@\x10\xD8\xBF\xC2\xB3\x19\0(\x19\x01\xCE\xDCB\xBD\xBB\x0F\xB8\xFC` a\x02\0\x83\x01Q\x01R\x7F\x06h\x02\xC7\xCE\xB9\xE9\x13\xD4\xF6T3\xA2\x06a\xE0\x97\xAC\xAC\x1A\xFF\xEC\xBBSJT\xF7j)x\"&a\x02 \x82\x01QR\x7F'\xEC\x80\xE8\x11\xE66\xF34\x82g\x92<\x8Ed\x1B\xD9\x8A~7\xC5!fp\xCB\xFF\x14\xAE2?\x9E\x0E` a\x02 \x83\x01Q\x01R\x7F\x12`M\x1F\x87\xC5\x83\xF6\xC9q\x0Cs\xEA\xF5\x90\xAF\x9D\x07\xAAt=\x13\x81\xD0\xE9\xDF\xF0\xEA\xB2aB9a\x02@\x82\x01QR\x7F\x15\x88W\x9El3x\xEA2\xCBd\x12\x05\xEFv*c\xCD5:\x0B\xD6p9E(\xAD \x81\xEE\x8D\xD4` a\x02@\x83\x01Q\x01R\x7F$}e&\x1D:J\xB0B\xBA\x93s1\xF6\xD0\xC0\xC5\xEB\x9E\xA7\x87S\xA9 \x84\xDB\x1Ai9\xE1\x9E\x82a\x02`\x82\x01QR\x7F,\xE6\xCCfJ2\x14{\xFEj\x0C\x94\xA9[\xF0Ify@\\\xCA\xE0\x16H\xCDN\xC0!\x14Q \xD5` a\x02`\x83\x01Q\x01R\x90V[`\0a\x1F\xBD\x82a!bV[a\x1F\xE0\x83`\0\x81Q\x81\x10a\x1F\xD3Wa\x1F\xD3aY\xDFV[` \x02` \x01\x01Qa\x0F\xD9V[a\x1F\xF6\x83`\x01\x81Q\x81\x10a\x1F\xD3Wa\x1F\xD3aY\xDFV[a \x0C\x83`\x02\x81Q\x81\x10a\x1F\xD3Wa\x1F\xD3aY\xDFV[a \"\x83`\x03\x81Q\x81\x10a\x1F\xD3Wa\x1F\xD3aY\xDFV[a 8\x83`\x04\x81Q\x81\x10a\x1F\xD3Wa\x1F\xD3aY\xDFV[a N\x83`\x05\x81Q\x81\x10a\x1F\xD3Wa\x1F\xD3aY\xDFV[a d\x83`\x06\x81Q\x81\x10a\x1F\xD3Wa\x1F\xD3aY\xDFV[a z\x83`\x07\x81Q\x81\x10a\x1F\xD3Wa\x1F\xD3aY\xDFV[`\0a \x87\x85\x85\x85a\"\x9AV[\x90Pa \x92\x81a$\x1BV[\x91PP[\x93\x92PPPV[a \xA6\x82a(\xE3V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a \xEBWa\x15\xD7\x82\x82a)\x8BV[a\x0B\x92a*\x03V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0Th\x01\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16a\x0CuW`@Q\x7F\xD7\xE6\xBC\xF8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x0F\x16a \xF3V[\x80Qa!m\x90a*;V[a!z\x81` \x01Qa*;V[a!\x87\x81`@\x01Qa*;V[a!\x94\x81``\x01Qa*;V[a!\xA1\x81`\x80\x01Qa*;V[a!\xAE\x81`\xA0\x01Qa*;V[a!\xBB\x81`\xC0\x01Qa*;V[a!\xC8\x81`\xE0\x01Qa*;V[a!\xD6\x81a\x01\0\x01Qa*;V[a!\xE4\x81a\x01 \x01Qa*;V[a!\xF2\x81a\x01@\x01Qa*;V[a\"\0\x81a\x01`\x01Qa*;V[a\"\x0E\x81a\x01\x80\x01Qa*;V[a\"\x1C\x81a\x01\xA0\x01Qa\x0F\xD9V[a\"*\x81a\x01\xC0\x01Qa\x0F\xD9V[a\"8\x81a\x01\xE0\x01Qa\x0F\xD9V[a\"F\x81a\x02\0\x01Qa\x0F\xD9V[a\"T\x81a\x02 \x01Qa\x0F\xD9V[a\"b\x81a\x02@\x01Qa\x0F\xD9V[a\"p\x81a\x02`\x01Qa\x0F\xD9V[a\"~\x81a\x02\x80\x01Qa\x0F\xD9V[a\"\x8C\x81a\x02\xA0\x01Qa\x0F\xD9V[a\x0Fb\x81a\x02\xC0\x01Qa\x0F\xD9V[a\"\xA2aS\xE5V[\x83` \x01Q\x83Q\x14a\"\xE0W`@Q\x7FA\xF5;\x12\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\"\xED\x85\x85\x85a*\xE5V[\x90P`\0a\"\xFE\x86`\0\x01Qa.\x16V[\x90P`\0a#\x11\x82\x84`\xA0\x01Q\x88a1\xFAV[`@\x80Q`\x1E\x80\x82Ra\x03\xE0\x82\x01\x90\x92R\x91\x92P`\0\x91\x90` \x82\x01a\x03\xC0\x806\x837PP`@\x80Q`\x1E\x80\x82Ra\x03\xE0\x82\x01\x90\x92R\x92\x93P`\0\x92\x91P` \x82\x01[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81R` \x01\x90`\x01\x90\x03\x90\x81a#TW\x90PP\x90P`\0a#\x8D\x8A\x85\x8A\x89\x87\x87a2ZV[`\xA0\x87\x01Q``\x87\x01Q\x91\x92P\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01`\0\x81\x83\x85\t`@\x80Qa\x01\0\x81\x01\x82R`\xE0\x9C\x8D\x01Q\x81R` \x81\x01\x96\x90\x96R\x85\x01RPPP``\x81\x01\x91\x90\x91R`\x80\x81\x01\x92\x90\x92R`\xA0\x82\x01Ra\x01`\x86\x01Q`\xC0\x82\x01Ra\x01\x80\x90\x95\x01Q\x92\x85\x01\x92\x90\x92RP\x91\x94\x93PPPPV[`@\x80Q\x80\x82\x01\x82R`\0\x80\x82R` \x80\x83\x01\x82\x90R\x83Q\x80\x85\x01\x85R\x82\x81R\x90\x81\x01\x82\x90R\x83Q`\x02\x80\x82R``\x82\x01\x90\x95R\x91\x93\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x93\x92\x85\x91\x81` \x01` \x82\x02\x806\x837PP`@\x80Q`\x02\x80\x82R``\x82\x01\x90\x92R\x92\x93P`\0\x92\x91P` \x82\x01[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81R` \x01\x90`\x01\x90\x03\x90\x81a$\xA1W\x90PP\x90P`\0`\x01\x90P\x80\x83`\0\x81Q\x81\x10a$\xE4Wa$\xE4aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x87`\xC0\x01Q\x82`\0\x81Q\x81\x10a%\x08Wa%\x08aY\xDFV[` \x02` \x01\x01\x81\x90RP\x87`\0\x01Q\x83`\x01\x81Q\x81\x10a%+Wa%+aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x87`\xE0\x01Q\x82`\x01\x81Q\x81\x10a%OWa%OaY\xDFV[` \x02` \x01\x01\x81\x90RPa%d\x82\x84a2\x8FV[`\x80\x89\x01QQ\x90\x95P``\x93P\x83\x92P\x90P`\0a%\x83\x82`\x02aZ\x0EV[a%\x8E\x90`\x01aZ\x0EV[\x90P\x80g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a%\xA9Wa%\xA9aT\xA6V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a%\xD2W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x93P\x80g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a%\xEEWa%\xEEaT\xA6V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a&3W\x81` \x01[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81R` \x01\x90`\x01\x90\x03\x90\x81a&\x0CW\x90P[P\x92PPP`\0\x80`\0[\x89`\x80\x01QQ\x81\x10\x15a&\xD7W\x89`\x80\x01Q\x81\x81Q\x81\x10a&aWa&aaY\xDFV[` \x02` \x01\x01Q\x85\x83\x81Q\x81\x10a&{Wa&{aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x89`\xA0\x01Q\x81\x81Q\x81\x10a&\x9DWa&\x9DaY\xDFV[` \x02` \x01\x01Q\x84\x83\x81Q\x81\x10a&\xB7Wa&\xB7aY\xDFV[` \x90\x81\x02\x91\x90\x91\x01\x01Ra&\xCD`\x01\x83aZ\x0EV[\x91P`\x01\x01a&>V[P\x88` \x01Q\x84\x82\x81Q\x81\x10a&\xEFWa&\xEFaY\xDFV[` \x02` \x01\x01\x81\x81RPP\x88`\xC0\x01Q\x83\x82\x81Q\x81\x10a'\x12Wa'\x12aY\xDFV[` \x90\x81\x02\x91\x90\x91\x01\x01Ra'(`\x01\x82aZ\x0EV[\x89Q`@\x8B\x01Q\x91\x92P\x90`\0\x89\x82\x84\t\x90P\x80\x87\x85\x81Q\x81\x10a'NWa'NaY\xDFV[` \x02` \x01\x01\x81\x81RPPPPP\x88`\xE0\x01Q\x83\x82\x81Q\x81\x10a'tWa'taY\xDFV[` \x90\x81\x02\x91\x90\x91\x01\x01Ra'\x8A`\x01\x82aZ\x0EV[``\x8A\x01Q\x90\x91P\x87\x81\x84\x08\x92PPa'\xA2\x82a3\x89V[\x84\x82\x81Q\x81\x10a'\xB4Wa'\xB4aY\xDFV[` \x02` \x01\x01\x81\x81RPPa'\xEC`@\x80Q\x80\x82\x01\x82R`\0\x80\x82R` \x91\x82\x01R\x81Q\x80\x83\x01\x90\x92R`\x01\x82R`\x02\x90\x82\x01R\x90V[\x83\x82\x81Q\x81\x10a'\xFEWa'\xFEaY\xDFV[` \x02` \x01\x01\x81\x90RPa(\x1Ba(\x16\x84\x86a2\x8FV[a3\xDFV[\x94PPPPP`\0`@Q\x80`\x80\x01`@R\x80\x7F\x01\x18\xC4\xD5\xB87\xBC\xC2\xBC\x89\xB5\xB3\x98\xB5\x97N\x9FYD\x07;2\x07\x8B~#\x1F\xEC\x93\x88\x83\xB0\x81R` \x01\x7F&\x0E\x01\xB2Q\xF6\xF1\xC7\xE7\xFFNX\x07\x91\xDE\xE8\xEAQ\xD8z5\x8E\x03\x8BN\xFE0\xFA\xC0\x93\x83\xC1\x81R` \x01\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U\x81R` \x01\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4\x81RP\x90Pa(\xD9\x83\x82\x84a(\xD4a4~V[a5OV[\x96\x95PPPPPPV[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a)2W`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\tBV[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa)\xA8\x91\x90aZ!V[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a)\xE3W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a)\xE8V[``\x91P[P\x91P\x91Pa)\xF8\x85\x83\x83a63V[\x92PPP[\x92\x91PPV[4\x15a\x0CuW`@Q\x7F\xB3\x98\x97\x9F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80Q` \x82\x01Q`\0\x91\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x91\x15\x90\x15\x16\x15a*uWPPPV[\x82Q` \x84\x01Q\x82`\x03\x84\x85\x85\x86\t\x85\t\x08\x83\x82\x83\t\x14\x83\x82\x10\x84\x84\x10\x16\x16\x93PPP\x81a\x15\xD7W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x17`$\x82\x01R\x7FBn254: invalid G1 point\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\tBV[a+-`@Q\x80a\x01\0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`@\x80Q\x80\x82\x01\x90\x91R``\x81R`\0` \x82\x01R\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01a+n\x82\x87\x87a6\xA8V[\x81Q\x84Qa+{\x90a:\x89V[a+\x88\x86` \x01Qa:\x89V[a+\x95\x87`@\x01Qa:\x89V[a+\xA2\x88``\x01Qa:\x89V[a+\xAF\x89`\x80\x01Qa:\x89V[`@Q` \x01a+\xC4\x96\x95\x94\x93\x92\x91\x90aZ=V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra+\xDF\x82a;LV[Pa+\xE9\x82a;LV[``\x84\x01Ra+\xF7\x82a;LV[`\x80\x84\x01R\x81Q`\xA0\x85\x01Qa,\x0C\x90a:\x89V[`@Q` \x01a,\x1D\x92\x91\x90aZ\xBCV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra,8\x82a;LV[\x83R\x81Q`\xC0\x85\x01Qa,J\x90a:\x89V[a,W\x86`\xE0\x01Qa:\x89V[a,e\x87a\x01\0\x01Qa:\x89V[a,s\x88a\x01 \x01Qa:\x89V[a,\x81\x89a\x01@\x01Qa:\x89V[`@Q` \x01a,\x96\x96\x95\x94\x93\x92\x91\x90aZ=V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra,\xB1\x82a;LV[`\xA0\x84\x01R\x81Qa\x01\xA0\x85\x01Qa,\xC7\x90a;\xC0V[a,\xD5\x86a\x01\xC0\x01Qa;\xC0V[a,\xE3\x87a\x01\xE0\x01Qa;\xC0V[a,\xF1\x88a\x02\0\x01Qa;\xC0V[a,\xFF\x89a\x02 \x01Qa;\xC0V[`@Q` \x01a-\x14\x96\x95\x94\x93\x92\x91\x90aZ\xEBV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x83Ra\x02@\x85\x01Qa-6\x90a;\xC0V[a-D\x86a\x02`\x01Qa;\xC0V[a-R\x87a\x02\x80\x01Qa;\xC0V[a-`\x88a\x02\xA0\x01Qa;\xC0V[a-n\x89a\x02\xC0\x01Qa;\xC0V[`@Q` \x01a-\x83\x96\x95\x94\x93\x92\x91\x90aZ\xEBV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra-\x9E\x82a;LV[`\xC0\x84\x01R\x81Qa\x01`\x85\x01Qa-\xB4\x90a:\x89V[a-\xC2\x86a\x01\x80\x01Qa:\x89V[`@Q` \x01a-\xD4\x93\x92\x91\x90a['V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra-\xEF\x82a;LV[`\xE0\x84\x01R\x82Q\x81\x81\x80\t\x82\x82\x82\t` \x86\x01\x91\x90\x91R`@\x85\x01RP\x91\x95\x94PPPPPV[a.H`@Q\x80`\xA0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[\x81b\x01\0\0\x03a.\xDCWP`@\x80Q`\xA0\x81\x01\x82R`\x10\x81R` \x81\x01\x92\x90\x92R\x7F0d\x1E\x0E\x92\xBE\xBE\xF8\x18&\x8Df;\xCA\xD6\xDB\xCF\xD6\xC0\x14\x91p\xF6\xD7\xD3P\xB1\xB1\xFAl\x10\x01\x90\x82\x01R~\xEE\xB2\xCBY\x81\xEDEd\x9A\xBE\xBD\xE0\x81\xDC\xFF\x16\xC8`\x1D\xE44~}\xD1b\x8B\xA2\xDA\xACC\xB7``\x82\x01R\x7F\x0B]V\xB7\x7F\xE7\x04\xE8\xE9#8\xC0\x08/7\xE0\x91\x12d\x14\xC80\xE4\xC6\x92-Z\xC8\x02\xD8B\xD4`\x80\x82\x01R\x90V[\x81b\x02\0\0\x03a/qWP`@\x80Q`\xA0\x81\x01\x82R`\x11\x81R` \x81\x01\x92\x90\x92R\x7F0d6@\xB9\xF8/\x90\xE8;i\x8E^\xA6\x17\x9C|\x05T.\x85\x953\xB4\x8B\x99S\xA2\xF56\x08\x01\x90\x82\x01R\x7F\x1B\xF8-\xEB\xA7\xD7I\x02\xC3p\x8C\xC6\xE7\x0Ea\xF3\x05\x12\xEC\xA9VU!\x0E'nXX\xCE\x8FX\xE5``\x82\x01R\x7F$L\xF0\x10\xC4<\xA8r7\xD8\xB0\x0B\xF9\xDDP\xC4\xC0\x1C\x7F\x08k\xD4\xE8\xC9 \xE7RQ\xD9o\r\"`\x80\x82\x01R\x90V[\x81b\x04\0\0\x03a0\x06WP`@\x80Q`\xA0\x81\x01\x82R`\x12\x81R` \x81\x01\x92\x90\x92R\x7F0dBY\xCD\x94\xE7\xDDPE\xD7\xA2p\x13\xB7\xFC\xD2\x1C\x9E;\x7F\xA7R\"\xE7\xBD\xA4\x9Br\x9B\x04\x01\x90\x82\x01R\x7F\x19\xDD\xBC\xAF:\x8DF\xC1\\\x01v\xFB\xB5\xB9^M\xC5p\x88\xFF\x13\xF4\xD1\xBD\x84\xC6\xBF\xA5}\xCD\xC0\xE0``\x82\x01R\x7F\x03hS\xF0\x83x\x0E\x87\xF8\xD7\xC7\x1D\x11\x11\x19\xC5}\xBE\x11\x8C\"\xD5\xADpz\x821tf\xC5\x17L`\x80\x82\x01R\x90V[\x81b\x08\0\0\x03a0\x9BWP`@\x80Q`\xA0\x81\x01\x82R`\x13\x81R` \x81\x01\x92\x90\x92R\x7F0dHfWcD\x03\x84K\x0E\xACx\xCA\x88,\xFD(CA\xFC\xB0aZ\x15\xCF\xCD\x17\xB1M\x82\x01\x90\x82\x01R\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD``\x82\x01R\x7F\x06\xE4\x02\xC0\xA3\x14\xFBg\xA1\\\xF8\x06fJ\xE1\xB7\"\xDB\xC0\xEF\xE6nl\x81\xD9\x8F\x99$\xCASS!`\x80\x82\x01R\x90V[\x81b\x10\0\0\x03a10WP`@\x80Q`\xA0\x81\x01\x82R`\x14\x81R` \x81\x01\x92\x90\x92R\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x90\x82\x01R\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW``\x82\x01R\x7F\x10\x0C3-!\0\x89_\xABds\xBC,Q\xBF\xCAR\x1FE\xCB;\xAC\xA6&\x08R\xA8\xFD\xE2l\x91\xF3`\x80\x82\x01R\x90V[\x81` \x03a1\xC3WP`@\x80Q`\xA0\x81\x01\x82R`\x05\x81R` \x81\x01\x92\x90\x92R\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x90\x82\x01R\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0``\x82\x01R\x7F'$q6\x03\xBF\xBDy\n\xEA\xF3\xE7\xDF%\xD8\xE7\xEF\x8F1\x134\x90[M\x8C\x99\x98\x0C\xF2\x10\x97\x9D`\x80\x82\x01R\x90V[`@Q\x7F\xE2\xEF\t\xE5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x91\x90PV[a2\x1E`@Q\x80``\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[a2(\x84\x84a=\x0CV[\x80\x82Ra28\x90\x85\x90\x85\x90a=rV[` \x82\x01R\x80Qa2N\x90\x85\x90\x84\x90\x86\x90a=\xF8V[`@\x82\x01R\x93\x92PPPV[`\0\x80a2h\x85\x87\x89a?\xBFV[\x90Pa2x\x88\x86\x89\x89\x88\x88a@\xC1V[a2\x83\x81\x87\x86aC\xDFV[\x98\x97PPPPPPPPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x82Q\x82Q\x14a2\xF4W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FMSM error: length does not match`D\x82\x01R`d\x01a\tBV[a32\x83`\0\x81Q\x81\x10a3\nWa3\naY\xDFV[` \x02` \x01\x01Q\x83`\0\x81Q\x81\x10a3%Wa3%aY\xDFV[` \x02` \x01\x01QaDAV[\x90P`\x01[\x82Q\x81\x10\x15a3\x82Wa3x\x82a3s\x86\x84\x81Q\x81\x10a3YWa3YaY\xDFV[` \x02` \x01\x01Q\x86\x85\x81Q\x81\x10a3%Wa3%aY\xDFV[aD\xE5V[\x91P`\x01\x01a37V[P\x92\x91PPV[`\0a3\xB5\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x83a[\x80V[a)\xFD\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01a[\xA2V[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81Q` \x83\x01Q\x15\x90\x15\x16\x15a4\x07WP\x90V[`@Q\x80`@\x01`@R\x80\x83`\0\x01Q\x81R` \x01\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x84` \x01Qa4L\x91\x90a[\x80V[a4v\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDGa[\xA2V[\x90R\x92\x91PPV[a4\xA9`@Q\x80`\x80\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`@Q\x80`\x80\x01`@R\x80\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x81R` \x01\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2\x81R` \x01\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA\x81R` \x01\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[\x81RP\x90P\x90V[`\0\x80`\0`@Q\x87Q\x81R` \x88\x01Q` \x82\x01R` \x87\x01Q`@\x82\x01R\x86Q``\x82\x01R``\x87\x01Q`\x80\x82\x01R`@\x87\x01Q`\xA0\x82\x01R\x85Q`\xC0\x82\x01R` \x86\x01Q`\xE0\x82\x01R` \x85\x01Qa\x01\0\x82\x01R\x84Qa\x01 \x82\x01R``\x85\x01Qa\x01@\x82\x01R`@\x85\x01Qa\x01`\x82\x01R` `\0a\x01\x80\x83`\x08Z\xFA\x91PP`\0Q\x91P\x80a6%W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1C`$\x82\x01R\x7FBn254: Pairing check failed!\0\0\0\0`D\x82\x01R`d\x01a\tBV[P\x15\x15\x90P[\x94\x93PPPPV[``\x82a6HWa6C\x82aE\x8CV[a \x96V[\x81Q\x15\x80\x15a6_WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a6\xA1W`@Q\x7F\x99\x96\xB3\x15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\tBV[P\x80a \x96V[\x82Q`\xFE\x90a6\xE3a6\xB9\x83a;\xC0V[`@Q` \x01a6\xCB\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R`\0`\x04aE\xCEV[a7\x1Da6\xF3\x86`\0\x01Qa;\xC0V[`@Q` \x01a7\x05\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R`\0`\x08aE\xCEV[a7-a6\xF3\x87` \x01Qa;\xC0V[`@Q` \x01a7@\x94\x93\x92\x91\x90a[\xB5V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x85Ra7]`\x01a;\xC0V[a7\x86\x7F/\x8D\xD1\xF1\xA7X\x8BW`\x01`\0[\x82\x81\x10\x15a>~W\x81\x87\x03a>_W\x87\x81\x81Q\x81\x10a>LWa>LaY\xDFV[` \x02` \x01\x01Q\x94PPPPPa6+V[\x83\x80a>mWa>ma[jV[\x89``\x01Q\x83\t\x91P`\x01\x01a>+V[P`\0\x93PPPPa6+V[`\0\x80`\0\x80\x8A`@\x01Q\x90P`\0\x80a>\xA5\x8D\x88aG\xAEV[\x90P`\0\x87g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a>\xC2Wa>\xC2aT\xA6V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a>\xEBW\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x90P\x88\x8B\x85\t\x93P`\x01\x92P`\0[\x88\x81\x10\x15a?0W` \x81\x02` \x84\x01\x01Q\x95P\x89\x8D\x87\x8C\x03\x08\x96P\x89\x87\x85\t` \x82\x81\x02\x84\x01\x01\x88\x90R\x93P`\x01\x01a>\xFBV[Pa?:\x83aF\xF6V[\x92P`\0[\x88\x81\x10\x15a?\xADW` \x81\x02` \x84\x01\x01Q\x95P\x89\x86\x86\t\x97P\x89\x84\x89\t\x97P`\0[\x89\x81\x10\x15a?\x8CW\x80\x82\x14a?\x84W` \x81\x02` \x84\x01\x01Q\x97P\x8A\x88\x8A\t\x98P[`\x01\x01a?bV[P` \x81\x02` \x8F\x01\x01Q\x95P\x89\x86\x89\t\x97P\x89\x88\x8C\x08\x9AP`\x01\x01a??V[PPPPPPPPPP\x94\x93PPPPV[`\0\x80\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x90P`\0\x83` \x01Q\x90P`\0\x84`@\x01Q\x90P`\0`\x01\x90P``\x88\x01Q`\x80\x89\x01Qa\x01\xA0\x89\x01Qa\x02@\x8A\x01Q\x87\x88\x89\x83\x87\t\x8A\x86\x86\x08\x08\x86\t\x94PPPa\x01\xC0\x89\x01Qa\x02`\x8A\x01Q\x87\x88\x89\x83\x87\t\x8A\x86\x86\x08\x08\x86\t\x94PPPa\x01\xE0\x89\x01Qa\x02\x80\x8A\x01Q\x87\x88\x89\x83\x87\t\x8A\x86\x86\x08\x08\x86\t\x94PPPa\x02\0\x89\x01Qa\x02\xA0\x8A\x01Q\x87\x88\x89\x83\x87\t\x8A\x86\x86\x08\x08\x86\t\x94PPPa\x02 \x89\x01Q\x91Pa\x02\xC0\x89\x01Q\x86\x87\x82\x89\x85\x87\x08\t\x85\t\x93PPPP\x87Q` \x89\x01Q\x85\x86\x86\x83\t\x87\x03\x85\x08\x96PP\x84\x85\x83\x83\t\x86\x03\x87\x08\x99\x98PPPPPPPPPV[a@\xCF\x86\x86\x86\x86\x85\x87aH\x9FV[`\xC0\x85\x01Q\x82Q\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x91\x90\x81\x90\x81\x90\x86\x90`\x14\x90\x81\x10aA\x10WaA\x10aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x85`\0\x01Q\x84`\x14\x81Q\x81\x10aA4WaA4aY\xDFV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x15\x81Q\x81\x10aAYWaAYaY\xDFV[` \x02` \x01\x01\x81\x81RPP\x85` \x01Q\x84`\x15\x81Q\x81\x10aA}WaA}aY\xDFV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x16\x81Q\x81\x10aA\xA2WaA\xA2aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x85`@\x01Q\x84`\x16\x81Q\x81\x10aA\xC6WaA\xC6aY\xDFV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x17\x81Q\x81\x10aA\xEBWaA\xEBaY\xDFV[` \x02` \x01\x01\x81\x81RPP\x85``\x01Q\x84`\x17\x81Q\x81\x10aB\x0FWaB\x0FaY\xDFV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x18\x81Q\x81\x10aB4WaB4aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x85`\x80\x01Q\x84`\x18\x81Q\x81\x10aBXWaBXaY\xDFV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x19\x81Q\x81\x10aB}WaB}aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x88`@\x01Q\x84`\x19\x81Q\x81\x10aB\xA1WaB\xA1aY\xDFV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1A\x81Q\x81\x10aB\xC6WaB\xC6aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x88``\x01Q\x84`\x1A\x81Q\x81\x10aB\xEAWaB\xEAaY\xDFV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1B\x81Q\x81\x10aC\x0FWaC\x0FaY\xDFV[` \x02` \x01\x01\x81\x81RPP\x88`\x80\x01Q\x84`\x1B\x81Q\x81\x10aC3WaC3aY\xDFV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1C\x81Q\x81\x10aCXWaCXaY\xDFV[` \x02` \x01\x01\x81\x81RPP\x88`\xA0\x01Q\x84`\x1C\x81Q\x81\x10aC|WaC|aY\xDFV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x87`\xE0\x01Q\x85`\x1D\x81Q\x81\x10aC\xA5WaC\xA5aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x85`\xA0\x01Q\x84`\x1D\x81Q\x81\x10aC\xC9WaC\xC9aY\xDFV[` \x02` \x01\x01\x81\x90RPPPPPPPPPPV[\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x83\x81\x03\x90`\0[`\n\x81\x10\x15aD8W` `\x15\x82\x01\x02\x84\x01Q` \x82\x02a\x01\xA0\x01\x86\x01Q\x83\x84\x82\x84\t\x86\x08\x94PPP`\x01\x01aD\x07V[PP\x93\x92PPPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01RaD]aT8V[\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R`@\x81\x01\x83\x90R`\0``\x83`\x80\x84`\x07a\x07\xD0Z\x03\xFA\x90P\x80\x80aD\x8FW`\0\x80\xFD[P\x80aD\xDDW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x19`$\x82\x01R\x7FBn254: scalar mul failed!\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\tBV[PP\x92\x91PPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01RaE\x01aTVV[\x83Q\x81R` \x80\x85\x01Q\x81\x83\x01R\x83Q`@\x83\x01R\x83\x01Q``\x80\x83\x01\x91\x90\x91R`\0\x90\x83`\xC0\x84`\x06a\x07\xD0Z\x03\xFA\x90P\x80\x80aE>W`\0\x80\xFD[P\x80aD\xDDW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: group addition failed!\0\0\0`D\x82\x01R`d\x01a\tBV[\x80Q\x15aE\x9CW\x80Q\x80\x82` \x01\xFD[`@Q\x7F\x14%\xEAB\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x81aE\xDC\x81`\x1FaZ\x0EV[\x10\x15aF*W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0E`$\x82\x01R\x7Fslice_overflow\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\tBV[aF4\x82\x84aZ\x0EV[\x84Q\x10\x15aF\x84W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x11`$\x82\x01R\x7Fslice_outOfBounds\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\tBV[``\x82\x15\x80\x15aF\xA3W`@Q\x91P`\0\x82R` \x82\x01`@RaF\xEDV[`@Q\x91P`\x1F\x84\x16\x80\x15` \x02\x81\x84\x01\x01\x85\x81\x01\x87\x83\x15` \x02\x84\x8B\x01\x01\x01[\x81\x83\x10\x15aF\xDCW\x80Q\x83R` \x92\x83\x01\x92\x01aF\xC4V[PP\x85\x84R`\x1F\x01`\x1F\x19\x16`@RP[P\x94\x93PPPPV[`\0\x80`\0\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x90P`@Q` \x81R` \x80\x82\x01R` `@\x82\x01R\x84``\x82\x01R`\x02\x82\x03`\x80\x82\x01R\x81`\xA0\x82\x01R` `\0`\xC0\x83`\x05Z\xFA\x92PP`\0Q\x92P\x81aG\xA7W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: pow precompile failed!\0\0\0`D\x82\x01R`d\x01a\tBV[PP\x91\x90PV[``\x82` \x01Q\x82\x11\x15aG\xEEW`@Q\x7F\x8C^\x11\xF1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x83\x01Q`\x01\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x84g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aH/WaH/aT\xA6V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15aHXW\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x93P\x84\x15\x19\x15a=iW` \x84\x01\x85` \x02\x81\x01`\x01\x82R` \x82\x01\x91P[\x80\x82\x10\x15aH\x94W\x82\x85\x85\t\x93P\x83\x82R` \x82\x01\x91PaHxV[PPPPP\x92\x91PPV[`\0\x80`\0\x80`\0\x80\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x90P\x80` \x8B\x01Q` \x8D\x01Q\t\x95P\x8AQ\x93P\x80`\xA0\x8C\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xA0\x8A\x01Q\x84\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80\x7F/\x8D\xD1\xF1\xA7X\x85\x82a[\xA2V[\x87`\x01\x81Q\x81\x10aKQWaKQaY\xDFV[` \x02` \x01\x01\x81\x81RPP\x88a\x01\xA0\x01Q\x87`\x02\x81Q\x81\x10aKvWaKvaY\xDFV[` \x02` \x01\x01\x81\x81RPP\x88a\x01\xC0\x01Q\x87`\x03\x81Q\x81\x10aK\x9BWaK\x9BaY\xDFV[` \x02` \x01\x01\x81\x81RPP\x88a\x01\xE0\x01Q\x87`\x04\x81Q\x81\x10aK\xC0WaK\xC0aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x88a\x02\0\x01Q\x87`\x05\x81Q\x81\x10aK\xE5WaK\xE5aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x8B`\xE0\x01Q\x88`\x02\x81Q\x81\x10aL\tWaL\taY\xDFV[` \x02` \x01\x01\x81\x90RP\x8Ba\x01\0\x01Q\x88`\x03\x81Q\x81\x10aL-WaL-aY\xDFV[` \x02` \x01\x01\x81\x90RP\x8Ba\x01 \x01Q\x88`\x04\x81Q\x81\x10aLQWaLQaY\xDFV[` \x02` \x01\x01\x81\x90RP\x8Ba\x01@\x01Q\x88`\x05\x81Q\x81\x10aLuWaLuaY\xDFV[` \x02` \x01\x01\x81\x90RP\x80a\x01\xC0\x8A\x01Qa\x01\xA0\x8B\x01Q\t\x92P\x82\x87`\x06\x81Q\x81\x10aL\xA4WaL\xA4aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01`\x01Q\x88`\x06\x81Q\x81\x10aL\xC9WaL\xC9aY\xDFV[` \x02` \x01\x01\x81\x90RP\x80a\x02\0\x8A\x01Qa\x01\xE0\x8B\x01Q\t\x92P\x82\x87`\x07\x81Q\x81\x10aL\xF8WaL\xF8aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01\x80\x01Q\x88`\x07\x81Q\x81\x10aM\x1DWaM\x1DaY\xDFV[` \x02` \x01\x01\x81\x90RPa\x01\xA0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\x08\x81Q\x81\x10aMVWaMVaY\xDFV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01\xE0\x01Q\x88`\x08\x81Q\x81\x10aM{WaM{aY\xDFV[` \x02` \x01\x01\x81\x90RPa\x01\xC0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\t\x81Q\x81\x10aM\xB4WaM\xB4aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x02\0\x01Q\x88`\t\x81Q\x81\x10aM\xD9WaM\xD9aY\xDFV[` \x02` \x01\x01\x81\x90RPa\x01\xE0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\n\x81Q\x81\x10aN\x12WaN\x12aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x02 \x01Q\x88`\n\x81Q\x81\x10aN7WaN7aY\xDFV[` \x02` \x01\x01\x81\x90RPa\x02\0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\x0B\x81Q\x81\x10aNpWaNpaY\xDFV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x02@\x01Q\x88`\x0B\x81Q\x81\x10aN\x95WaN\x95aY\xDFV[` \x02` \x01\x01\x81\x90RP\x88a\x02 \x01Q\x81aN\xB1\x91\x90a[\xA2V[\x87`\x0C\x81Q\x81\x10aN\xC4WaN\xC4aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01\xA0\x01Q\x88`\x0C\x81Q\x81\x10aN\xE9WaN\xE9aY\xDFV[` \x02` \x01\x01\x81\x90RP`\x01\x87`\r\x81Q\x81\x10aO\tWaO\taY\xDFV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01\xC0\x01Q\x88`\r\x81Q\x81\x10aO.WaO.aY\xDFV[` \x02` \x01\x01\x81\x90RP\x80a\x01\xC0\x8A\x01Qa\x01\xA0\x8B\x01Q\t\x92P\x80a\x01\xE0\x8A\x01Q\x84\t\x92P\x80a\x02\0\x8A\x01Q\x84\t\x92P\x80a\x02 \x8A\x01Q\x84\t\x92P\x82\x87`\x0E\x81Q\x81\x10aO~WaO~aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x02`\x01Q\x88`\x0E\x81Q\x81\x10aO\xA3WaO\xA3aY\xDFV[` \x90\x81\x02\x91\x90\x91\x01\x01R\x89QaO\xBA\x90\x82a[\xA2V[\x87`\x0F\x81Q\x81\x10aO\xCDWaO\xCDaY\xDFV[` \x02` \x01\x01\x81\x81RPP\x88`\xC0\x01Q\x88`\x0F\x81Q\x81\x10aO\xF1WaO\xF1aY\xDFV[` \x02` \x01\x01\x81\x90RP\x80`\x01\x8BQ\x08`\xA0\x8C\x01Q\x90\x93P\x81\x90\x80\t\x91P\x80\x82\x84\t\x92P\x80\x83` `\x10\x02\x89\x01Q\t\x91P\x81\x87`\x10\x81Q\x81\x10aP7WaP7aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x88`\xE0\x01Q\x88`\x10\x81Q\x81\x10aP[WaP[aY\xDFV[` \x02` \x01\x01\x81\x90RP\x80\x83` `\x11\x02\x89\x01Q\t\x91P\x81\x87`\x11\x81Q\x81\x10aP\x87WaP\x87aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x88a\x01\0\x01Q\x88`\x11\x81Q\x81\x10aP\xACWaP\xACaY\xDFV[` \x02` \x01\x01\x81\x90RP\x80\x83` `\x12\x02\x89\x01Q\t\x91P\x81\x87`\x12\x81Q\x81\x10aP\xD8WaP\xD8aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x88a\x01 \x01Q\x88`\x12\x81Q\x81\x10aP\xFDWaP\xFDaY\xDFV[` \x02` \x01\x01\x81\x90RP\x80\x83` `\x13\x02\x89\x01Q\t\x91P\x81\x87`\x13\x81Q\x81\x10aQ)WaQ)aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x88a\x01@\x01Q\x88`\x13\x81Q\x81\x10aQNWaQNaY\xDFV[` \x02` \x01\x01\x81\x90RPPPPPPPPPPPPPV[`@Q\x80a\x02\x80\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01aQ\x9E`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[\x81R` \x01aQ\xC0`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[\x81R` \x01aQ\xE2`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[\x81R` \x01aR\x04`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[\x81R` \x01aR&`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[\x81R` \x01aRH`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[\x81R` \x01aRj`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[\x81R` \x01aR\x8C`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[\x81R` \x01aR\xAE`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[\x81R` \x01aR\xD0`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[\x81R` \x01aR\xF2`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[\x81R` \x01aS\x14`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[\x81R` \x01aS6`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[\x81R` \x01aSX`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[\x81R` \x01aSz`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[\x81R` \x01aS\x9C`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[\x81R` \x01aS\xBE`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[\x81R` \x01aS\xE0`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[\x90R\x90V[`@Q\x80a\x01\0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01``\x81R` \x01``\x81R` \x01aS\xBE`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[`@Q\x80``\x01`@R\x80`\x03\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[`@Q\x80`\x80\x01`@R\x80`\x04\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a1\xF5W`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15aT\x9DW`\0\x80\xFD[a \x96\x82aTtV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Qa\x02\xE0\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15aT\xE0WaT\xE0aT\xA6V[`@R\x90V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15aU\x0FWaU\x0FaT\xA6V[`@R\x91\x90PV[\x805g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x16\x81\x14a1\xF5W`\0\x80\xFD[`\0a\x01\0\x80\x83\x85\x03\x12\x15aUCW`\0\x80\xFD[`@Q\x90\x81\x01\x90g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x81\x83\x10\x17\x15aUfWaUfaT\xA6V[\x81`@R\x80\x92PaUv\x84aU\x17V[\x81RaU\x84` \x85\x01aU\x17V[` \x82\x01R`@\x84\x015`@\x82\x01R``\x84\x015``\x82\x01R`\x80\x84\x015`\x80\x82\x01R`\xA0\x84\x015`\xA0\x82\x01R`\xC0\x84\x015`\xC0\x82\x01R`\xE0\x84\x015`\xE0\x82\x01RPP\x92\x91PPV[`\0`@\x82\x84\x03\x12\x15aU\xDFW`\0\x80\xFD[`@Q`@\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15aV\x02WaV\x02aT\xA6V[`@R\x825\x81R` \x92\x83\x015\x92\x81\x01\x92\x90\x92RP\x91\x90PV[`\0\x80\x82\x84\x03a\x05\x80\x81\x12\x15aV1W`\0\x80\xFD[aV;\x85\x85aU/V[\x92Pa\x01\0a\x04\x80\x80\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\x84\x01\x12\x15aVrW`\0\x80\xFD[aVzaT\xBCV[\x92PaV\x88\x87\x83\x88\x01aU\xCDV[\x83Ra\x01@aV\x99\x88\x82\x89\x01aU\xCDV[` \x85\x01Ra\x01\x80aV\xAD\x89\x82\x8A\x01aU\xCDV[`@\x86\x01Ra\x01\xC0aV\xC1\x8A\x82\x8B\x01aU\xCDV[``\x87\x01Ra\x02\0aV\xD5\x8B\x82\x8C\x01aU\xCDV[`\x80\x88\x01Ra\x02@aV\xE9\x8C\x82\x8D\x01aU\xCDV[`\xA0\x89\x01Ra\x02\x80aV\xFD\x8D\x82\x8E\x01aU\xCDV[`\xC0\x8A\x01Ra\x02\xC0aW\x11\x8E\x82\x8F\x01aU\xCDV[`\xE0\x8B\x01RaW$\x8Ea\x03\0\x8F\x01aU\xCDV[\x89\x8B\x01RaW6\x8Ea\x03@\x8F\x01aU\xCDV[a\x01 \x8B\x01RaWJ\x8Ea\x03\x80\x8F\x01aU\xCDV[\x87\x8B\x01RaW\\\x8Ea\x03\xC0\x8F\x01aU\xCDV[a\x01`\x8B\x01RaWp\x8Ea\x04\0\x8F\x01aU\xCDV[\x86\x8B\x01Ra\x04@\x8D\x015a\x01\xA0\x8B\x01Ra\x04`\x8D\x015\x85\x8B\x01R\x87\x8D\x015a\x01\xE0\x8B\x01Ra\x04\xA0\x8D\x015\x84\x8B\x01Ra\x04\xC0\x8D\x015a\x02 \x8B\x01Ra\x04\xE0\x8D\x015\x83\x8B\x01Ra\x05\0\x8D\x015a\x02`\x8B\x01Ra\x05 \x8D\x015\x82\x8B\x01Ra\x05@\x8D\x015a\x02\xA0\x8B\x01Ra\x05`\x8D\x015\x81\x8B\x01RPPPPPPPPP\x80\x91PP\x92P\x92\x90PV[`\0\x80`@\x83\x85\x03\x12\x15aX\x07W`\0\x80\xFD[aX\x10\x83aTtV[\x91P` \x80\x84\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15aX.W`\0\x80\xFD[\x81\x86\x01\x91P\x86`\x1F\x83\x01\x12aXBW`\0\x80\xFD[\x815\x81\x81\x11\x15aXTWaXTaT\xA6V[aXf\x84`\x1F\x19`\x1F\x84\x01\x16\x01aT\xE6V[\x91P\x80\x82R\x87\x84\x82\x85\x01\x01\x11\x15aX|W`\0\x80\xFD[\x80\x84\x84\x01\x85\x84\x017`\0\x84\x82\x84\x01\x01RP\x80\x93PPPP\x92P\x92\x90PV[\x805c\xFF\xFF\xFF\xFF\x81\x16\x81\x14a1\xF5W`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15aX\xC0W`\0\x80\xFD[a \x96\x82aX\x9AV[`\0\x80`\0a\x01@\x84\x86\x03\x12\x15aX\xDFW`\0\x80\xFD[aX\xE9\x85\x85aU/V[\x92PaX\xF8a\x01\0\x85\x01aX\x9AV[\x91PaY\x07a\x01 \x85\x01aTtV[\x90P\x92P\x92P\x92V[`\0a\x01\0\x82\x84\x03\x12\x15aY#W`\0\x80\xFD[a \x96\x83\x83aU/V[`\0[\x83\x81\x10\x15aYHW\x81\x81\x01Q\x83\x82\x01R` \x01aY0V[PP`\0\x91\x01RV[` \x81R`\0\x82Q\x80` \x84\x01RaYp\x81`@\x85\x01` \x87\x01aY-V[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x81\x16\x83\x82\x16\x02\x80\x82\x16\x91\x90\x82\x81\x14aD\xDDWaD\xDDaY\x84V[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x81\x16\x83\x82\x16\x01\x90\x80\x82\x11\x15a3\x82Wa3\x82aY\x84V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\0` \x82\x84\x03\x12\x15aZ\x07W`\0\x80\xFD[PQ\x91\x90PV[\x80\x82\x01\x80\x82\x11\x15a)\xFDWa)\xFDaY\x84V[`\0\x82QaZ3\x81\x84` \x87\x01aY-V[\x91\x90\x91\x01\x92\x91PPV[`\0\x87Q` aZP\x82\x85\x83\x8D\x01aY-V[\x88Q\x91\x84\x01\x91aZc\x81\x84\x84\x8D\x01aY-V[\x88Q\x92\x01\x91aZu\x81\x84\x84\x8C\x01aY-V[\x87Q\x92\x01\x91aZ\x87\x81\x84\x84\x8B\x01aY-V[\x86Q\x92\x01\x91aZ\x99\x81\x84\x84\x8A\x01aY-V[\x85Q\x92\x01\x91aZ\xAB\x81\x84\x84\x89\x01aY-V[\x91\x90\x91\x01\x99\x98PPPPPPPPPV[`\0\x83QaZ\xCE\x81\x84` \x88\x01aY-V[\x83Q\x90\x83\x01\x90aZ\xE2\x81\x83` \x88\x01aY-V[\x01\x94\x93PPPPV[`\0\x87QaZ\xFD\x81\x84` \x8C\x01aY-V[\x91\x90\x91\x01\x95\x86RP` \x85\x01\x93\x90\x93R`@\x84\x01\x91\x90\x91R``\x83\x01R`\x80\x82\x01R`\xA0\x01\x91\x90PV[`\0\x84Qa[9\x81\x84` \x89\x01aY-V[\x84Q\x90\x83\x01\x90a[M\x81\x83` \x89\x01aY-V[\x84Q\x91\x01\x90a[`\x81\x83` \x88\x01aY-V[\x01\x95\x94PPPPPV[cNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[`\0\x82a[\x9DWcNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[P\x06\x90V[\x81\x81\x03\x81\x81\x11\x15a)\xFDWa)\xFDaY\x84V[`\0\x85Qa[\xC7\x81\x84` \x8A\x01aY-V[\x85Q\x90\x83\x01\x90a[\xDB\x81\x83` \x8A\x01aY-V[\x85Q\x91\x01\x90a[\xEE\x81\x83` \x89\x01aY-V[\x84Q\x91\x01\x90a\\\x01\x81\x83` \x88\x01aY-V[\x01\x96\x95PPPPPPV[`\0\x89Q` a\\\x1F\x82\x85\x83\x8F\x01aY-V[\x8AQ\x91\x84\x01\x91a\\2\x81\x84\x84\x8F\x01aY-V[\x8AQ\x92\x01\x91a\\D\x81\x84\x84\x8E\x01aY-V[\x89Q\x92\x01\x91a\\V\x81\x84\x84\x8D\x01aY-V[\x88Q\x92\x01\x91a\\h\x81\x84\x84\x8C\x01aY-V[\x87Q\x92\x01\x91a\\z\x81\x84\x84\x8B\x01aY-V[\x86Q\x92\x01\x91a\\\x8C\x81\x84\x84\x8A\x01aY-V[\x85Q\x92\x01\x91a\\\x9E\x81\x84\x84\x89\x01aY-V[\x91\x90\x91\x01\x9B\x9APPPPPPPPPPPV[`\0\x88Q` a\\\xC4\x82\x85\x83\x8E\x01aY-V[\x89Q\x91\x84\x01\x91a\\\xD7\x81\x84\x84\x8E\x01aY-V[\x89Q\x92\x01\x91a\\\xE9\x81\x84\x84\x8D\x01aY-V[\x88Q\x92\x01\x91a\\\xFB\x81\x84\x84\x8C\x01aY-V[\x87Q\x92\x01\x91a]\r\x81\x84\x84\x8B\x01aY-V[\x86Q\x92\x01\x91a]\x1F\x81\x84\x84\x8A\x01aY-V[\x85Q\x92\x01\x91a]1\x81\x84\x84\x89\x01aY-V[\x91\x90\x91\x01\x9A\x99PPPPPPPPPPV[`\0\x8AQa]U\x81\x84` \x8F\x01aY-V[\x91\x90\x91\x01\x98\x89RP` \x88\x01\x96\x90\x96R`@\x87\x01\x94\x90\x94R``\x86\x01\x92\x90\x92R`\x80\x85\x01R`\xA0\x84\x01R`\xC0\x83\x01R`\xE0\x82\x01Ra\x01\0\x01\x91\x90PV\xFE\xA1dsolcC\0\x08\x17\0\n";
+ const __BYTECODE: &[u8] = b"`\xA0`@R0`\x80R4\x80\x15b\0\0\x15W`\0\x80\xFD[Pb\0\0 b\0\0&V[b\0\0\xDAV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16\x15b\0\0wW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80T`\x01`\x01`@\x1B\x03\x90\x81\x16\x14b\0\0\xD7W\x80T`\x01`\x01`@\x1B\x03\x19\x16`\x01`\x01`@\x1B\x03\x90\x81\x17\x82U`@Q\x90\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PV[`\x80QaZIb\0\x01\x04`\09`\0\x81\x81a\x142\x01R\x81\x81a\x14[\x01Ra\x15\xC7\x01RaZI`\0\xF3\xFE`\x80`@R`\x046\x10a\x01RW`\x005`\xE0\x1C\x80c\x01?\xA5\xFC\x14a\x01WW\x80c\r\x8En,\x14a\x01yW\x80c1=\xF7\xB1\x14a\x01\xABW\x80c8+!Z\x14a\x01\xD8W\x80c@\x999\xB7\x14a\x01\xFCW\x80cHG\xAE]\x14a\x02\x1CW\x80cO\x1E\xF2\x86\x14a\x02\x9EW\x80cR\xD1\x90-\x14a\x02\xB1W\x80cTd`\x85\x14a\x02\xC6W\x80cb\x82w3\x14a\x02\xDBW\x80ci\xCCj\x04\x14a\x02\xF1W\x80cpS\xFCQ\x14a\x03\x06W\x80cqP\x18\xA6\x14a\x03\x1BW\x80cvg\x18\x08\x14a\x030W\x80cv\xB6\xB7\xCB\x14a\x03dW\x80c\x7F\x17\xBA\xAD\x14a\x03zW\x80c\x82\xD0\x7F\xF3\x14a\x04-W\x80c\x85\x84\xD2?\x14a\x04BW\x80c\x8D\xA5\xCB[\x14a\x04\x86W\x80c\xA2D\xD5\x96\x14a\x04\x9BW\x80c\xA5\x1Eo\xEA\x14a\x04\xBBW\x80c\xAA\x92'2\x14a\x04\xDBW\x80c\xAD<\xB1\xCC\x14a\x04\xFBW\x80c\xBD2Q\x9A\x14a\x059W\x80c\xCAo\xE8U\x14a\x05jW\x80c\xDB\x13\xB6\n\x14a\x05\x80W\x80c\xE003\x01\x14a\x05\xBFW\x80c\xF0h T\x14a\x05\xDFW\x80c\xF2\xFD\xE3\x8B\x14a\x06\x11W[`\0\x80\xFD[4\x80\x15a\x01cW`\0\x80\xFD[Pa\x01wa\x01r6`\x04aO\xA1V[a\x061V[\0[4\x80\x15a\x01\x85W`\0\x80\xFD[P`@\x80Q`\x01\x81R`\0` \x82\x01\x81\x90R\x91\x81\x01\x91\x90\x91R``\x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\xB7W`\0\x80\xFD[P`\x06Ta\x01\xCB\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Qa\x01\xA2\x91\x90aO\xBCV[4\x80\x15a\x01\xE4W`\0\x80\xFD[Pa\x01\xEE`\x03T\x81V[`@Q\x90\x81R` \x01a\x01\xA2V[4\x80\x15a\x02\x08W`\0\x80\xFD[Pa\x01wa\x02\x176`\x04aQAV[a\x06\xF1V[4\x80\x15a\x02(W`\0\x80\xFD[Pa\x021a\n\x1CV[`@Qa\x01\xA2\x91\x90`\0a\x01\0\x82\x01\x90P`\x01\x80`@\x1B\x03\x80\x84Q\x16\x83R\x80` \x85\x01Q\x16` \x84\x01RP`@\x83\x01Q`@\x83\x01R``\x83\x01Q``\x83\x01R`\x80\x83\x01Q`\x80\x83\x01R`\xA0\x83\x01Q`\xA0\x83\x01R`\xC0\x83\x01Q`\xC0\x83\x01R`\xE0\x83\x01Q`\xE0\x83\x01R\x92\x91PPV[a\x01wa\x02\xAC6`\x04aR\xFBV[a\n\xAEV[4\x80\x15a\x02\xBDW`\0\x80\xFD[Pa\x01\xEEa\n\xCDV[4\x80\x15a\x02\xD2W`\0\x80\xFD[P`\x08Ta\x01\xEEV[4\x80\x15a\x02\xE7W`\0\x80\xFD[Pa\x01\xEE`\x02T\x81V[4\x80\x15a\x02\xFDW`\0\x80\xFD[Pa\x01wa\n\xEAV[4\x80\x15a\x03\x12W`\0\x80\xFD[P`\x07Ta\x01\xEEV[4\x80\x15a\x03'W`\0\x80\xFD[Pa\x01wa\x0BZV[4\x80\x15a\x03F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x14\xD4a\x10^V[\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x81`@Qa\x06\xE6\x91\x90aO\xBCV[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x15]WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x15Z\x91\x81\x01\x90aUrV[`\x01[a\x15|W\x81`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x04\x01a\x08[\x91\x90aO\xBCV[`\0\x80Q` aY]\x839\x81Q\x91R\x81\x14a\x15\xADW`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x08[V[a\x15\xB7\x83\x83a \xB2V[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\x0BXW`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\x16\x0Fa\x16aV[\x80T`\x01`\x01`\xA0\x1B\x03\x84\x81\x16`\x01`\x01`\xA0\x1B\x03\x19\x83\x16\x81\x17\x84U`@Q\x93\x94P\x91\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90`\0\x90\xA3PPPV[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x90V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90V[a\x16\xB1a!\x08V[a\x10[\x81a!-V[a\x0BXa!\x08V[\x81Q`\x01`\x01`@\x1B\x03\x16\x15\x15\x80a\x16\xE6WP` \x82\x01Q`\x01`\x01`@\x1B\x03\x16\x15\x15[\x80a\x16\xF3WP`\x80\x82\x01Q\x15[\x80a\x17\0WP`\xA0\x82\x01Q\x15[\x80a\x17\rWP`\xC0\x82\x01Q\x15[\x80a\x17\x1AWP`\xE0\x82\x01Q\x15[\x80a\x17)WPc\xFF\xFF\xFF\xFF\x81\x16\x15[\x15a\x17GW`@QcP\xDD\x03\xF7`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81`\x05`\0\x80`\x04\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP\x81`\x05`\0\x80`\x08\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP`\0\x80`\x0Ca\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP\x80`\0\x80a\x01\0\n\x81T\x81c\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83c\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\0a\x19-\x83a\x0E\xBDV[`\x01\x81\x81U`\xE0\x85\x01Q`\x02\x81\x81U`\x03\x93\x90\x93U`\x04U`\x07\x80T\x80\x83\x01\x82U`\0\x91\x82RC`\0\x80Q` aY\x1D\x839\x81Q\x91R\x90\x91\x01U`@\x80Q\x80\x82\x01\x82R` \x80\x89\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16\x83R\x92\x90\x98\x01Q\x97\x81\x01\x97\x88R`\x08\x80T\x94\x85\x01\x81U\x90\x92R\x90Q`\0\x80Q` aY\x9D\x839\x81Q\x91R\x92\x90\x93\x02\x91\x82\x01\x80T`\x01`\x01`@\x1B\x03\x19\x16\x93\x90\x91\x16\x92\x90\x92\x17\x90\x91U\x92Q`\0\x80Q` aY\xDD\x839\x81Q\x91R\x90\x93\x01\x92\x90\x92UPPV[a\x19\xEDaM\xF6V[b\x10\0\0\x81R`\x08` \x82\x01R\x7F \xC9@13\xDF\xDE\x9A\x9D8-\xF7o\xB0R5qd\x87%\xAB\xC0\xA7\xC1(0\xBBi\x0E\xC8;3`@\x82\x01QR\x7F\x03\xA0\xA9\xAC\xC3\xE3\x81Z~\xD6\xCB\x13y\xF7\xD1W\xE641dr\x93v9*i:\xCB\xD3\xEC(<` `@\x83\x01Q\x01R\x7F(f\xC1\x8A\xD1\xDF\x10\xEF\x13T,\xCEbP\xCE\x02\xCB*kr\xAE\0\xA9\x85.'\x11\x87\xE9\xE4\xE0\xDB``\x82\x01QR\x7F!\xBE#*B$jVc\xEB\xF4\x83G\x0C\xCAfo\xFE\x9DO\x0Ec\xB9)\xC5\x96\xA7e\x87\x14\xE9p` ``\x83\x01Q\x01R\x7F\x07\xD7xs\xB9\x86\0t\x11\x8Eu\x80\x8CyF\x8B\x83\xC8\xEDd\xBA\x14\xDB\\\xB5\xAF\xA8\xE54\xDE{\x99`\x80\x82\x01QR\x7F\x0B\xE0\xF4H\x83\x90\x80\x13-G\xDE\x17\xDE\0\x99\xB4\xCDt\xAE\x1Ekq\xCD\xDA\x06\xCD\xEB\xB8h\xA5\x0Cm` `\x80\x83\x01Q\x01R\x7F\x13\xBDE\xA0#I\x1E\xAD\xEAD\xCC?$\xCF\xBD\x17\x96\xEA\xDE\x9C\x0E9\xEE\x81\xD9\xF6>\xA0\xA5\x80f%`\xA0\x82\x01QR\x7F\x18\xF9\\\xDD\xA4,\xE1\x1D\x9D\x10\xA3\xB35\xAC\xC2\x14\xE3\x80|W\x8CSY@]\x81\x0C \x8D\xF6\0\x93` `\xA0\x83\x01Q\x01R\x7F\tp\xD9xv4a\xF0\x9E\x9E\xC64T\x074\x978nM(/\xED\xC2\xAC[\x96|\xB9\xFD?\xA8\xA9`\xC0\x82\x01QR\x7F(\xC2!\x7F{\xAC\xF6\xF8\xB2\xB8\xEEJ\x90\xFC\xF8\xB5\xBC\xA0B\x05\xEA\x84\xE8\xE1\xEBT\xB8]\xD4\x1B\xDE(` `\xC0\x83\x01Q\x01R\x7F\x02\xFE=\x02\x98\x8D\xB7\x188\0R\x97\n\xBAF\xA3)m\xF5\xF2\x9Bsk\xA1\xF2\xC4\xCC\xFF\xC8\xB5\x96\x93`\xE0\x82\x01QR\x7F ,>9\x0C\xEE|\\\x85%\xDA#)\xA1\x9FI6\xF6\xF7\x1C\xA9}\xDElo\xA3+8-Z\xCC\x03` `\xE0\x83\x01Q\x01R\x7F#\xAC\x10\xAEl\xA5\xCA\xCE\xE8tK\xB99\xAA\xA859\tT\xB9\x1A\xE6h\xA2\xC8\xD0\xED\xDAU\x8A\x89\xE7a\x01\0\x82\x01QR\x7F\x1C\x8C+\x85l\xDA\xDE%k\xA3#\x7F9\xAF\xD5\xE1p\xA9S \x12\xF7\xAE\xCA\xE4\x9DE\x9B)\xF6\xF6\xAD` a\x01\0\x83\x01Q\x01R\x7F\x16\xEC\x03\xD2`\xBDz\xC1\xC5\x0F\xFAcV]Rt\xB4X,\xEE\xA5/\xF4\x0B\x81\xCD\xFE\x8FDO\x01\xE4a\x01 \x82\x01QR\x7F)9!Rr0\x97\xE0q\x13\xC3\xD7xm$^\xC4\x0C0\x92\x80\x15\xCDP\xB5f\x8AON\xA1p1` a\x01 \x83\x01Q\x01R\x7F,\xDB\xFB:@S\xC8H\x9B\x0C\x94\xE7C8\xAC\x19\x11\x8D\xF7\xA0k\xC5k\x1E\xB4\xD0\xE0\xDCN\xAErHa\x01@\x82\x01QR\x7F\x07\xFE\xA1'\xDA\xE9C\xB8\xDC\x14\x8F\x14\x08\xD4\x0C\xFFF\\\x9CG!\x946i\xB1\xE4\xFDZ9\xDBp6` a\x01@\x83\x01Q\x01R\x7F\x03\x14U\xA7\x9A.\x0C\xE7\x8Al\xB55&\xEC\x04\xAC\x19qj\x86\xB0\x8A\x93\xDFH\xD1x\xF8\xB7~V\x19a\x01`\x82\x01QR\x7F\x11\x86#\xE6\xBC\x13n\xE6\xD3\xF9\x90|\xD4\xAD\x04\xA9A\x8E\xA0;\xA9\x9A\xD7S\"|\xDF\xEEY\x8E\x84\x15` a\x01`\x83\x01Q\x01R\x7F\x08a\xD1\x99wa\xA8R\"j\xAC{\xA9q{\xF6\xAEVE\x10\x99\xBEwL\xDF\x02\xEF5*X\xCB\xC8a\x01\x80\x82\x01QR\x7F\x08\x05\xE3\x92\xBC\xBC\x12\xE4\nr'xc-s\xFE\x98\x1EK\xC6\xFAm\x11x\xB7\n\xF7\xBE\x1C\xB9\xA3\xA3` a\x01\x80\x83\x01Q\x01R\x7F\x10\x1D\x1E9x\xCB\x9F\x1E0=A1D\xEB\xE6v\x82\xC9\xEB\x0C\xFE\x11$)Y\xAA`)\xD7\x8C\xDB\xBCa\x01\xA0\x82\x01QR\x7F\x08\x9E\xB9\xC7'\xE6\xCB\x07\x08+\xC3\xE6\xF4\x0C\xF0OC\x9F\xE4\x80\0`+XGt\xDA\xD7\xEF\xC6`|` a\x01\xA0\x83\x01Q\x01R\x7F-H\x9F$\x93&:\xA8s\xBC\xD9O!\xEF\xB4[\xF2W\xA6\x1D\x81\xC0\xC9\\2\x97\x91e\x06e;@a\x01\xC0\x82\x01QR\x7F\x18\xE4]bz\xAD\xD4\xDF'\x94\xEC\xD9\x90\x9F\xAC\x1Au?\x0Co\xA8\xA9\xC6eJzX\xB0\x91/\xFF\xD5` a\x01\xC0\x83\x01Q\x01R\x7F\x0EC\xE3\xA4\xB1<\xB48\xE2\xAD\x92F\x14&\x1A\xD0$\x02\x14\xFA\x1C\x83\xFC\xDAj\x0B\xF7y\xEB9\xFF\xC5a\x01\xE0\x82\x01QR\x7F\x0E\xAB\xA9\xF4)\xC5\xF6\xFC1\x03\xD4\xCC@V\xC5\0\xFFBB]\x8Ede\xC5\xB8\xE1E!\x9F\x9C\\\xD3` a\x01\xE0\x83\x01Q\x01R\x7F)\xAE5\x1D\t\xDC\xF4\x1C\n\x80\xAB\x059785\x8B\xAA\xB3~o\xBCFK;\xB12X\x99J\x1F\xA4a\x02\0\x82\x01QR\x7F+{\xC7F\x08\xD7\xEC}\xAD\xD0Y}j@\x10\xD8\xBF\xC2\xB3\x19\0(\x19\x01\xCE\xDCB\xBD\xBB\x0F\xB8\xFC` a\x02\0\x83\x01Q\x01R\x7F\x06h\x02\xC7\xCE\xB9\xE9\x13\xD4\xF6T3\xA2\x06a\xE0\x97\xAC\xAC\x1A\xFF\xEC\xBBSJT\xF7j)x\"&a\x02 \x82\x01QR\x7F'\xEC\x80\xE8\x11\xE66\xF34\x82g\x92<\x8Ed\x1B\xD9\x8A~7\xC5!fp\xCB\xFF\x14\xAE2?\x9E\x0E` a\x02 \x83\x01Q\x01R\x7F\x12`M\x1F\x87\xC5\x83\xF6\xC9q\x0Cs\xEA\xF5\x90\xAF\x9D\x07\xAAt=\x13\x81\xD0\xE9\xDF\xF0\xEA\xB2aB9a\x02@\x82\x01QR\x7F\x15\x88W\x9El3x\xEA2\xCBd\x12\x05\xEFv*c\xCD5:\x0B\xD6p9E(\xAD \x81\xEE\x8D\xD4` a\x02@\x83\x01Q\x01R\x7F$}e&\x1D:J\xB0B\xBA\x93s1\xF6\xD0\xC0\xC5\xEB\x9E\xA7\x87S\xA9 \x84\xDB\x1Ai9\xE1\x9E\x82a\x02`\x82\x01QR\x7F,\xE6\xCCfJ2\x14{\xFEj\x0C\x94\xA9[\xF0Ify@\\\xCA\xE0\x16H\xCDN\xC0!\x14Q \xD5` a\x02`\x83\x01Q\x01R\x90V[`\0a\x1F\xD2\x82a!5V[a\x1F\xF5\x83`\0\x81Q\x81\x10a\x1F\xE8Wa\x1F\xE8aU%V[` \x02` \x01\x01Qa\x10\x90V[a \x0B\x83`\x01\x81Q\x81\x10a\x1F\xE8Wa\x1F\xE8aU%V[a !\x83`\x02\x81Q\x81\x10a\x1F\xE8Wa\x1F\xE8aU%V[a 7\x83`\x03\x81Q\x81\x10a\x1F\xE8Wa\x1F\xE8aU%V[a M\x83`\x04\x81Q\x81\x10a\x1F\xE8Wa\x1F\xE8aU%V[a c\x83`\x05\x81Q\x81\x10a\x1F\xE8Wa\x1F\xE8aU%V[a y\x83`\x06\x81Q\x81\x10a\x1F\xE8Wa\x1F\xE8aU%V[a \x8F\x83`\x07\x81Q\x81\x10a\x1F\xE8Wa\x1F\xE8aU%V[`\0a \x9C\x85\x85\x85a\"mV[\x90Pa \xA7\x81a#\xB7V[\x91PP[\x93\x92PPPV[a \xBB\x82a(\x16V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a!\0Wa\x15\xB7\x82\x82a(rV[a\n\xC9a(\xE8V[a!\x10a)\x07V[a\x0BXW`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x10(a!\x08V[\x80Qa!@\x90a)!V[a!M\x81` \x01Qa)!V[a!Z\x81`@\x01Qa)!V[a!g\x81``\x01Qa)!V[a!t\x81`\x80\x01Qa)!V[a!\x81\x81`\xA0\x01Qa)!V[a!\x8E\x81`\xC0\x01Qa)!V[a!\x9B\x81`\xE0\x01Qa)!V[a!\xA9\x81a\x01\0\x01Qa)!V[a!\xB7\x81a\x01 \x01Qa)!V[a!\xC5\x81a\x01@\x01Qa)!V[a!\xD3\x81a\x01`\x01Qa)!V[a!\xE1\x81a\x01\x80\x01Qa)!V[a!\xEF\x81a\x01\xA0\x01Qa\x10\x90V[a!\xFD\x81a\x01\xC0\x01Qa\x10\x90V[a\"\x0B\x81a\x01\xE0\x01Qa\x10\x90V[a\"\x19\x81a\x02\0\x01Qa\x10\x90V[a\"'\x81a\x02 \x01Qa\x10\x90V[a\"5\x81a\x02@\x01Qa\x10\x90V[a\"C\x81a\x02`\x01Qa\x10\x90V[a\"Q\x81a\x02\x80\x01Qa\x10\x90V[a\"_\x81a\x02\xA0\x01Qa\x10\x90V[a\x10[\x81a\x02\xC0\x01Qa\x10\x90V[a\"uaN\xFAV[\x83` \x01Q\x83Q\x14a\"\x9AW`@Qc \xFA\x9D\x89`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\"\xA7\x85\x85\x85a)\xAFV[\x90P`\0a\"\xB8\x86`\0\x01Qa,\xCEV[\x90P`\0a\"\xCB\x82\x84`\xA0\x01Q\x88a0\x99V[`@\x80Q`\x1E\x80\x82Ra\x03\xE0\x82\x01\x90\x92R\x91\x92P`\0\x91\x90` \x82\x01a\x03\xC0\x806\x837PP`@\x80Q`\x1E\x80\x82Ra\x03\xE0\x82\x01\x90\x92R\x92\x93P`\0\x92\x91P` \x82\x01[a#\x16aO4V[\x81R` \x01\x90`\x01\x90\x03\x90\x81a#\x0EW\x90PP\x90P`\0a#;\x8A\x85\x8A\x89\x87\x87a0\xF9V[`\xA0\x87\x01Q``\x87\x01Q\x91\x92P\x90`\0\x80Q` aY}\x839\x81Q\x91R`\0\x81\x83\x85\t`@\x80Qa\x01\0\x81\x01\x82R`\xE0\x9C\x8D\x01Q\x81R` \x81\x01\x96\x90\x96R\x85\x01RPPP``\x81\x01\x91\x90\x91R`\x80\x81\x01\x92\x90\x92R`\xA0\x82\x01Ra\x01`\x86\x01Q`\xC0\x82\x01Ra\x01\x80\x90\x95\x01Q\x92\x85\x01\x92\x90\x92RP\x91\x94\x93PPPPV[`\0`\0\x80Q` aY}\x839\x81Q\x91Ra#\xD0aO4V[a#\xD8aO4V[`@\x80Q`\x02\x80\x82R``\x82\x01\x83R`\0\x92` \x83\x01\x90\x806\x837PP`@\x80Q`\x02\x80\x82R``\x82\x01\x90\x92R\x92\x93P`\0\x92\x91P` \x82\x01[a$\x1AaO4V[\x81R` \x01\x90`\x01\x90\x03\x90\x81a$\x12W\x90PP\x90P`\0`\x01\x90P\x80\x83`\0\x81Q\x81\x10a$IWa$IaU%V[` \x02` \x01\x01\x81\x81RPP\x87`\xC0\x01Q\x82`\0\x81Q\x81\x10a$mWa$maU%V[` \x02` \x01\x01\x81\x90RP\x87`\0\x01Q\x83`\x01\x81Q\x81\x10a$\x90Wa$\x90aU%V[` \x02` \x01\x01\x81\x81RPP\x87`\xE0\x01Q\x82`\x01\x81Q\x81\x10a$\xB4Wa$\xB4aU%V[` \x02` \x01\x01\x81\x90RPa$\xC9\x82\x84a1.V[`\x80\x89\x01QQ\x90\x95P``\x93P\x83\x92P\x90P`\0a$\xE8\x82`\x02aU\x8BV[a$\xF3\x90`\x01aU\x8BV[\x90P\x80`\x01`\x01`@\x1B\x03\x81\x11\x15a%\rWa%\raO\xD0V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a%6W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x93P\x80`\x01`\x01`@\x1B\x03\x81\x11\x15a%QWa%QaO\xD0V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a%\x8AW\x81` \x01[a%waO4V[\x81R` \x01\x90`\x01\x90\x03\x90\x81a%oW\x90P[P\x92PPP`\0\x80`\0[\x89`\x80\x01QQ\x81\x10\x15a&.W\x89`\x80\x01Q\x81\x81Q\x81\x10a%\xB8Wa%\xB8aU%V[` \x02` \x01\x01Q\x85\x83\x81Q\x81\x10a%\xD2Wa%\xD2aU%V[` \x02` \x01\x01\x81\x81RPP\x89`\xA0\x01Q\x81\x81Q\x81\x10a%\xF4Wa%\xF4aU%V[` \x02` \x01\x01Q\x84\x83\x81Q\x81\x10a&\x0EWa&\x0EaU%V[` \x90\x81\x02\x91\x90\x91\x01\x01Ra&$`\x01\x83aU\x8BV[\x91P`\x01\x01a%\x95V[P\x88` \x01Q\x84\x82\x81Q\x81\x10a&FWa&FaU%V[` \x02` \x01\x01\x81\x81RPP\x88`\xC0\x01Q\x83\x82\x81Q\x81\x10a&iWa&iaU%V[` \x90\x81\x02\x91\x90\x91\x01\x01Ra&\x7F`\x01\x82aU\x8BV[\x89Q`@\x8B\x01Q\x91\x92P\x90`\0\x89\x82\x84\t\x90P\x80\x87\x85\x81Q\x81\x10a&\xA5Wa&\xA5aU%V[` \x02` \x01\x01\x81\x81RPPPPP\x88`\xE0\x01Q\x83\x82\x81Q\x81\x10a&\xCBWa&\xCBaU%V[` \x90\x81\x02\x91\x90\x91\x01\x01Ra&\xE1`\x01\x82aU\x8BV[``\x8A\x01Q\x90\x91P\x87\x81\x84\x08\x92PPa&\xF9\x82a2\x1CV[\x84\x82\x81Q\x81\x10a'\x0BWa'\x0BaU%V[` \x02` \x01\x01\x81\x81RPPa'\x1Fa2NV[\x83\x82\x81Q\x81\x10a'1Wa'1aU%V[` \x02` \x01\x01\x81\x90RPa'Na'I\x84\x86a1.V[a2oV[\x94PPPPP`\0`@Q\x80`\x80\x01`@R\x80\x7F\x01\x18\xC4\xD5\xB87\xBC\xC2\xBC\x89\xB5\xB3\x98\xB5\x97N\x9FYD\x07;2\x07\x8B~#\x1F\xEC\x93\x88\x83\xB0\x81R` \x01\x7F&\x0E\x01\xB2Q\xF6\xF1\xC7\xE7\xFFNX\x07\x91\xDE\xE8\xEAQ\xD8z5\x8E\x03\x8BN\xFE0\xFA\xC0\x93\x83\xC1\x81R` \x01\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U\x81R` \x01\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4\x81RP\x90Pa(\x0C\x83\x82\x84a(\x07a2\xDCV[a3\xADV[\x96\x95PPPPPPV[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a(CW\x80`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x04\x01a\x08[\x91\x90aO\xBCV[`\0\x80Q` aY]\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa(\x8F\x91\x90aU\x9EV[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a(\xCAW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a(\xCFV[``\x91P[P\x91P\x91Pa(\xDF\x85\x83\x83a4\x90V[\x95\x94PPPPPV[4\x15a\x0BXW`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a)\x11a\x16\x85V[T`\x01`@\x1B\x90\x04`\xFF\x16\x91\x90PV[`\0`\0\x80Q` aX\xFD\x839\x81Q\x91Ra);\x83a4\xE3V[\x15a)EWPPPV[\x82Q` \x84\x01Q\x82`\x03\x84\x85\x85\x86\t\x85\t\x08\x83\x82\x83\t\x14\x83\x82\x10\x84\x84\x10\x16\x16\x93PPP\x81a\x15\xB7W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x17`$\x82\x01Rv\x10\x9B\x8C\x8DM\x0E\x88\x1A[\x9D\x98[\x1AY\x08\x11\xCCH\x1C\x1B\xDA[\x9D`J\x1B`D\x82\x01R`d\x01a\x08[V[a)\xF7`@Q\x80a\x01\0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`@\x80Q\x80\x82\x01\x90\x91R``\x81R`\0` \x82\x01R`\0\x80Q` aY}\x839\x81Q\x91Ra*&\x82\x87\x87a4\xF2V[\x81Q\x84Qa*3\x90a8\x8BV[a*@\x86` \x01Qa8\x8BV[a*M\x87`@\x01Qa8\x8BV[a*Z\x88``\x01Qa8\x8BV[a*g\x89`\x80\x01Qa8\x8BV[`@Q` \x01a*|\x96\x95\x94\x93\x92\x91\x90aU\xBAV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra*\x97\x82a9\0V[Pa*\xA1\x82a9\0V[``\x84\x01Ra*\xAF\x82a9\0V[`\x80\x84\x01R\x81Q`\xA0\x85\x01Qa*\xC4\x90a8\x8BV[`@Q` \x01a*\xD5\x92\x91\x90aV9V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra*\xF0\x82a9\0V[\x83R\x81Q`\xC0\x85\x01Qa+\x02\x90a8\x8BV[a+\x0F\x86`\xE0\x01Qa8\x8BV[a+\x1D\x87a\x01\0\x01Qa8\x8BV[a++\x88a\x01 \x01Qa8\x8BV[a+9\x89a\x01@\x01Qa8\x8BV[`@Q` \x01a+N\x96\x95\x94\x93\x92\x91\x90aU\xBAV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra+i\x82a9\0V[`\xA0\x84\x01R\x81Qa\x01\xA0\x85\x01Qa+\x7F\x90a9bV[a+\x8D\x86a\x01\xC0\x01Qa9bV[a+\x9B\x87a\x01\xE0\x01Qa9bV[a+\xA9\x88a\x02\0\x01Qa9bV[a+\xB7\x89a\x02 \x01Qa9bV[`@Q` \x01a+\xCC\x96\x95\x94\x93\x92\x91\x90aVhV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x83Ra\x02@\x85\x01Qa+\xEE\x90a9bV[a+\xFC\x86a\x02`\x01Qa9bV[a,\n\x87a\x02\x80\x01Qa9bV[a,\x18\x88a\x02\xA0\x01Qa9bV[a,&\x89a\x02\xC0\x01Qa9bV[`@Q` \x01a,;\x96\x95\x94\x93\x92\x91\x90aVhV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra,V\x82a9\0V[`\xC0\x84\x01R\x81Qa\x01`\x85\x01Qa,l\x90a8\x8BV[a,z\x86a\x01\x80\x01Qa8\x8BV[`@Q` \x01a,\x8C\x93\x92\x91\x90aV\xA4V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra,\xA7\x82a9\0V[`\xE0\x84\x01R\x82Q\x81\x81\x80\t\x82\x82\x82\t` \x86\x01\x91\x90\x91R`@\x85\x01RP\x91\x95\x94PPPPPV[a-\0`@Q\x80`\xA0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[\x81b\x01\0\0\x03a-\x94WP`@\x80Q`\xA0\x81\x01\x82R`\x10\x81R` \x81\x01\x92\x90\x92R\x7F0d\x1E\x0E\x92\xBE\xBE\xF8\x18&\x8Df;\xCA\xD6\xDB\xCF\xD6\xC0\x14\x91p\xF6\xD7\xD3P\xB1\xB1\xFAl\x10\x01\x90\x82\x01R~\xEE\xB2\xCBY\x81\xEDEd\x9A\xBE\xBD\xE0\x81\xDC\xFF\x16\xC8`\x1D\xE44~}\xD1b\x8B\xA2\xDA\xACC\xB7``\x82\x01R\x7F\x0B]V\xB7\x7F\xE7\x04\xE8\xE9#8\xC0\x08/7\xE0\x91\x12d\x14\xC80\xE4\xC6\x92-Z\xC8\x02\xD8B\xD4`\x80\x82\x01R\x90V[\x81b\x02\0\0\x03a.)WP`@\x80Q`\xA0\x81\x01\x82R`\x11\x81R` \x81\x01\x92\x90\x92R\x7F0d6@\xB9\xF8/\x90\xE8;i\x8E^\xA6\x17\x9C|\x05T.\x85\x953\xB4\x8B\x99S\xA2\xF56\x08\x01\x90\x82\x01R\x7F\x1B\xF8-\xEB\xA7\xD7I\x02\xC3p\x8C\xC6\xE7\x0Ea\xF3\x05\x12\xEC\xA9VU!\x0E'nXX\xCE\x8FX\xE5``\x82\x01R\x7F$L\xF0\x10\xC4<\xA8r7\xD8\xB0\x0B\xF9\xDDP\xC4\xC0\x1C\x7F\x08k\xD4\xE8\xC9 \xE7RQ\xD9o\r\"`\x80\x82\x01R\x90V[\x81b\x04\0\0\x03a.\xBEWP`@\x80Q`\xA0\x81\x01\x82R`\x12\x81R` \x81\x01\x92\x90\x92R\x7F0dBY\xCD\x94\xE7\xDDPE\xD7\xA2p\x13\xB7\xFC\xD2\x1C\x9E;\x7F\xA7R\"\xE7\xBD\xA4\x9Br\x9B\x04\x01\x90\x82\x01R\x7F\x19\xDD\xBC\xAF:\x8DF\xC1\\\x01v\xFB\xB5\xB9^M\xC5p\x88\xFF\x13\xF4\xD1\xBD\x84\xC6\xBF\xA5}\xCD\xC0\xE0``\x82\x01R\x7F\x03hS\xF0\x83x\x0E\x87\xF8\xD7\xC7\x1D\x11\x11\x19\xC5}\xBE\x11\x8C\"\xD5\xADpz\x821tf\xC5\x17L`\x80\x82\x01R\x90V[\x81b\x08\0\0\x03a/SWP`@\x80Q`\xA0\x81\x01\x82R`\x13\x81R` \x81\x01\x92\x90\x92R\x7F0dHfWcD\x03\x84K\x0E\xACx\xCA\x88,\xFD(CA\xFC\xB0aZ\x15\xCF\xCD\x17\xB1M\x82\x01\x90\x82\x01R\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD``\x82\x01R\x7F\x06\xE4\x02\xC0\xA3\x14\xFBg\xA1\\\xF8\x06fJ\xE1\xB7\"\xDB\xC0\xEF\xE6nl\x81\xD9\x8F\x99$\xCASS!`\x80\x82\x01R\x90V[\x81b\x10\0\0\x03a/\xE8WP`@\x80Q`\xA0\x81\x01\x82R`\x14\x81R` \x81\x01\x92\x90\x92R\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x90\x82\x01R\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW``\x82\x01R\x7F\x10\x0C3-!\0\x89_\xABds\xBC,Q\xBF\xCAR\x1FE\xCB;\xAC\xA6&\x08R\xA8\xFD\xE2l\x91\xF3`\x80\x82\x01R\x90V[\x81` \x03a0{WP`@\x80Q`\xA0\x81\x01\x82R`\x05\x81R` \x81\x01\x92\x90\x92R\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x90\x82\x01R\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0``\x82\x01R\x7F'$q6\x03\xBF\xBDy\n\xEA\xF3\xE7\xDF%\xD8\xE7\xEF\x8F1\x134\x90[M\x8C\x99\x98\x0C\xF2\x10\x97\x9D`\x80\x82\x01R\x90V[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x91\x90PV[a0\xBD`@Q\x80``\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[a0\xC7\x84\x84a:\x99V[\x80\x82Ra0\xD7\x90\x85\x90\x85\x90a:\xEDV[` \x82\x01R\x80Qa0\xED\x90\x85\x90\x84\x90\x86\x90a;aV[`@\x82\x01R\x93\x92PPPV[`\0\x80a1\x07\x85\x87\x89a=\x15V[\x90Pa1\x17\x88\x86\x89\x89\x88\x88a>\x05V[a1\"\x81\x87\x86aA\x11V[\x98\x97PPPPPPPPV[a16aO4V[\x82Q\x82Q\x14a1\x87W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FMSM error: length does not match`D\x82\x01R`d\x01a\x08[V[a1\xC5\x83`\0\x81Q\x81\x10a1\x9DWa1\x9DaU%V[` \x02` \x01\x01Q\x83`\0\x81Q\x81\x10a1\xB8Wa1\xB8aU%V[` \x02` \x01\x01QaAaV[\x90P`\x01[\x82Q\x81\x10\x15a2\x15Wa2\x0B\x82a2\x06\x86\x84\x81Q\x81\x10a1\xECWa1\xECaU%V[` \x02` \x01\x01Q\x86\x85\x81Q\x81\x10a1\xB8Wa1\xB8aU%V[aA\xF5V[\x91P`\x01\x01a1\xCAV[P\x92\x91PPV[`\0a26`\0\x80Q` aY}\x839\x81Q\x91R\x83aV\xFDV[a\x10\x1A\x90`\0\x80Q` aY}\x839\x81Q\x91RaU\x12V[a2VaO4V[P`@\x80Q\x80\x82\x01\x90\x91R`\x01\x81R`\x02` \x82\x01R\x90V[a2waO4V[a2\x80\x82a4\xE3V[\x15a2\x89WP\x90V[`@Q\x80`@\x01`@R\x80\x83`\0\x01Q\x81R` \x01`\0\x80Q` aX\xFD\x839\x81Q\x91R\x84` \x01Qa2\xBC\x91\x90aV\xFDV[a2\xD4\x90`\0\x80Q` aX\xFD\x839\x81Q\x91RaU\x12V[\x90R\x92\x91PPV[a3\x07`@Q\x80`\x80\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`@Q\x80`\x80\x01`@R\x80\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x81R` \x01\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2\x81R` \x01\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA\x81R` \x01\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[\x81RP\x90P\x90V[`\0\x80`\0`@Q\x87Q\x81R` \x88\x01Q` \x82\x01R` \x87\x01Q`@\x82\x01R\x86Q``\x82\x01R``\x87\x01Q`\x80\x82\x01R`@\x87\x01Q`\xA0\x82\x01R\x85Q`\xC0\x82\x01R` \x86\x01Q`\xE0\x82\x01R` \x85\x01Qa\x01\0\x82\x01R\x84Qa\x01 \x82\x01R``\x85\x01Qa\x01@\x82\x01R`@\x85\x01Qa\x01`\x82\x01R` `\0a\x01\x80\x83`\x08Z\xFA\x91PP`\0Q\x91P\x80a4\x82W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1C`$\x82\x01R{Bn254: Pairing check failed!` \x1B`D\x82\x01R`d\x01a\x08[V[P\x15\x15\x90P[\x94\x93PPPPV[``\x82a4\xA5Wa4\xA0\x82aB\x90V[a \xABV[\x81Q\x15\x80\x15a4\xBCWP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a4\xDCW\x83`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x04\x01a\x08[\x91\x90aO\xBCV[P\x80a \xABV[\x80Q` \x90\x91\x01Q\x15\x90\x15\x16\x90V[\x82Q`\xFE\x90a5-a5\x03\x83a9bV[`@Q` \x01a5\x15\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R`\0`\x04aB\xB9V[a5ga5=\x86`\0\x01Qa9bV[`@Q` \x01a5O\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R`\0`\x08aB\xB9V[a5wa5=\x87` \x01Qa9bV[`@Q` \x01a5\x8A\x94\x93\x92\x91\x90aW\x1FV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x85Ra5\xA7`\x01a9bV[a5\xBE`\0\x80Q` aZ\x1D\x839\x81Q\x91Ra9bV[a5\xD5`\0\x80Q` aY\xBD\x839\x81Q\x91Ra9bV[a5\xEC`\0\x80Q` aY\xFD\x839\x81Q\x91Ra9bV[a6\x03`\0\x80Q` aY=\x839\x81Q\x91Ra9bV[`@Q` \x01a6\x18\x96\x95\x94\x93\x92\x91\x90aVhV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x85R`\xE0\x84\x01Qa69\x90a8\x8BV[a6G\x85a\x01\0\x01Qa8\x8BV[a6U\x86a\x01 \x01Qa8\x8BV[a6c\x87a\x01@\x01Qa8\x8BV[a6q\x88a\x01`\x01Qa8\x8BV[a6\x7F\x89a\x01\x80\x01Qa8\x8BV[a6\x8D\x8Aa\x01\xE0\x01Qa8\x8BV[`@Q` \x01a6\xA4\x98\x97\x96\x95\x94\x93\x92\x91\x90aWvV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x85Ra\x02\0\x84\x01Qa6\xC6\x90a8\x8BV[a6\xD4\x85a\x02 \x01Qa8\x8BV[a6\xE2\x86a\x02@\x01Qa8\x8BV[a6\xF0\x87a\x01\xA0\x01Qa8\x8BV[a6\xFE\x88a\x01\xC0\x01Qa8\x8BV[a7\x0C\x89a\x02`\x01Qa8\x8BV[`@Q` \x01a7\"\x97\x96\x95\x94\x93\x92\x91\x90aX\x1BV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x81R\x81\x86R\x84\x01Qa7A\x90a8\x8BV[a7N\x85``\x01Qa8\x8BV[a7[\x86`\x80\x01Qa8\x8BV[a7h\x87`\xA0\x01Qa8\x8BV[a7u\x88`\xC0\x01Qa8\x8BV[`@Q` \x01a7\x8A\x96\x95\x94\x93\x92\x91\x90aU\xBAV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x85R\x82Qa7\xC1\x90\x84\x90`\0\x90a7\xB4Wa7\xB4aU%V[` \x02` \x01\x01Qa9bV[a7\xD7\x84`\x01\x81Q\x81\x10a7\xB4Wa7\xB4aU%V[a7\xED\x85`\x02\x81Q\x81\x10a7\xB4Wa7\xB4aU%V[a8\x03\x86`\x03\x81Q\x81\x10a7\xB4Wa7\xB4aU%V[a8\x19\x87`\x04\x81Q\x81\x10a7\xB4Wa7\xB4aU%V[a8/\x88`\x05\x81Q\x81\x10a7\xB4Wa7\xB4aU%V[a8E\x89`\x06\x81Q\x81\x10a7\xB4Wa7\xB4aU%V[a8[\x8A`\x07\x81Q\x81\x10a7\xB4Wa7\xB4aU%V[`@Q` \x01a8s\x99\x98\x97\x96\x95\x94\x93\x92\x91\x90aX\xADV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x90\x93RPPPV[```\0a8\x98\x83a4\xE3V[\x15a8\xA4W`\x01`\xFE\x1B\x17[` \x83\x01Q`\0\x80Q` aX\xFD\x839\x81Q\x91R`\x01\x91\x90\x91\x1B\x10a8\xCAWP`\x01`\xFF\x1B[\x82Qa8\xD7\x90\x82\x17a9bV[`@Q` \x01a8\xE9\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91PP\x91\x90PV[` \x80\x82\x01Q\x82Q\x80Q`@Q\x83\x81R`\0\x94\x85\x94\x93\x92\x91\x90\x81\x01\x85[\x83\x81\x10\x15a97W` \x81\x86\x01\x81\x01Q\x83\x83\x01R\x01a9\x1DV[PP` \x91\x82\x01\x90 \x90\x86\x01\x81\x90R\x92P`\0a(\x0C`\0\x80Q` aY}\x839\x81Q\x91R\x85aV\xFDV[`\0\x81\x90P`\x08\x81~\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\x16\x90\x1B`\x08\x82\x7F\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\x16\x90\x1C\x17\x90P`\x10\x81}\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\x16\x90\x1B`\x10\x82}\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\x19\x16\x90\x1C\x17\x90P` \x81{\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\x16\x90\x1B` \x82{\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\x19\x16\x90\x1C\x17\x90P`@\x81`\x01`\x01`@\x1B\x03`\x01`\x80\x1B\x03`\x01`\xC0\x1B\x03\x16\x90\x1B`@\x82`\x01`\x01`@\x1B\x03`\x01`\x80\x1B\x03`\x01`\xC0\x1B\x03\x19\x16\x90\x1C\x17\x90P`\x80\x81\x90\x1B`\x80\x82\x90\x1C\x17\x90P\x91\x90PV[\x81Q`\0\x90`\0\x80Q` aY}\x839\x81Q\x91R\x90\x83\x80\x15a:\xDDW\x84\x93P`\0[\x82\x81\x10\x15a:\xD1W\x83\x85\x86\t\x94P`\x01\x01a:\xBBV[P`\x01\x84\x03\x93Pa:\xE4V[`\x01\x83\x03\x93P[PPP\x92\x91PPV[`\0\x82`\x01\x03a:\xFFWP`\x01a \xABV[\x81`\0\x03a;\x0FWP`\0a \xABV[`@\x84\x01Q`\0\x80Q` aY}\x839\x81Q\x91R\x90`\0\x90\x82\x81\x86\t\x90P\x85\x80\x15a;?W`\x01\x87\x03\x92Pa;FV[`\x01\x84\x03\x92P[Pa;P\x82aC\xC6V[\x91P\x82\x82\x82\t\x97\x96PPPPPPPV[\x82Q`\0\x90`\0\x80Q` aY}\x839\x81Q\x91R\x90\x83\x83\x03a;\xE2W`\x01`\0[\x82\x81\x10\x15a;\xD5W\x81\x87\x03a;\xB6W\x87\x81\x81Q\x81\x10a;\xA3Wa;\xA3aU%V[` \x02` \x01\x01Q\x94PPPPPa4\x88V[\x83\x80a;\xC4Wa;\xC4aV\xE7V[\x89``\x01Q\x83\t\x91P`\x01\x01a;\x82V[P`\0\x93PPPPa4\x88V[`\0\x80`\0\x80\x8A`@\x01Q\x90P`\0\x80a;\xFC\x8D\x88aDlV[\x90P`\0\x87`\x01`\x01`@\x1B\x03\x81\x11\x15a<\x18Wa<\x18aO\xD0V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x13\x86\x86\x86\x86\x85\x87aE1V[`\xC0\x85\x01Q\x82Q`\0\x80Q` aY}\x839\x81Q\x91R\x91\x90\x81\x90\x81\x90\x86\x90`\x14\x90\x81\x10a>BWa>BaU%V[` \x02` \x01\x01\x81\x81RPP\x85`\0\x01Q\x84`\x14\x81Q\x81\x10a>fWa>faU%V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x15\x81Q\x81\x10a>\x8BWa>\x8BaU%V[` \x02` \x01\x01\x81\x81RPP\x85` \x01Q\x84`\x15\x81Q\x81\x10a>\xAFWa>\xAFaU%V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x16\x81Q\x81\x10a>\xD4Wa>\xD4aU%V[` \x02` \x01\x01\x81\x81RPP\x85`@\x01Q\x84`\x16\x81Q\x81\x10a>\xF8Wa>\xF8aU%V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x17\x81Q\x81\x10a?\x1DWa?\x1DaU%V[` \x02` \x01\x01\x81\x81RPP\x85``\x01Q\x84`\x17\x81Q\x81\x10a?AWa?AaU%V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x18\x81Q\x81\x10a?fWa?faU%V[` \x02` \x01\x01\x81\x81RPP\x85`\x80\x01Q\x84`\x18\x81Q\x81\x10a?\x8AWa?\x8AaU%V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x19\x81Q\x81\x10a?\xAFWa?\xAFaU%V[` \x02` \x01\x01\x81\x81RPP\x88`@\x01Q\x84`\x19\x81Q\x81\x10a?\xD3Wa?\xD3aU%V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1A\x81Q\x81\x10a?\xF8Wa?\xF8aU%V[` \x02` \x01\x01\x81\x81RPP\x88``\x01Q\x84`\x1A\x81Q\x81\x10a@\x1CWa@\x1CaU%V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1B\x81Q\x81\x10a@AWa@AaU%V[` \x02` \x01\x01\x81\x81RPP\x88`\x80\x01Q\x84`\x1B\x81Q\x81\x10a@eWa@eaU%V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1C\x81Q\x81\x10a@\x8AWa@\x8AaU%V[` \x02` \x01\x01\x81\x81RPP\x88`\xA0\x01Q\x84`\x1C\x81Q\x81\x10a@\xAEWa@\xAEaU%V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x87`\xE0\x01Q\x85`\x1D\x81Q\x81\x10a@\xD7Wa@\xD7aU%V[` \x02` \x01\x01\x81\x81RPP\x85`\xA0\x01Q\x84`\x1D\x81Q\x81\x10a@\xFBWa@\xFBaU%V[` \x02` \x01\x01\x81\x90RPPPPPPPPPPV[`\0\x80Q` aY}\x839\x81Q\x91R\x83\x81\x03\x90`\0[`\n\x81\x10\x15aAXW` `\x15\x82\x01\x02\x84\x01Q` \x82\x02a\x01\xA0\x01\x86\x01Q\x83\x84\x82\x84\t\x86\x08\x94PPP`\x01\x01aA'V[PP\x93\x92PPPV[aAiaO4V[aAqaONV[\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R`@\x81\x01\x83\x90R`\0``\x83`\x80\x84`\x07a\x07\xD0Z\x03\xFA\x90P\x80\x80aA\xA3W`\0\x80\xFD[P\x80aA\xEDW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x19`$\x82\x01RxBn254: scalar mul failed!`8\x1B`D\x82\x01R`d\x01a\x08[V[PP\x92\x91PPV[aA\xFDaO4V[aB\x05aOlV[\x83Q\x81R` \x80\x85\x01Q\x81\x83\x01R\x83Q`@\x83\x01R\x83\x01Q``\x80\x83\x01\x91\x90\x91R`\0\x90\x83`\xC0\x84`\x06a\x07\xD0Z\x03\xFA\x90P\x80\x80aBBW`\0\x80\xFD[P\x80aA\xEDW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: group addition failed!\0\0\0`D\x82\x01R`d\x01a\x08[V[\x80Q\x15aB\xA0W\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x81aB\xC7\x81`\x1FaU\x8BV[\x10\x15aC\x06W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0E`$\x82\x01Rmslice_overflow`\x90\x1B`D\x82\x01R`d\x01a\x08[V[aC\x10\x82\x84aU\x8BV[\x84Q\x10\x15aCTW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x11`$\x82\x01Rpslice_outOfBounds`x\x1B`D\x82\x01R`d\x01a\x08[V[``\x82\x15\x80\x15aCsW`@Q\x91P`\0\x82R` \x82\x01`@RaC\xBDV[`@Q\x91P`\x1F\x84\x16\x80\x15` \x02\x81\x84\x01\x01\x85\x81\x01\x87\x83\x15` \x02\x84\x8B\x01\x01\x01[\x81\x83\x10\x15aC\xACW\x80Q\x83R` \x92\x83\x01\x92\x01aC\x94V[PP\x85\x84R`\x1F\x01`\x1F\x19\x16`@RP[P\x94\x93PPPPV[`\0\x80`\0`\0\x80Q` aY}\x839\x81Q\x91R\x90P`@Q` \x81R` \x80\x82\x01R` `@\x82\x01R\x84``\x82\x01R`\x02\x82\x03`\x80\x82\x01R\x81`\xA0\x82\x01R` `\0`\xC0\x83`\x05Z\xFA\x92PP`\0Q\x92P\x81aDeW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: pow precompile failed!\0\0\0`D\x82\x01R`d\x01a\x08[V[PP\x91\x90PV[``\x82` \x01Q\x82\x11\x15aD\x93W`@Qc\x8C^\x11\xF1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x83\x01Q`\x01`\0\x80Q` aY}\x839\x81Q\x91R\x84`\x01`\x01`@\x1B\x03\x81\x11\x15aD\xC1WaD\xC1aO\xD0V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15aD\xEAW\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x93P\x84\x15\x19\x15a:\xE4W` \x84\x01\x85` \x02\x81\x01`\x01\x82R` \x82\x01\x91P[\x80\x82\x10\x15aE&W\x82\x85\x85\t\x93P\x83\x82R` \x82\x01\x91PaE\nV[PPPPP\x92\x91PPV[`\0\x80`\0\x80`\0\x80`\0\x80Q` aY}\x839\x81Q\x91R\x90P\x80` \x8B\x01Q` \x8D\x01Q\t\x95P\x8AQ\x93P\x80`\xA0\x8C\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xA0\x8A\x01Q\x84\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80`\0\x80Q` aZ\x1D\x839\x81Q\x91R\x84\t\x91P\x80a\x01\xC0\x8A\x01Q\x83\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80`\0\x80Q` aY\xBD\x839\x81Q\x91R\x84\t\x91P\x80a\x01\xE0\x8A\x01Q\x83\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80`\0\x80Q` aY\xFD\x839\x81Q\x91R\x84\t\x91P\x80a\x02\0\x8A\x01Q\x83\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80`\0\x80Q` aY=\x839\x81Q\x91R\x84\t\x91P\x80a\x02 \x8A\x01Q\x83\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80\x84\x87\x08\x95P\x88`\xA0\x01Q\x88`\0\x81Q\x81\x10aF`WaF`aU%V[` \x02` \x01\x01\x81\x90RP\x85\x87`\0\x81Q\x81\x10aF\x7FWaF\x7FaU%V[` \x02` \x01\x01\x81\x81RPP\x80``\x8C\x01Q\x8CQ\t\x94P\x80a\x02\xC0\x8A\x01Q\x86\t\x94P\x80a\x02@\x8A\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xA0\x8A\x01Q\x84\x08\x92P\x80`\x80\x8C\x01Q\x84\x08\x92P\x80\x83\x86\t\x94P\x80a\x02`\x8A\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xC0\x8A\x01Q\x84\x08\x92P\x80`\x80\x8C\x01Q\x84\x08\x92P\x80\x83\x86\t\x94P\x80a\x02\x80\x8A\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xE0\x8A\x01Q\x84\x08\x92P\x80`\x80\x8C\x01Q\x84\x08\x92P\x80\x83\x86\t\x94P\x80a\x02\xA0\x8A\x01Q``\x8D\x01Q\t\x92P\x80a\x02\0\x8A\x01Q\x84\x08\x92P\x80`\x80\x8C\x01Q\x84\x08\x92P\x80\x83\x86\t\x94P\x8B`\xC0\x01Q\x88`\x01\x81Q\x81\x10aGaWaGaaU%V[` \x90\x81\x02\x91\x90\x91\x01\x01RaGv\x85\x82aU\x12V[\x87`\x01\x81Q\x81\x10aG\x89WaG\x89aU%V[` \x02` \x01\x01\x81\x81RPP\x88a\x01\xA0\x01Q\x87`\x02\x81Q\x81\x10aG\xAEWaG\xAEaU%V[` \x02` \x01\x01\x81\x81RPP\x88a\x01\xC0\x01Q\x87`\x03\x81Q\x81\x10aG\xD3WaG\xD3aU%V[` \x02` \x01\x01\x81\x81RPP\x88a\x01\xE0\x01Q\x87`\x04\x81Q\x81\x10aG\xF8WaG\xF8aU%V[` \x02` \x01\x01\x81\x81RPP\x88a\x02\0\x01Q\x87`\x05\x81Q\x81\x10aH\x1DWaH\x1DaU%V[` \x02` \x01\x01\x81\x81RPP\x8B`\xE0\x01Q\x88`\x02\x81Q\x81\x10aHAWaHAaU%V[` \x02` \x01\x01\x81\x90RP\x8Ba\x01\0\x01Q\x88`\x03\x81Q\x81\x10aHeWaHeaU%V[` \x02` \x01\x01\x81\x90RP\x8Ba\x01 \x01Q\x88`\x04\x81Q\x81\x10aH\x89WaH\x89aU%V[` \x02` \x01\x01\x81\x90RP\x8Ba\x01@\x01Q\x88`\x05\x81Q\x81\x10aH\xADWaH\xADaU%V[` \x02` \x01\x01\x81\x90RP\x80a\x01\xC0\x8A\x01Qa\x01\xA0\x8B\x01Q\t\x92P\x82\x87`\x06\x81Q\x81\x10aH\xDCWaH\xDCaU%V[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01`\x01Q\x88`\x06\x81Q\x81\x10aI\x01WaI\x01aU%V[` \x02` \x01\x01\x81\x90RP\x80a\x02\0\x8A\x01Qa\x01\xE0\x8B\x01Q\t\x92P\x82\x87`\x07\x81Q\x81\x10aI0WaI0aU%V[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01\x80\x01Q\x88`\x07\x81Q\x81\x10aIUWaIUaU%V[` \x02` \x01\x01\x81\x90RPa\x01\xA0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\x08\x81Q\x81\x10aI\x8EWaI\x8EaU%V[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01\xE0\x01Q\x88`\x08\x81Q\x81\x10aI\xB3WaI\xB3aU%V[` \x02` \x01\x01\x81\x90RPa\x01\xC0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\t\x81Q\x81\x10aI\xECWaI\xECaU%V[` \x02` \x01\x01\x81\x81RPP\x8Ba\x02\0\x01Q\x88`\t\x81Q\x81\x10aJ\x11WaJ\x11aU%V[` \x02` \x01\x01\x81\x90RPa\x01\xE0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\n\x81Q\x81\x10aJJWaJJaU%V[` \x02` \x01\x01\x81\x81RPP\x8Ba\x02 \x01Q\x88`\n\x81Q\x81\x10aJoWaJoaU%V[` \x02` \x01\x01\x81\x90RPa\x02\0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\x0B\x81Q\x81\x10aJ\xA8WaJ\xA8aU%V[` \x02` \x01\x01\x81\x81RPP\x8Ba\x02@\x01Q\x88`\x0B\x81Q\x81\x10aJ\xCDWaJ\xCDaU%V[` \x02` \x01\x01\x81\x90RP\x88a\x02 \x01Q\x81aJ\xE9\x91\x90aU\x12V[\x87`\x0C\x81Q\x81\x10aJ\xFCWaJ\xFCaU%V[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01\xA0\x01Q\x88`\x0C\x81Q\x81\x10aK!WaK!aU%V[` \x02` \x01\x01\x81\x90RP`\x01\x87`\r\x81Q\x81\x10aKAWaKAaU%V[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01\xC0\x01Q\x88`\r\x81Q\x81\x10aKfWaKfaU%V[` \x02` \x01\x01\x81\x90RP\x80a\x01\xC0\x8A\x01Qa\x01\xA0\x8B\x01Q\t\x92P\x80a\x01\xE0\x8A\x01Q\x84\t\x92P\x80a\x02\0\x8A\x01Q\x84\t\x92P\x80a\x02 \x8A\x01Q\x84\t\x92P\x82\x87`\x0E\x81Q\x81\x10aK\xB6WaK\xB6aU%V[` \x02` \x01\x01\x81\x81RPP\x8Ba\x02`\x01Q\x88`\x0E\x81Q\x81\x10aK\xDBWaK\xDBaU%V[` \x90\x81\x02\x91\x90\x91\x01\x01R\x89QaK\xF2\x90\x82aU\x12V[\x87`\x0F\x81Q\x81\x10aL\x05WaL\x05aU%V[` \x02` \x01\x01\x81\x81RPP\x88`\xC0\x01Q\x88`\x0F\x81Q\x81\x10aL)WaL)aU%V[` \x02` \x01\x01\x81\x90RP\x80`\x01\x8BQ\x08`\xA0\x8C\x01Q\x90\x93P\x81\x90\x80\t\x91P\x80\x82\x84\t\x92P\x80\x83` `\x10\x02\x89\x01Q\t\x91P\x81\x87`\x10\x81Q\x81\x10aLoWaLoaU%V[` \x02` \x01\x01\x81\x81RPP\x88`\xE0\x01Q\x88`\x10\x81Q\x81\x10aL\x93WaL\x93aU%V[` \x02` \x01\x01\x81\x90RP\x80\x83` `\x11\x02\x89\x01Q\t\x91P\x81\x87`\x11\x81Q\x81\x10aL\xBFWaL\xBFaU%V[` \x02` \x01\x01\x81\x81RPP\x88a\x01\0\x01Q\x88`\x11\x81Q\x81\x10aL\xE4WaL\xE4aU%V[` \x02` \x01\x01\x81\x90RP\x80\x83` `\x12\x02\x89\x01Q\t\x91P\x81\x87`\x12\x81Q\x81\x10aM\x10WaM\x10aU%V[` \x02` \x01\x01\x81\x81RPP\x88a\x01 \x01Q\x88`\x12\x81Q\x81\x10aM5WaM5aU%V[` \x02` \x01\x01\x81\x90RP\x80\x83` `\x13\x02\x89\x01Q\t\x91P\x81\x87`\x13\x81Q\x81\x10aMaWaMaaU%V[` \x02` \x01\x01\x81\x81RPP\x88a\x01@\x01Q\x88`\x13\x81Q\x81\x10aM\x86WaM\x86aU%V[` \x02` \x01\x01\x81\x90RPPPPPPPPPPPPPV[`@Q\x80a\x01\0\x01`@R\x80`\0`\x01`\x01`@\x1B\x03\x16\x81R` \x01`\0`\x01`\x01`@\x1B\x03\x16\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`@Q\x80a\x02\x80\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01aN\x18aO4V[\x81R` \x01aN%aO4V[\x81R` \x01aN2aO4V[\x81R` \x01aN?aO4V[\x81R` \x01aNLaO4V[\x81R` \x01aNYaO4V[\x81R` \x01aNfaO4V[\x81R` \x01aNsaO4V[\x81R` \x01aN\x80aO4V[\x81R` \x01aN\x8DaO4V[\x81R` \x01aN\x9AaO4V[\x81R` \x01aN\xA7aO4V[\x81R` \x01aN\xB4aO4V[\x81R` \x01aN\xC1aO4V[\x81R` \x01aN\xCEaO4V[\x81R` \x01aN\xDBaO4V[\x81R` \x01aN\xE8aO4V[\x81R` \x01aN\xF5aO4V[\x90R\x90V[`@Q\x80a\x01\0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01``\x81R` \x01``\x81R` \x01aN\xE8[`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[`@Q\x80``\x01`@R\x80`\x03\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[`@Q\x80`\x80\x01`@R\x80`\x04\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a0\x94W`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15aO\xB3W`\0\x80\xFD[a \xAB\x82aO\x8AV[`\x01`\x01`\xA0\x1B\x03\x91\x90\x91\x16\x81R` \x01\x90V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Qa\x02\xE0\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15aP\tWaP\taO\xD0V[`@R\x90V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15aP7WaP7aO\xD0V[`@R\x91\x90PV[\x805`\x01`\x01`@\x1B\x03\x81\x16\x81\x14a0\x94W`\0\x80\xFD[`\0a\x01\0\x80\x83\x85\x03\x12\x15aPjW`\0\x80\xFD[`@Q\x90\x81\x01\x90`\x01`\x01`@\x1B\x03\x82\x11\x81\x83\x10\x17\x15aP\x8CWaP\x8CaO\xD0V[\x81`@R\x80\x92PaP\x9C\x84aP?V[\x81RaP\xAA` \x85\x01aP?V[` \x82\x01R`@\x84\x015`@\x82\x01R``\x84\x015``\x82\x01R`\x80\x84\x015`\x80\x82\x01R`\xA0\x84\x015`\xA0\x82\x01R`\xC0\x84\x015`\xC0\x82\x01R`\xE0\x84\x015`\xE0\x82\x01RPP\x92\x91PPV[`\0`@\x82\x84\x03\x12\x15aQ\x05W`\0\x80\xFD[`@\x80Q\x90\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15aQ'WaQ'aO\xD0V[`@R\x825\x81R` \x92\x83\x015\x92\x81\x01\x92\x90\x92RP\x91\x90PV[`\0\x80\x82\x84\x03a\x05\x80\x81\x12\x15aQVW`\0\x80\xFD[aQ`\x85\x85aPVV[\x92Pa\x01\0a\x04\x80\x80`\xFF\x19\x84\x01\x12\x15aQyW`\0\x80\xFD[aQ\x81aO\xE6V[\x92PaQ\x8F\x87\x83\x88\x01aP\xF3V[\x83Ra\x01@aQ\xA0\x88\x82\x89\x01aP\xF3V[` \x85\x01Ra\x01\x80aQ\xB4\x89\x82\x8A\x01aP\xF3V[`@\x86\x01Ra\x01\xC0aQ\xC8\x8A\x82\x8B\x01aP\xF3V[``\x87\x01Ra\x02\0aQ\xDC\x8B\x82\x8C\x01aP\xF3V[`\x80\x88\x01Ra\x02@aQ\xF0\x8C\x82\x8D\x01aP\xF3V[`\xA0\x89\x01Ra\x02\x80aR\x04\x8D\x82\x8E\x01aP\xF3V[`\xC0\x8A\x01Ra\x02\xC0aR\x18\x8E\x82\x8F\x01aP\xF3V[`\xE0\x8B\x01RaR+\x8Ea\x03\0\x8F\x01aP\xF3V[\x89\x8B\x01RaR=\x8Ea\x03@\x8F\x01aP\xF3V[a\x01 \x8B\x01RaRQ\x8Ea\x03\x80\x8F\x01aP\xF3V[\x87\x8B\x01RaRc\x8Ea\x03\xC0\x8F\x01aP\xF3V[a\x01`\x8B\x01RaRw\x8Ea\x04\0\x8F\x01aP\xF3V[\x86\x8B\x01Ra\x04@\x8D\x015a\x01\xA0\x8B\x01Ra\x04`\x8D\x015\x85\x8B\x01R\x87\x8D\x015a\x01\xE0\x8B\x01Ra\x04\xA0\x8D\x015\x84\x8B\x01Ra\x04\xC0\x8D\x015a\x02 \x8B\x01Ra\x04\xE0\x8D\x015\x83\x8B\x01Ra\x05\0\x8D\x015a\x02`\x8B\x01Ra\x05 \x8D\x015\x82\x8B\x01Ra\x05@\x8D\x015a\x02\xA0\x8B\x01Ra\x05`\x8D\x015\x81\x8B\x01RPPPPPPPPP\x80\x91PP\x92P\x92\x90PV[`\0\x80`@\x83\x85\x03\x12\x15aS\x0EW`\0\x80\xFD[aS\x17\x83aO\x8AV[\x91P` \x83\x81\x015`\x01`\x01`@\x1B\x03\x80\x82\x11\x15aS4W`\0\x80\xFD[\x81\x86\x01\x91P\x86`\x1F\x83\x01\x12aSHW`\0\x80\xFD[\x815\x81\x81\x11\x15aSZWaSZaO\xD0V[aSl`\x1F\x82\x01`\x1F\x19\x16\x85\x01aP\x0FV[\x91P\x80\x82R\x87\x84\x82\x85\x01\x01\x11\x15aS\x82W`\0\x80\xFD[\x80\x84\x84\x01\x85\x84\x017`\0\x84\x82\x84\x01\x01RP\x80\x93PPPP\x92P\x92\x90PV[`\x01`\x01`@\x1B\x03\x91\x90\x91\x16\x81R` \x01\x90V[\x805c\xFF\xFF\xFF\xFF\x81\x16\x81\x14a0\x94W`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15aS\xDAW`\0\x80\xFD[a \xAB\x82aS\xB4V[`\0` \x82\x84\x03\x12\x15aS\xF5W`\0\x80\xFD[P5\x91\x90PV[`\0\x80`\0a\x01@\x84\x86\x03\x12\x15aT\x12W`\0\x80\xFD[aT\x1C\x85\x85aPVV[\x92PaT+a\x01\0\x85\x01aS\xB4V[\x91PaT:a\x01 \x85\x01aO\x8AV[\x90P\x92P\x92P\x92V[`\0a\x01\0\x82\x84\x03\x12\x15aTVW`\0\x80\xFD[a \xAB\x83\x83aPVV[`\0[\x83\x81\x10\x15aT{W\x81\x81\x01Q\x83\x82\x01R` \x01aTcV[PP`\0\x91\x01RV[` \x81R`\0\x82Q\x80` \x84\x01RaT\xA3\x81`@\x85\x01` \x87\x01aT`V[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[`\0\x80`@\x83\x85\x03\x12\x15aT\xCAW`\0\x80\xFD[PP\x805\x92` \x90\x91\x015\x91PV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\x01`\x01`@\x1B\x03\x81\x81\x16\x83\x82\x16\x02\x80\x82\x16\x91\x90\x82\x81\x14aA\xEDWaA\xEDaT\xD9V[\x81\x81\x03\x81\x81\x11\x15a\x10\x1AWa\x10\x1AaT\xD9V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\0\x81aUJWaUJaT\xD9V[P`\0\x19\x01\x90V[`\x01`\x01`@\x1B\x03\x81\x81\x16\x83\x82\x16\x01\x90\x80\x82\x11\x15a2\x15Wa2\x15aT\xD9V[`\0` \x82\x84\x03\x12\x15aU\x84W`\0\x80\xFD[PQ\x91\x90PV[\x80\x82\x01\x80\x82\x11\x15a\x10\x1AWa\x10\x1AaT\xD9V[`\0\x82QaU\xB0\x81\x84` \x87\x01aT`V[\x91\x90\x91\x01\x92\x91PPV[`\0\x87Q` aU\xCD\x82\x85\x83\x8D\x01aT`V[\x88Q\x91\x84\x01\x91aU\xE0\x81\x84\x84\x8D\x01aT`V[\x88Q\x92\x01\x91aU\xF2\x81\x84\x84\x8C\x01aT`V[\x87Q\x92\x01\x91aV\x04\x81\x84\x84\x8B\x01aT`V[\x86Q\x92\x01\x91aV\x16\x81\x84\x84\x8A\x01aT`V[\x85Q\x92\x01\x91aV(\x81\x84\x84\x89\x01aT`V[\x91\x90\x91\x01\x99\x98PPPPPPPPPV[`\0\x83QaVK\x81\x84` \x88\x01aT`V[\x83Q\x90\x83\x01\x90aV_\x81\x83` \x88\x01aT`V[\x01\x94\x93PPPPV[`\0\x87QaVz\x81\x84` \x8C\x01aT`V[\x91\x90\x91\x01\x95\x86RP` \x85\x01\x93\x90\x93R`@\x84\x01\x91\x90\x91R``\x83\x01R`\x80\x82\x01R`\xA0\x01\x91\x90PV[`\0\x84QaV\xB6\x81\x84` \x89\x01aT`V[\x84Q\x90\x83\x01\x90aV\xCA\x81\x83` \x89\x01aT`V[\x84Q\x91\x01\x90aV\xDD\x81\x83` \x88\x01aT`V[\x01\x95\x94PPPPPV[cNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[`\0\x82aW\x1AWcNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[P\x06\x90V[`\0\x85QaW1\x81\x84` \x8A\x01aT`V[\x85Q\x90\x83\x01\x90aWE\x81\x83` \x8A\x01aT`V[\x85Q\x91\x01\x90aWX\x81\x83` \x89\x01aT`V[\x84Q\x91\x01\x90aWk\x81\x83` \x88\x01aT`V[\x01\x96\x95PPPPPPV[`\0\x89Q` aW\x89\x82\x85\x83\x8F\x01aT`V[\x8AQ\x91\x84\x01\x91aW\x9C\x81\x84\x84\x8F\x01aT`V[\x8AQ\x92\x01\x91aW\xAE\x81\x84\x84\x8E\x01aT`V[\x89Q\x92\x01\x91aW\xC0\x81\x84\x84\x8D\x01aT`V[\x88Q\x92\x01\x91aW\xD2\x81\x84\x84\x8C\x01aT`V[\x87Q\x92\x01\x91aW\xE4\x81\x84\x84\x8B\x01aT`V[\x86Q\x92\x01\x91aW\xF6\x81\x84\x84\x8A\x01aT`V[\x85Q\x92\x01\x91aX\x08\x81\x84\x84\x89\x01aT`V[\x91\x90\x91\x01\x9B\x9APPPPPPPPPPPV[`\0\x88Q` aX.\x82\x85\x83\x8E\x01aT`V[\x89Q\x91\x84\x01\x91aXA\x81\x84\x84\x8E\x01aT`V[\x89Q\x92\x01\x91aXS\x81\x84\x84\x8D\x01aT`V[\x88Q\x92\x01\x91aXe\x81\x84\x84\x8C\x01aT`V[\x87Q\x92\x01\x91aXw\x81\x84\x84\x8B\x01aT`V[\x86Q\x92\x01\x91aX\x89\x81\x84\x84\x8A\x01aT`V[\x85Q\x92\x01\x91aX\x9B\x81\x84\x84\x89\x01aT`V[\x91\x90\x91\x01\x9A\x99PPPPPPPPPPV[`\0\x8AQaX\xBF\x81\x84` \x8F\x01aT`V[\x91\x90\x91\x01\x98\x89RP` \x88\x01\x96\x90\x96R`@\x87\x01\x94\x90\x94R``\x86\x01\x92\x90\x92R`\x80\x85\x01R`\xA0\x84\x01R`\xC0\x83\x01R`\xE0\x82\x01Ra\x01\0\x01\x91\x90PV\xFE0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\xA6l\xC9(\xB5\xED\xB8*\xF9\xBDI\x92)T\x15Z\xB7\xB0\x94&\x94\xBE\xA4\xCEDf\x1D\x9A\x876\xC6\x88.+\x91Ea\x03i\x8A\xDFW\xB7\x99\x96\x9D\xEA\x1C\x8Fs\x9D\xA5\xD8\xD4\r\xD3\xEB\x92\"\xDB|\x81\xE8\x816\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\xF3\xF7\xA9\xFE6O\xAA\xB9;!m\xA5\n2\x14\x15O\"\xA0\xA2\xB4\x15\xB2:\x84\xC8\x16\x9E\x8Bcn\xE3\x1E\xE6x\xA0G\nu\xA6\xEA\xA8\xFE\x83p`I\x8B\xA8(\xA3p;1\x1D\x0Fw\xF0\x10BJ\xFE\xB0%\xF3\xF7\xA9\xFE6O\xAA\xB9;!m\xA5\n2\x14\x15O\"\xA0\xA2\xB4\x15\xB2:\x84\xC8\x16\x9E\x8Bcn\xE4 B\xA5\x87\xA9\x0C\x18{\n\x08|\x03\xE2\x9C\x96\x8B\x95\x0B\x1D\xB2m\\\x82\xD6f\x90Zh\x95y\x0C\n/\x8D\xD1\xF1\xA7X v\xCC75\xA9 \xA3\xCAP]8+\xBC\x90V[a\x0B\xCDa\x0FeV[`\x06Tt\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16\x15a\x0CCW`\x06\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x90U`@Q\x7F\x9A_W\xDE\x85m\xD6h\xC5M\xD9^\\U\xDF\x93C!q\xCB\xCAI\xA8wmV \xEAY\xC0$P\x90`\0\x90\xA1V[`@Q\x7F\xA8c\xAE\xC9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[a\x0C\x7Fa\x0FeV[a\x0Cu`\0a\x16>V[a\x0C\xE5`@Q\x80a\x01\0\x01`@R\x80`\0g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\0g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[P`\0\x80Tc\xFF\xFF\xFF\xFFh\x01\0\0\0\0\0\0\0\0\x91\x82\x90\x04\x16\x82R`\x05` \x81\x81R`@\x93\x84\x90 \x84Qa\x01\0\x81\x01\x86R\x81Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x16\x83R\x95\x90\x04\x90\x94\x16\x91\x84\x01\x91\x90\x91R`\x01\x81\x01T\x93\x83\x01\x93\x90\x93R`\x02\x83\x01T``\x83\x01R`\x03\x83\x01T`\x80\x83\x01R`\x04\x83\x01T`\xA0\x83\x01R\x82\x01T`\xC0\x82\x01R`\x06\x90\x91\x01T`\xE0\x82\x01R\x90V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x81\x04`\xFF\x16\x15\x90g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\0\x81\x15\x80\x15a\r\xBEWP\x82[\x90P`\0\x82g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\x01\x14\x80\x15a\r\xDBWP0;\x15[\x90P\x81\x15\x80\x15a\r\xE9WP\x80\x15[\x15a\x0E W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\x16`\x01\x17\x85U\x83\x15a\x0EkW\x84Th\xFF\0\0\0\0\0\0\0\0\x19\x16h\x01\0\0\0\0\0\0\0\0\x17\x85U[a\x0Et\x86a\x16\xC7V[a\x0E|a\x16\xD8V[`\0\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\xFF\xFF\xFF\xFF\x16h\x01\0\0\0\0\0\0\0\0\x17\x90Ua\x0E\xB9\x88\x88a\x16\xE0V[\x83\x15a\x0F\x04W\x84Th\xFF\0\0\0\0\0\0\0\0\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPPPV[a\x0F\x16a\x0FeV[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x0FYW`@Q\x7F\x1EO\xBD\xF7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\0`\x04\x82\x01R`$\x01a\tBV[a\x0Fb\x81a\x16>V[PV[3a\x0F\x97\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\x0CuW`@Q\x7F\x11\x8C\xDA\xA7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R3`\x04\x82\x01R`$\x01a\tBV[\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x81\x10\x80a\x0B\x92W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1B`$\x82\x01R\x7FBn254: invalid scalar field\0\0\0\0\0`D\x82\x01R`d\x01a\tBV[`\0\x80Th\x01\0\0\0\0\0\0\0\0\x80\x82\x04c\xFF\xFF\xFF\xFF\x16\x80\x84R`\x05` \x81\x81R`@\x80\x87 \x81Qa\x01\0\x81\x01\x83R\x81Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x16\x83R\x97\x90\x04\x87\x16\x81\x85\x01R`\x01\x80\x83\x01T\x82\x85\x01R`\x02\x80\x84\x01T``\x80\x85\x01\x91\x90\x91R`\x03\x80\x86\x01T`\x80\x80\x87\x01\x82\x90R`\x04\x80\x89\x01T`\xA0\x89\x01\x81\x90R\x89\x8D\x01T`\xC0\x8A\x01\x81\x90R`\x06\x90\x9A\x01\x80T`\xE0\x90\x9A\x01\x99\x90\x99R\x8AQ\x80\x8D\x01\x94\x90\x94R\x83\x8B\x01R\x82\x85\x01\x98\x90\x98R\x88Q\x80\x83\x03\x90\x94\x01\x84R\x01\x90\x96R\x80Q\x90\x87\x01 \x85T\x83U\x94\x85\x90U\x83T\x90U\x95\x89R\x93\x90\x92R\x91T\x90U\x93\x90\x92\x90\x91`\x0C\x91a\x11C\x91\x85\x91l\x01\0\0\0\0\0\0\0\0\0\0\0\0\x90\x04\x16aY\xBEV[\x82Ta\x01\0\x92\x90\x92\ng\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x81\x02\x19\x90\x93\x16\x91\x83\x16\x02\x17\x90\x91U`\0T`@Ql\x01\0\0\0\0\0\0\0\0\0\0\0\0\x90\x91\x04\x90\x91\x16\x81R\x7F\xDB5X%\x9E\x03\x9D~P\xE8\x16\xB9\xDC\xCE0\xFB\x11M\x8A\x9C\x86\xEC\xA5\xAB\x14\xB6\x01\x94\xD6\x94]?\x91P` \x01a\x07=V[`\0a\x11\xB5a\x19\xD0V[`@\x80Q`\x08\x80\x82Ra\x01 \x82\x01\x90\x92R\x91\x92P`\0\x91\x90` \x82\x01a\x01\0\x806\x837\x01\x90PP\x90P`\x02T\x81`\0\x81Q\x81\x10a\x11\xF4Wa\x11\xF4aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x83`\0\x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81`\x01\x81Q\x81\x10a\x12\"Wa\x12\"aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x83` \x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81`\x02\x81Q\x81\x10a\x12PWa\x12PaY\xDFV[` \x02` \x01\x01\x81\x81RPP\x83`@\x01Q\x81`\x03\x81Q\x81\x10a\x12tWa\x12taY\xDFV[` \x02` \x01\x01\x81\x81RPP\x83``\x01Q\x81`\x04\x81Q\x81\x10a\x12\x98Wa\x12\x98aY\xDFV[` \x90\x81\x02\x91\x90\x91\x01\x81\x01\x91\x90\x91R`\0\x80Th\x01\0\0\0\0\0\0\0\0\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05\x91\x82\x90R`@\x90 `\x03\x01T\x82Q\x90\x91\x83\x91\x81\x10a\x12\xE1Wa\x12\xE1aY\xDFV[` \x90\x81\x02\x91\x90\x91\x01\x81\x01\x91\x90\x91R`\0\x80Th\x01\0\0\0\0\0\0\0\0\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05\x90\x91R`@\x90 `\x04\x01T\x81Q\x82\x90`\x06\x90\x81\x10a\x13*Wa\x13*aY\xDFV[` \x90\x81\x02\x91\x90\x91\x01\x81\x01\x91\x90\x91R`\0\x80Th\x01\0\0\0\0\0\0\0\0\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05\x91\x82\x90R`@\x90 \x01T\x81Q\x82\x90`\x07\x90\x81\x10a\x13rWa\x13raY\xDFV[` \x02` \x01\x01\x81\x81RPPa\x13\x89\x82\x82\x85a\x1F\xB2V[a\x13\xBFW`@Q\x7F\t\xBD\xE39\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[PPPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14\x80a\x14^WP\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\x01`\x01`\xA0\x1B\x03\x16a\x14R\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBCT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\x0CuW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x14\x9Da\x0FeV[`@Q`\x01`\x01`\xA0\x1B\x03\x82\x16\x81R\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x90` \x01a\x07=V[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x150WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x15-\x91\x81\x01\x90aY\xF5V[`\x01[a\x15qW`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\tBV[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x81\x14a\x15\xCDW`@Q\x7F\xAA\x1DI\xA4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x81\x01\x82\x90R`$\x01a\tBV[a\x15\xD7\x83\x83a \x9DV[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\x0CuW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81\x16`\x01`\x01`\xA0\x1B\x03\x84\x81\x16\x91\x82\x17\x84U`@Q\x92\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90`\0\x90\xA3PPPV[a\x16\xCFa \xF3V[a\x0Fb\x81a!ZV[a\x0Cua \xF3V[\x81Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x15\x15\x80a\x17\x06WP` \x82\x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x15\x15[\x80a\x17\x13WP`\x80\x82\x01Q\x15[\x80a\x17 WP`\xA0\x82\x01Q\x15[\x80a\x17-WP`\xC0\x82\x01Q\x15[\x80a\x17:WP`\xE0\x82\x01Q\x15[\x80a\x17IWPc\xFF\xFF\xFF\xFF\x81\x16\x15[\x15a\x17\x80W`@Q\x7F\xA1\xBA\x07\xEE\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81`\x05`\0\x80`\x04\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP\x81`\x05`\0\x80`\x08\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP`\0\x80`\x0Ca\x01\0\n\x81T\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP\x80`\0\x80a\x01\0\n\x81T\x81c\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83c\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\0a\x19\xB3\x83`\x80\x80\x82\x01Q`\xA0\x83\x01Q`\xC0\x84\x01Q`@\x80Q` \x81\x01\x94\x90\x94R\x83\x01\x91\x90\x91R``\x82\x01R`\0\x91\x01`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x91\x90PV[`\x01\x81\x90U`\xE0\x90\x93\x01Q`\x02\x81\x90U`\x03\x93\x90\x93UPP`\x04UV[a\x19\xD8aQgV[b\x10\0\0\x81R`\x08` \x82\x01R\x7F \xC9@13\xDF\xDE\x9A\x9D8-\xF7o\xB0R5qd\x87%\xAB\xC0\xA7\xC1(0\xBBi\x0E\xC8;3`@\x82\x01QR\x7F\x03\xA0\xA9\xAC\xC3\xE3\x81Z~\xD6\xCB\x13y\xF7\xD1W\xE641dr\x93v9*i:\xCB\xD3\xEC(<` `@\x83\x01Q\x01R\x7F(f\xC1\x8A\xD1\xDF\x10\xEF\x13T,\xCEbP\xCE\x02\xCB*kr\xAE\0\xA9\x85.'\x11\x87\xE9\xE4\xE0\xDB``\x82\x01QR\x7F!\xBE#*B$jVc\xEB\xF4\x83G\x0C\xCAfo\xFE\x9DO\x0Ec\xB9)\xC5\x96\xA7e\x87\x14\xE9p` ``\x83\x01Q\x01R\x7F\x07\xD7xs\xB9\x86\0t\x11\x8Eu\x80\x8CyF\x8B\x83\xC8\xEDd\xBA\x14\xDB\\\xB5\xAF\xA8\xE54\xDE{\x99`\x80\x82\x01QR\x7F\x0B\xE0\xF4H\x83\x90\x80\x13-G\xDE\x17\xDE\0\x99\xB4\xCDt\xAE\x1Ekq\xCD\xDA\x06\xCD\xEB\xB8h\xA5\x0Cm` `\x80\x83\x01Q\x01R\x7F\x13\xBDE\xA0#I\x1E\xAD\xEAD\xCC?$\xCF\xBD\x17\x96\xEA\xDE\x9C\x0E9\xEE\x81\xD9\xF6>\xA0\xA5\x80f%`\xA0\x82\x01QR\x7F\x18\xF9\\\xDD\xA4,\xE1\x1D\x9D\x10\xA3\xB35\xAC\xC2\x14\xE3\x80|W\x8CSY@]\x81\x0C \x8D\xF6\0\x93` `\xA0\x83\x01Q\x01R\x7F\tp\xD9xv4a\xF0\x9E\x9E\xC64T\x074\x978nM(/\xED\xC2\xAC[\x96|\xB9\xFD?\xA8\xA9`\xC0\x82\x01QR\x7F(\xC2!\x7F{\xAC\xF6\xF8\xB2\xB8\xEEJ\x90\xFC\xF8\xB5\xBC\xA0B\x05\xEA\x84\xE8\xE1\xEBT\xB8]\xD4\x1B\xDE(` `\xC0\x83\x01Q\x01R\x7F\x02\xFE=\x02\x98\x8D\xB7\x188\0R\x97\n\xBAF\xA3)m\xF5\xF2\x9Bsk\xA1\xF2\xC4\xCC\xFF\xC8\xB5\x96\x93`\xE0\x82\x01QR\x7F ,>9\x0C\xEE|\\\x85%\xDA#)\xA1\x9FI6\xF6\xF7\x1C\xA9}\xDElo\xA3+8-Z\xCC\x03` `\xE0\x83\x01Q\x01R\x7F#\xAC\x10\xAEl\xA5\xCA\xCE\xE8tK\xB99\xAA\xA859\tT\xB9\x1A\xE6h\xA2\xC8\xD0\xED\xDAU\x8A\x89\xE7a\x01\0\x82\x01QR\x7F\x1C\x8C+\x85l\xDA\xDE%k\xA3#\x7F9\xAF\xD5\xE1p\xA9S \x12\xF7\xAE\xCA\xE4\x9DE\x9B)\xF6\xF6\xAD` a\x01\0\x83\x01Q\x01R\x7F\x16\xEC\x03\xD2`\xBDz\xC1\xC5\x0F\xFAcV]Rt\xB4X,\xEE\xA5/\xF4\x0B\x81\xCD\xFE\x8FDO\x01\xE4a\x01 \x82\x01QR\x7F)9!Rr0\x97\xE0q\x13\xC3\xD7xm$^\xC4\x0C0\x92\x80\x15\xCDP\xB5f\x8AON\xA1p1` a\x01 \x83\x01Q\x01R\x7F,\xDB\xFB:@S\xC8H\x9B\x0C\x94\xE7C8\xAC\x19\x11\x8D\xF7\xA0k\xC5k\x1E\xB4\xD0\xE0\xDCN\xAErHa\x01@\x82\x01QR\x7F\x07\xFE\xA1'\xDA\xE9C\xB8\xDC\x14\x8F\x14\x08\xD4\x0C\xFFF\\\x9CG!\x946i\xB1\xE4\xFDZ9\xDBp6` a\x01@\x83\x01Q\x01R\x7F\x03\x14U\xA7\x9A.\x0C\xE7\x8Al\xB55&\xEC\x04\xAC\x19qj\x86\xB0\x8A\x93\xDFH\xD1x\xF8\xB7~V\x19a\x01`\x82\x01QR\x7F\x11\x86#\xE6\xBC\x13n\xE6\xD3\xF9\x90|\xD4\xAD\x04\xA9A\x8E\xA0;\xA9\x9A\xD7S\"|\xDF\xEEY\x8E\x84\x15` a\x01`\x83\x01Q\x01R\x7F\x08a\xD1\x99wa\xA8R\"j\xAC{\xA9q{\xF6\xAEVE\x10\x99\xBEwL\xDF\x02\xEF5*X\xCB\xC8a\x01\x80\x82\x01QR\x7F\x08\x05\xE3\x92\xBC\xBC\x12\xE4\nr'xc-s\xFE\x98\x1EK\xC6\xFAm\x11x\xB7\n\xF7\xBE\x1C\xB9\xA3\xA3` a\x01\x80\x83\x01Q\x01R\x7F\x10\x1D\x1E9x\xCB\x9F\x1E0=A1D\xEB\xE6v\x82\xC9\xEB\x0C\xFE\x11$)Y\xAA`)\xD7\x8C\xDB\xBCa\x01\xA0\x82\x01QR\x7F\x08\x9E\xB9\xC7'\xE6\xCB\x07\x08+\xC3\xE6\xF4\x0C\xF0OC\x9F\xE4\x80\0`+XGt\xDA\xD7\xEF\xC6`|` a\x01\xA0\x83\x01Q\x01R\x7F-H\x9F$\x93&:\xA8s\xBC\xD9O!\xEF\xB4[\xF2W\xA6\x1D\x81\xC0\xC9\\2\x97\x91e\x06e;@a\x01\xC0\x82\x01QR\x7F\x18\xE4]bz\xAD\xD4\xDF'\x94\xEC\xD9\x90\x9F\xAC\x1Au?\x0Co\xA8\xA9\xC6eJzX\xB0\x91/\xFF\xD5` a\x01\xC0\x83\x01Q\x01R\x7F\x0EC\xE3\xA4\xB1<\xB48\xE2\xAD\x92F\x14&\x1A\xD0$\x02\x14\xFA\x1C\x83\xFC\xDAj\x0B\xF7y\xEB9\xFF\xC5a\x01\xE0\x82\x01QR\x7F\x0E\xAB\xA9\xF4)\xC5\xF6\xFC1\x03\xD4\xCC@V\xC5\0\xFFBB]\x8Ede\xC5\xB8\xE1E!\x9F\x9C\\\xD3` a\x01\xE0\x83\x01Q\x01R\x7F)\xAE5\x1D\t\xDC\xF4\x1C\n\x80\xAB\x059785\x8B\xAA\xB3~o\xBCFK;\xB12X\x99J\x1F\xA4a\x02\0\x82\x01QR\x7F+{\xC7F\x08\xD7\xEC}\xAD\xD0Y}j@\x10\xD8\xBF\xC2\xB3\x19\0(\x19\x01\xCE\xDCB\xBD\xBB\x0F\xB8\xFC` a\x02\0\x83\x01Q\x01R\x7F\x06h\x02\xC7\xCE\xB9\xE9\x13\xD4\xF6T3\xA2\x06a\xE0\x97\xAC\xAC\x1A\xFF\xEC\xBBSJT\xF7j)x\"&a\x02 \x82\x01QR\x7F'\xEC\x80\xE8\x11\xE66\xF34\x82g\x92<\x8Ed\x1B\xD9\x8A~7\xC5!fp\xCB\xFF\x14\xAE2?\x9E\x0E` a\x02 \x83\x01Q\x01R\x7F\x12`M\x1F\x87\xC5\x83\xF6\xC9q\x0Cs\xEA\xF5\x90\xAF\x9D\x07\xAAt=\x13\x81\xD0\xE9\xDF\xF0\xEA\xB2aB9a\x02@\x82\x01QR\x7F\x15\x88W\x9El3x\xEA2\xCBd\x12\x05\xEFv*c\xCD5:\x0B\xD6p9E(\xAD \x81\xEE\x8D\xD4` a\x02@\x83\x01Q\x01R\x7F$}e&\x1D:J\xB0B\xBA\x93s1\xF6\xD0\xC0\xC5\xEB\x9E\xA7\x87S\xA9 \x84\xDB\x1Ai9\xE1\x9E\x82a\x02`\x82\x01QR\x7F,\xE6\xCCfJ2\x14{\xFEj\x0C\x94\xA9[\xF0Ify@\\\xCA\xE0\x16H\xCDN\xC0!\x14Q \xD5` a\x02`\x83\x01Q\x01R\x90V[`\0a\x1F\xBD\x82a!bV[a\x1F\xE0\x83`\0\x81Q\x81\x10a\x1F\xD3Wa\x1F\xD3aY\xDFV[` \x02` \x01\x01Qa\x0F\xD9V[a\x1F\xF6\x83`\x01\x81Q\x81\x10a\x1F\xD3Wa\x1F\xD3aY\xDFV[a \x0C\x83`\x02\x81Q\x81\x10a\x1F\xD3Wa\x1F\xD3aY\xDFV[a \"\x83`\x03\x81Q\x81\x10a\x1F\xD3Wa\x1F\xD3aY\xDFV[a 8\x83`\x04\x81Q\x81\x10a\x1F\xD3Wa\x1F\xD3aY\xDFV[a N\x83`\x05\x81Q\x81\x10a\x1F\xD3Wa\x1F\xD3aY\xDFV[a d\x83`\x06\x81Q\x81\x10a\x1F\xD3Wa\x1F\xD3aY\xDFV[a z\x83`\x07\x81Q\x81\x10a\x1F\xD3Wa\x1F\xD3aY\xDFV[`\0a \x87\x85\x85\x85a\"\x9AV[\x90Pa \x92\x81a$\x1BV[\x91PP[\x93\x92PPPV[a \xA6\x82a(\xE3V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a \xEBWa\x15\xD7\x82\x82a)\x8BV[a\x0B\x92a*\x03V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0Th\x01\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16a\x0CuW`@Q\x7F\xD7\xE6\xBC\xF8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x0F\x16a \xF3V[\x80Qa!m\x90a*;V[a!z\x81` \x01Qa*;V[a!\x87\x81`@\x01Qa*;V[a!\x94\x81``\x01Qa*;V[a!\xA1\x81`\x80\x01Qa*;V[a!\xAE\x81`\xA0\x01Qa*;V[a!\xBB\x81`\xC0\x01Qa*;V[a!\xC8\x81`\xE0\x01Qa*;V[a!\xD6\x81a\x01\0\x01Qa*;V[a!\xE4\x81a\x01 \x01Qa*;V[a!\xF2\x81a\x01@\x01Qa*;V[a\"\0\x81a\x01`\x01Qa*;V[a\"\x0E\x81a\x01\x80\x01Qa*;V[a\"\x1C\x81a\x01\xA0\x01Qa\x0F\xD9V[a\"*\x81a\x01\xC0\x01Qa\x0F\xD9V[a\"8\x81a\x01\xE0\x01Qa\x0F\xD9V[a\"F\x81a\x02\0\x01Qa\x0F\xD9V[a\"T\x81a\x02 \x01Qa\x0F\xD9V[a\"b\x81a\x02@\x01Qa\x0F\xD9V[a\"p\x81a\x02`\x01Qa\x0F\xD9V[a\"~\x81a\x02\x80\x01Qa\x0F\xD9V[a\"\x8C\x81a\x02\xA0\x01Qa\x0F\xD9V[a\x0Fb\x81a\x02\xC0\x01Qa\x0F\xD9V[a\"\xA2aS\xE5V[\x83` \x01Q\x83Q\x14a\"\xE0W`@Q\x7FA\xF5;\x12\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\"\xED\x85\x85\x85a*\xE5V[\x90P`\0a\"\xFE\x86`\0\x01Qa.\x16V[\x90P`\0a#\x11\x82\x84`\xA0\x01Q\x88a1\xFAV[`@\x80Q`\x1E\x80\x82Ra\x03\xE0\x82\x01\x90\x92R\x91\x92P`\0\x91\x90` \x82\x01a\x03\xC0\x806\x837PP`@\x80Q`\x1E\x80\x82Ra\x03\xE0\x82\x01\x90\x92R\x92\x93P`\0\x92\x91P` \x82\x01[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81R` \x01\x90`\x01\x90\x03\x90\x81a#TW\x90PP\x90P`\0a#\x8D\x8A\x85\x8A\x89\x87\x87a2ZV[`\xA0\x87\x01Q``\x87\x01Q\x91\x92P\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01`\0\x81\x83\x85\t`@\x80Qa\x01\0\x81\x01\x82R`\xE0\x9C\x8D\x01Q\x81R` \x81\x01\x96\x90\x96R\x85\x01RPPP``\x81\x01\x91\x90\x91R`\x80\x81\x01\x92\x90\x92R`\xA0\x82\x01Ra\x01`\x86\x01Q`\xC0\x82\x01Ra\x01\x80\x90\x95\x01Q\x92\x85\x01\x92\x90\x92RP\x91\x94\x93PPPPV[`@\x80Q\x80\x82\x01\x82R`\0\x80\x82R` \x80\x83\x01\x82\x90R\x83Q\x80\x85\x01\x85R\x82\x81R\x90\x81\x01\x82\x90R\x83Q`\x02\x80\x82R``\x82\x01\x90\x95R\x91\x93\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x93\x92\x85\x91\x81` \x01` \x82\x02\x806\x837PP`@\x80Q`\x02\x80\x82R``\x82\x01\x90\x92R\x92\x93P`\0\x92\x91P` \x82\x01[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81R` \x01\x90`\x01\x90\x03\x90\x81a$\xA1W\x90PP\x90P`\0`\x01\x90P\x80\x83`\0\x81Q\x81\x10a$\xE4Wa$\xE4aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x87`\xC0\x01Q\x82`\0\x81Q\x81\x10a%\x08Wa%\x08aY\xDFV[` \x02` \x01\x01\x81\x90RP\x87`\0\x01Q\x83`\x01\x81Q\x81\x10a%+Wa%+aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x87`\xE0\x01Q\x82`\x01\x81Q\x81\x10a%OWa%OaY\xDFV[` \x02` \x01\x01\x81\x90RPa%d\x82\x84a2\x8FV[`\x80\x89\x01QQ\x90\x95P``\x93P\x83\x92P\x90P`\0a%\x83\x82`\x02aZ\x0EV[a%\x8E\x90`\x01aZ\x0EV[\x90P\x80g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a%\xA9Wa%\xA9aT\xA6V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a%\xD2W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x93P\x80g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a%\xEEWa%\xEEaT\xA6V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a&3W\x81` \x01[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81R` \x01\x90`\x01\x90\x03\x90\x81a&\x0CW\x90P[P\x92PPP`\0\x80`\0[\x89`\x80\x01QQ\x81\x10\x15a&\xD7W\x89`\x80\x01Q\x81\x81Q\x81\x10a&aWa&aaY\xDFV[` \x02` \x01\x01Q\x85\x83\x81Q\x81\x10a&{Wa&{aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x89`\xA0\x01Q\x81\x81Q\x81\x10a&\x9DWa&\x9DaY\xDFV[` \x02` \x01\x01Q\x84\x83\x81Q\x81\x10a&\xB7Wa&\xB7aY\xDFV[` \x90\x81\x02\x91\x90\x91\x01\x01Ra&\xCD`\x01\x83aZ\x0EV[\x91P`\x01\x01a&>V[P\x88` \x01Q\x84\x82\x81Q\x81\x10a&\xEFWa&\xEFaY\xDFV[` \x02` \x01\x01\x81\x81RPP\x88`\xC0\x01Q\x83\x82\x81Q\x81\x10a'\x12Wa'\x12aY\xDFV[` \x90\x81\x02\x91\x90\x91\x01\x01Ra'(`\x01\x82aZ\x0EV[\x89Q`@\x8B\x01Q\x91\x92P\x90`\0\x89\x82\x84\t\x90P\x80\x87\x85\x81Q\x81\x10a'NWa'NaY\xDFV[` \x02` \x01\x01\x81\x81RPPPPP\x88`\xE0\x01Q\x83\x82\x81Q\x81\x10a'tWa'taY\xDFV[` \x90\x81\x02\x91\x90\x91\x01\x01Ra'\x8A`\x01\x82aZ\x0EV[``\x8A\x01Q\x90\x91P\x87\x81\x84\x08\x92PPa'\xA2\x82a3\x89V[\x84\x82\x81Q\x81\x10a'\xB4Wa'\xB4aY\xDFV[` \x02` \x01\x01\x81\x81RPPa'\xEC`@\x80Q\x80\x82\x01\x82R`\0\x80\x82R` \x91\x82\x01R\x81Q\x80\x83\x01\x90\x92R`\x01\x82R`\x02\x90\x82\x01R\x90V[\x83\x82\x81Q\x81\x10a'\xFEWa'\xFEaY\xDFV[` \x02` \x01\x01\x81\x90RPa(\x1Ba(\x16\x84\x86a2\x8FV[a3\xDFV[\x94PPPPP`\0`@Q\x80`\x80\x01`@R\x80\x7F\x01\x18\xC4\xD5\xB87\xBC\xC2\xBC\x89\xB5\xB3\x98\xB5\x97N\x9FYD\x07;2\x07\x8B~#\x1F\xEC\x93\x88\x83\xB0\x81R` \x01\x7F&\x0E\x01\xB2Q\xF6\xF1\xC7\xE7\xFFNX\x07\x91\xDE\xE8\xEAQ\xD8z5\x8E\x03\x8BN\xFE0\xFA\xC0\x93\x83\xC1\x81R` \x01\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U\x81R` \x01\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4\x81RP\x90Pa(\xD9\x83\x82\x84a(\xD4a4~V[a5OV[\x96\x95PPPPPPV[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a)2W`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\tBV[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa)\xA8\x91\x90aZ!V[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a)\xE3W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a)\xE8V[``\x91P[P\x91P\x91Pa)\xF8\x85\x83\x83a63V[\x92PPP[\x92\x91PPV[4\x15a\x0CuW`@Q\x7F\xB3\x98\x97\x9F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80Q` \x82\x01Q`\0\x91\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x91\x15\x90\x15\x16\x15a*uWPPPV[\x82Q` \x84\x01Q\x82`\x03\x84\x85\x85\x86\t\x85\t\x08\x83\x82\x83\t\x14\x83\x82\x10\x84\x84\x10\x16\x16\x93PPP\x81a\x15\xD7W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x17`$\x82\x01R\x7FBn254: invalid G1 point\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\tBV[a+-`@Q\x80a\x01\0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`@\x80Q\x80\x82\x01\x90\x91R``\x81R`\0` \x82\x01R\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01a+n\x82\x87\x87a6\xA8V[\x81Q\x84Qa+{\x90a:\x89V[a+\x88\x86` \x01Qa:\x89V[a+\x95\x87`@\x01Qa:\x89V[a+\xA2\x88``\x01Qa:\x89V[a+\xAF\x89`\x80\x01Qa:\x89V[`@Q` \x01a+\xC4\x96\x95\x94\x93\x92\x91\x90aZ=V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra+\xDF\x82a;LV[Pa+\xE9\x82a;LV[``\x84\x01Ra+\xF7\x82a;LV[`\x80\x84\x01R\x81Q`\xA0\x85\x01Qa,\x0C\x90a:\x89V[`@Q` \x01a,\x1D\x92\x91\x90aZ\xBCV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra,8\x82a;LV[\x83R\x81Q`\xC0\x85\x01Qa,J\x90a:\x89V[a,W\x86`\xE0\x01Qa:\x89V[a,e\x87a\x01\0\x01Qa:\x89V[a,s\x88a\x01 \x01Qa:\x89V[a,\x81\x89a\x01@\x01Qa:\x89V[`@Q` \x01a,\x96\x96\x95\x94\x93\x92\x91\x90aZ=V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra,\xB1\x82a;LV[`\xA0\x84\x01R\x81Qa\x01\xA0\x85\x01Qa,\xC7\x90a;\xC0V[a,\xD5\x86a\x01\xC0\x01Qa;\xC0V[a,\xE3\x87a\x01\xE0\x01Qa;\xC0V[a,\xF1\x88a\x02\0\x01Qa;\xC0V[a,\xFF\x89a\x02 \x01Qa;\xC0V[`@Q` \x01a-\x14\x96\x95\x94\x93\x92\x91\x90aZ\xEBV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x83Ra\x02@\x85\x01Qa-6\x90a;\xC0V[a-D\x86a\x02`\x01Qa;\xC0V[a-R\x87a\x02\x80\x01Qa;\xC0V[a-`\x88a\x02\xA0\x01Qa;\xC0V[a-n\x89a\x02\xC0\x01Qa;\xC0V[`@Q` \x01a-\x83\x96\x95\x94\x93\x92\x91\x90aZ\xEBV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra-\x9E\x82a;LV[`\xC0\x84\x01R\x81Qa\x01`\x85\x01Qa-\xB4\x90a:\x89V[a-\xC2\x86a\x01\x80\x01Qa:\x89V[`@Q` \x01a-\xD4\x93\x92\x91\x90a['V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra-\xEF\x82a;LV[`\xE0\x84\x01R\x82Q\x81\x81\x80\t\x82\x82\x82\t` \x86\x01\x91\x90\x91R`@\x85\x01RP\x91\x95\x94PPPPPV[a.H`@Q\x80`\xA0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[\x81b\x01\0\0\x03a.\xDCWP`@\x80Q`\xA0\x81\x01\x82R`\x10\x81R` \x81\x01\x92\x90\x92R\x7F0d\x1E\x0E\x92\xBE\xBE\xF8\x18&\x8Df;\xCA\xD6\xDB\xCF\xD6\xC0\x14\x91p\xF6\xD7\xD3P\xB1\xB1\xFAl\x10\x01\x90\x82\x01R~\xEE\xB2\xCBY\x81\xEDEd\x9A\xBE\xBD\xE0\x81\xDC\xFF\x16\xC8`\x1D\xE44~}\xD1b\x8B\xA2\xDA\xACC\xB7``\x82\x01R\x7F\x0B]V\xB7\x7F\xE7\x04\xE8\xE9#8\xC0\x08/7\xE0\x91\x12d\x14\xC80\xE4\xC6\x92-Z\xC8\x02\xD8B\xD4`\x80\x82\x01R\x90V[\x81b\x02\0\0\x03a/qWP`@\x80Q`\xA0\x81\x01\x82R`\x11\x81R` \x81\x01\x92\x90\x92R\x7F0d6@\xB9\xF8/\x90\xE8;i\x8E^\xA6\x17\x9C|\x05T.\x85\x953\xB4\x8B\x99S\xA2\xF56\x08\x01\x90\x82\x01R\x7F\x1B\xF8-\xEB\xA7\xD7I\x02\xC3p\x8C\xC6\xE7\x0Ea\xF3\x05\x12\xEC\xA9VU!\x0E'nXX\xCE\x8FX\xE5``\x82\x01R\x7F$L\xF0\x10\xC4<\xA8r7\xD8\xB0\x0B\xF9\xDDP\xC4\xC0\x1C\x7F\x08k\xD4\xE8\xC9 \xE7RQ\xD9o\r\"`\x80\x82\x01R\x90V[\x81b\x04\0\0\x03a0\x06WP`@\x80Q`\xA0\x81\x01\x82R`\x12\x81R` \x81\x01\x92\x90\x92R\x7F0dBY\xCD\x94\xE7\xDDPE\xD7\xA2p\x13\xB7\xFC\xD2\x1C\x9E;\x7F\xA7R\"\xE7\xBD\xA4\x9Br\x9B\x04\x01\x90\x82\x01R\x7F\x19\xDD\xBC\xAF:\x8DF\xC1\\\x01v\xFB\xB5\xB9^M\xC5p\x88\xFF\x13\xF4\xD1\xBD\x84\xC6\xBF\xA5}\xCD\xC0\xE0``\x82\x01R\x7F\x03hS\xF0\x83x\x0E\x87\xF8\xD7\xC7\x1D\x11\x11\x19\xC5}\xBE\x11\x8C\"\xD5\xADpz\x821tf\xC5\x17L`\x80\x82\x01R\x90V[\x81b\x08\0\0\x03a0\x9BWP`@\x80Q`\xA0\x81\x01\x82R`\x13\x81R` \x81\x01\x92\x90\x92R\x7F0dHfWcD\x03\x84K\x0E\xACx\xCA\x88,\xFD(CA\xFC\xB0aZ\x15\xCF\xCD\x17\xB1M\x82\x01\x90\x82\x01R\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD``\x82\x01R\x7F\x06\xE4\x02\xC0\xA3\x14\xFBg\xA1\\\xF8\x06fJ\xE1\xB7\"\xDB\xC0\xEF\xE6nl\x81\xD9\x8F\x99$\xCASS!`\x80\x82\x01R\x90V[\x81b\x10\0\0\x03a10WP`@\x80Q`\xA0\x81\x01\x82R`\x14\x81R` \x81\x01\x92\x90\x92R\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x90\x82\x01R\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW``\x82\x01R\x7F\x10\x0C3-!\0\x89_\xABds\xBC,Q\xBF\xCAR\x1FE\xCB;\xAC\xA6&\x08R\xA8\xFD\xE2l\x91\xF3`\x80\x82\x01R\x90V[\x81` \x03a1\xC3WP`@\x80Q`\xA0\x81\x01\x82R`\x05\x81R` \x81\x01\x92\x90\x92R\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x90\x82\x01R\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0``\x82\x01R\x7F'$q6\x03\xBF\xBDy\n\xEA\xF3\xE7\xDF%\xD8\xE7\xEF\x8F1\x134\x90[M\x8C\x99\x98\x0C\xF2\x10\x97\x9D`\x80\x82\x01R\x90V[`@Q\x7F\xE2\xEF\t\xE5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x91\x90PV[a2\x1E`@Q\x80``\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[a2(\x84\x84a=\x0CV[\x80\x82Ra28\x90\x85\x90\x85\x90a=rV[` \x82\x01R\x80Qa2N\x90\x85\x90\x84\x90\x86\x90a=\xF8V[`@\x82\x01R\x93\x92PPPV[`\0\x80a2h\x85\x87\x89a?\xBFV[\x90Pa2x\x88\x86\x89\x89\x88\x88a@\xC1V[a2\x83\x81\x87\x86aC\xDFV[\x98\x97PPPPPPPPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x82Q\x82Q\x14a2\xF4W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FMSM error: length does not match`D\x82\x01R`d\x01a\tBV[a32\x83`\0\x81Q\x81\x10a3\nWa3\naY\xDFV[` \x02` \x01\x01Q\x83`\0\x81Q\x81\x10a3%Wa3%aY\xDFV[` \x02` \x01\x01QaDAV[\x90P`\x01[\x82Q\x81\x10\x15a3\x82Wa3x\x82a3s\x86\x84\x81Q\x81\x10a3YWa3YaY\xDFV[` \x02` \x01\x01Q\x86\x85\x81Q\x81\x10a3%Wa3%aY\xDFV[aD\xE5V[\x91P`\x01\x01a37V[P\x92\x91PPV[`\0a3\xB5\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x83a[\x80V[a)\xFD\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01a[\xA2V[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81Q` \x83\x01Q\x15\x90\x15\x16\x15a4\x07WP\x90V[`@Q\x80`@\x01`@R\x80\x83`\0\x01Q\x81R` \x01\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x84` \x01Qa4L\x91\x90a[\x80V[a4v\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDGa[\xA2V[\x90R\x92\x91PPV[a4\xA9`@Q\x80`\x80\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`@Q\x80`\x80\x01`@R\x80\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x81R` \x01\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2\x81R` \x01\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA\x81R` \x01\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[\x81RP\x90P\x90V[`\0\x80`\0`@Q\x87Q\x81R` \x88\x01Q` \x82\x01R` \x87\x01Q`@\x82\x01R\x86Q``\x82\x01R``\x87\x01Q`\x80\x82\x01R`@\x87\x01Q`\xA0\x82\x01R\x85Q`\xC0\x82\x01R` \x86\x01Q`\xE0\x82\x01R` \x85\x01Qa\x01\0\x82\x01R\x84Qa\x01 \x82\x01R``\x85\x01Qa\x01@\x82\x01R`@\x85\x01Qa\x01`\x82\x01R` `\0a\x01\x80\x83`\x08Z\xFA\x91PP`\0Q\x91P\x80a6%W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1C`$\x82\x01R\x7FBn254: Pairing check failed!\0\0\0\0`D\x82\x01R`d\x01a\tBV[P\x15\x15\x90P[\x94\x93PPPPV[``\x82a6HWa6C\x82aE\x8CV[a \x96V[\x81Q\x15\x80\x15a6_WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a6\xA1W`@Q\x7F\x99\x96\xB3\x15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\tBV[P\x80a \x96V[\x82Q`\xFE\x90a6\xE3a6\xB9\x83a;\xC0V[`@Q` \x01a6\xCB\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R`\0`\x04aE\xCEV[a7\x1Da6\xF3\x86`\0\x01Qa;\xC0V[`@Q` \x01a7\x05\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R`\0`\x08aE\xCEV[a7-a6\xF3\x87` \x01Qa;\xC0V[`@Q` \x01a7@\x94\x93\x92\x91\x90a[\xB5V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x85Ra7]`\x01a;\xC0V[a7\x86\x7F/\x8D\xD1\xF1\xA7X\x8BW`\x01`\0[\x82\x81\x10\x15a>~W\x81\x87\x03a>_W\x87\x81\x81Q\x81\x10a>LWa>LaY\xDFV[` \x02` \x01\x01Q\x94PPPPPa6+V[\x83\x80a>mWa>ma[jV[\x89``\x01Q\x83\t\x91P`\x01\x01a>+V[P`\0\x93PPPPa6+V[`\0\x80`\0\x80\x8A`@\x01Q\x90P`\0\x80a>\xA5\x8D\x88aG\xAEV[\x90P`\0\x87g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a>\xC2Wa>\xC2aT\xA6V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a>\xEBW\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x90P\x88\x8B\x85\t\x93P`\x01\x92P`\0[\x88\x81\x10\x15a?0W` \x81\x02` \x84\x01\x01Q\x95P\x89\x8D\x87\x8C\x03\x08\x96P\x89\x87\x85\t` \x82\x81\x02\x84\x01\x01\x88\x90R\x93P`\x01\x01a>\xFBV[Pa?:\x83aF\xF6V[\x92P`\0[\x88\x81\x10\x15a?\xADW` \x81\x02` \x84\x01\x01Q\x95P\x89\x86\x86\t\x97P\x89\x84\x89\t\x97P`\0[\x89\x81\x10\x15a?\x8CW\x80\x82\x14a?\x84W` \x81\x02` \x84\x01\x01Q\x97P\x8A\x88\x8A\t\x98P[`\x01\x01a?bV[P` \x81\x02` \x8F\x01\x01Q\x95P\x89\x86\x89\t\x97P\x89\x88\x8C\x08\x9AP`\x01\x01a??V[PPPPPPPPPP\x94\x93PPPPV[`\0\x80\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x90P`\0\x83` \x01Q\x90P`\0\x84`@\x01Q\x90P`\0`\x01\x90P``\x88\x01Q`\x80\x89\x01Qa\x01\xA0\x89\x01Qa\x02@\x8A\x01Q\x87\x88\x89\x83\x87\t\x8A\x86\x86\x08\x08\x86\t\x94PPPa\x01\xC0\x89\x01Qa\x02`\x8A\x01Q\x87\x88\x89\x83\x87\t\x8A\x86\x86\x08\x08\x86\t\x94PPPa\x01\xE0\x89\x01Qa\x02\x80\x8A\x01Q\x87\x88\x89\x83\x87\t\x8A\x86\x86\x08\x08\x86\t\x94PPPa\x02\0\x89\x01Qa\x02\xA0\x8A\x01Q\x87\x88\x89\x83\x87\t\x8A\x86\x86\x08\x08\x86\t\x94PPPa\x02 \x89\x01Q\x91Pa\x02\xC0\x89\x01Q\x86\x87\x82\x89\x85\x87\x08\t\x85\t\x93PPPP\x87Q` \x89\x01Q\x85\x86\x86\x83\t\x87\x03\x85\x08\x96PP\x84\x85\x83\x83\t\x86\x03\x87\x08\x99\x98PPPPPPPPPV[a@\xCF\x86\x86\x86\x86\x85\x87aH\x9FV[`\xC0\x85\x01Q\x82Q\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x91\x90\x81\x90\x81\x90\x86\x90`\x14\x90\x81\x10aA\x10WaA\x10aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x85`\0\x01Q\x84`\x14\x81Q\x81\x10aA4WaA4aY\xDFV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x15\x81Q\x81\x10aAYWaAYaY\xDFV[` \x02` \x01\x01\x81\x81RPP\x85` \x01Q\x84`\x15\x81Q\x81\x10aA}WaA}aY\xDFV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x16\x81Q\x81\x10aA\xA2WaA\xA2aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x85`@\x01Q\x84`\x16\x81Q\x81\x10aA\xC6WaA\xC6aY\xDFV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x17\x81Q\x81\x10aA\xEBWaA\xEBaY\xDFV[` \x02` \x01\x01\x81\x81RPP\x85``\x01Q\x84`\x17\x81Q\x81\x10aB\x0FWaB\x0FaY\xDFV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x18\x81Q\x81\x10aB4WaB4aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x85`\x80\x01Q\x84`\x18\x81Q\x81\x10aBXWaBXaY\xDFV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x19\x81Q\x81\x10aB}WaB}aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x88`@\x01Q\x84`\x19\x81Q\x81\x10aB\xA1WaB\xA1aY\xDFV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1A\x81Q\x81\x10aB\xC6WaB\xC6aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x88``\x01Q\x84`\x1A\x81Q\x81\x10aB\xEAWaB\xEAaY\xDFV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1B\x81Q\x81\x10aC\x0FWaC\x0FaY\xDFV[` \x02` \x01\x01\x81\x81RPP\x88`\x80\x01Q\x84`\x1B\x81Q\x81\x10aC3WaC3aY\xDFV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1C\x81Q\x81\x10aCXWaCXaY\xDFV[` \x02` \x01\x01\x81\x81RPP\x88`\xA0\x01Q\x84`\x1C\x81Q\x81\x10aC|WaC|aY\xDFV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x87`\xE0\x01Q\x85`\x1D\x81Q\x81\x10aC\xA5WaC\xA5aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x85`\xA0\x01Q\x84`\x1D\x81Q\x81\x10aC\xC9WaC\xC9aY\xDFV[` \x02` \x01\x01\x81\x90RPPPPPPPPPPV[\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x83\x81\x03\x90`\0[`\n\x81\x10\x15aD8W` `\x15\x82\x01\x02\x84\x01Q` \x82\x02a\x01\xA0\x01\x86\x01Q\x83\x84\x82\x84\t\x86\x08\x94PPP`\x01\x01aD\x07V[PP\x93\x92PPPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01RaD]aT8V[\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R`@\x81\x01\x83\x90R`\0``\x83`\x80\x84`\x07a\x07\xD0Z\x03\xFA\x90P\x80\x80aD\x8FW`\0\x80\xFD[P\x80aD\xDDW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x19`$\x82\x01R\x7FBn254: scalar mul failed!\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\tBV[PP\x92\x91PPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01RaE\x01aTVV[\x83Q\x81R` \x80\x85\x01Q\x81\x83\x01R\x83Q`@\x83\x01R\x83\x01Q``\x80\x83\x01\x91\x90\x91R`\0\x90\x83`\xC0\x84`\x06a\x07\xD0Z\x03\xFA\x90P\x80\x80aE>W`\0\x80\xFD[P\x80aD\xDDW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: group addition failed!\0\0\0`D\x82\x01R`d\x01a\tBV[\x80Q\x15aE\x9CW\x80Q\x80\x82` \x01\xFD[`@Q\x7F\x14%\xEAB\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x81aE\xDC\x81`\x1FaZ\x0EV[\x10\x15aF*W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0E`$\x82\x01R\x7Fslice_overflow\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\tBV[aF4\x82\x84aZ\x0EV[\x84Q\x10\x15aF\x84W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x11`$\x82\x01R\x7Fslice_outOfBounds\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\tBV[``\x82\x15\x80\x15aF\xA3W`@Q\x91P`\0\x82R` \x82\x01`@RaF\xEDV[`@Q\x91P`\x1F\x84\x16\x80\x15` \x02\x81\x84\x01\x01\x85\x81\x01\x87\x83\x15` \x02\x84\x8B\x01\x01\x01[\x81\x83\x10\x15aF\xDCW\x80Q\x83R` \x92\x83\x01\x92\x01aF\xC4V[PP\x85\x84R`\x1F\x01`\x1F\x19\x16`@RP[P\x94\x93PPPPV[`\0\x80`\0\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x90P`@Q` \x81R` \x80\x82\x01R` `@\x82\x01R\x84``\x82\x01R`\x02\x82\x03`\x80\x82\x01R\x81`\xA0\x82\x01R` `\0`\xC0\x83`\x05Z\xFA\x92PP`\0Q\x92P\x81aG\xA7W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: pow precompile failed!\0\0\0`D\x82\x01R`d\x01a\tBV[PP\x91\x90PV[``\x82` \x01Q\x82\x11\x15aG\xEEW`@Q\x7F\x8C^\x11\xF1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x83\x01Q`\x01\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x84g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aH/WaH/aT\xA6V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15aHXW\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x93P\x84\x15\x19\x15a=iW` \x84\x01\x85` \x02\x81\x01`\x01\x82R` \x82\x01\x91P[\x80\x82\x10\x15aH\x94W\x82\x85\x85\t\x93P\x83\x82R` \x82\x01\x91PaHxV[PPPPP\x92\x91PPV[`\0\x80`\0\x80`\0\x80\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x90P\x80` \x8B\x01Q` \x8D\x01Q\t\x95P\x8AQ\x93P\x80`\xA0\x8C\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xA0\x8A\x01Q\x84\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80\x7F/\x8D\xD1\xF1\xA7X\x85\x82a[\xA2V[\x87`\x01\x81Q\x81\x10aKQWaKQaY\xDFV[` \x02` \x01\x01\x81\x81RPP\x88a\x01\xA0\x01Q\x87`\x02\x81Q\x81\x10aKvWaKvaY\xDFV[` \x02` \x01\x01\x81\x81RPP\x88a\x01\xC0\x01Q\x87`\x03\x81Q\x81\x10aK\x9BWaK\x9BaY\xDFV[` \x02` \x01\x01\x81\x81RPP\x88a\x01\xE0\x01Q\x87`\x04\x81Q\x81\x10aK\xC0WaK\xC0aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x88a\x02\0\x01Q\x87`\x05\x81Q\x81\x10aK\xE5WaK\xE5aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x8B`\xE0\x01Q\x88`\x02\x81Q\x81\x10aL\tWaL\taY\xDFV[` \x02` \x01\x01\x81\x90RP\x8Ba\x01\0\x01Q\x88`\x03\x81Q\x81\x10aL-WaL-aY\xDFV[` \x02` \x01\x01\x81\x90RP\x8Ba\x01 \x01Q\x88`\x04\x81Q\x81\x10aLQWaLQaY\xDFV[` \x02` \x01\x01\x81\x90RP\x8Ba\x01@\x01Q\x88`\x05\x81Q\x81\x10aLuWaLuaY\xDFV[` \x02` \x01\x01\x81\x90RP\x80a\x01\xC0\x8A\x01Qa\x01\xA0\x8B\x01Q\t\x92P\x82\x87`\x06\x81Q\x81\x10aL\xA4WaL\xA4aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01`\x01Q\x88`\x06\x81Q\x81\x10aL\xC9WaL\xC9aY\xDFV[` \x02` \x01\x01\x81\x90RP\x80a\x02\0\x8A\x01Qa\x01\xE0\x8B\x01Q\t\x92P\x82\x87`\x07\x81Q\x81\x10aL\xF8WaL\xF8aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01\x80\x01Q\x88`\x07\x81Q\x81\x10aM\x1DWaM\x1DaY\xDFV[` \x02` \x01\x01\x81\x90RPa\x01\xA0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\x08\x81Q\x81\x10aMVWaMVaY\xDFV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01\xE0\x01Q\x88`\x08\x81Q\x81\x10aM{WaM{aY\xDFV[` \x02` \x01\x01\x81\x90RPa\x01\xC0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\t\x81Q\x81\x10aM\xB4WaM\xB4aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x02\0\x01Q\x88`\t\x81Q\x81\x10aM\xD9WaM\xD9aY\xDFV[` \x02` \x01\x01\x81\x90RPa\x01\xE0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\n\x81Q\x81\x10aN\x12WaN\x12aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x02 \x01Q\x88`\n\x81Q\x81\x10aN7WaN7aY\xDFV[` \x02` \x01\x01\x81\x90RPa\x02\0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\x0B\x81Q\x81\x10aNpWaNpaY\xDFV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x02@\x01Q\x88`\x0B\x81Q\x81\x10aN\x95WaN\x95aY\xDFV[` \x02` \x01\x01\x81\x90RP\x88a\x02 \x01Q\x81aN\xB1\x91\x90a[\xA2V[\x87`\x0C\x81Q\x81\x10aN\xC4WaN\xC4aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01\xA0\x01Q\x88`\x0C\x81Q\x81\x10aN\xE9WaN\xE9aY\xDFV[` \x02` \x01\x01\x81\x90RP`\x01\x87`\r\x81Q\x81\x10aO\tWaO\taY\xDFV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01\xC0\x01Q\x88`\r\x81Q\x81\x10aO.WaO.aY\xDFV[` \x02` \x01\x01\x81\x90RP\x80a\x01\xC0\x8A\x01Qa\x01\xA0\x8B\x01Q\t\x92P\x80a\x01\xE0\x8A\x01Q\x84\t\x92P\x80a\x02\0\x8A\x01Q\x84\t\x92P\x80a\x02 \x8A\x01Q\x84\t\x92P\x82\x87`\x0E\x81Q\x81\x10aO~WaO~aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x02`\x01Q\x88`\x0E\x81Q\x81\x10aO\xA3WaO\xA3aY\xDFV[` \x90\x81\x02\x91\x90\x91\x01\x01R\x89QaO\xBA\x90\x82a[\xA2V[\x87`\x0F\x81Q\x81\x10aO\xCDWaO\xCDaY\xDFV[` \x02` \x01\x01\x81\x81RPP\x88`\xC0\x01Q\x88`\x0F\x81Q\x81\x10aO\xF1WaO\xF1aY\xDFV[` \x02` \x01\x01\x81\x90RP\x80`\x01\x8BQ\x08`\xA0\x8C\x01Q\x90\x93P\x81\x90\x80\t\x91P\x80\x82\x84\t\x92P\x80\x83` `\x10\x02\x89\x01Q\t\x91P\x81\x87`\x10\x81Q\x81\x10aP7WaP7aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x88`\xE0\x01Q\x88`\x10\x81Q\x81\x10aP[WaP[aY\xDFV[` \x02` \x01\x01\x81\x90RP\x80\x83` `\x11\x02\x89\x01Q\t\x91P\x81\x87`\x11\x81Q\x81\x10aP\x87WaP\x87aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x88a\x01\0\x01Q\x88`\x11\x81Q\x81\x10aP\xACWaP\xACaY\xDFV[` \x02` \x01\x01\x81\x90RP\x80\x83` `\x12\x02\x89\x01Q\t\x91P\x81\x87`\x12\x81Q\x81\x10aP\xD8WaP\xD8aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x88a\x01 \x01Q\x88`\x12\x81Q\x81\x10aP\xFDWaP\xFDaY\xDFV[` \x02` \x01\x01\x81\x90RP\x80\x83` `\x13\x02\x89\x01Q\t\x91P\x81\x87`\x13\x81Q\x81\x10aQ)WaQ)aY\xDFV[` \x02` \x01\x01\x81\x81RPP\x88a\x01@\x01Q\x88`\x13\x81Q\x81\x10aQNWaQNaY\xDFV[` \x02` \x01\x01\x81\x90RPPPPPPPPPPPPPV[`@Q\x80a\x02\x80\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01aQ\x9E`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[\x81R` \x01aQ\xC0`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[\x81R` \x01aQ\xE2`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[\x81R` \x01aR\x04`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[\x81R` \x01aR&`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[\x81R` \x01aRH`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[\x81R` \x01aRj`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[\x81R` \x01aR\x8C`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[\x81R` \x01aR\xAE`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[\x81R` \x01aR\xD0`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[\x81R` \x01aR\xF2`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[\x81R` \x01aS\x14`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[\x81R` \x01aS6`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[\x81R` \x01aSX`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[\x81R` \x01aSz`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[\x81R` \x01aS\x9C`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[\x81R` \x01aS\xBE`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[\x81R` \x01aS\xE0`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[\x90R\x90V[`@Q\x80a\x01\0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01``\x81R` \x01``\x81R` \x01aS\xBE`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[`@Q\x80``\x01`@R\x80`\x03\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[`@Q\x80`\x80\x01`@R\x80`\x04\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a1\xF5W`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15aT\x9DW`\0\x80\xFD[a \x96\x82aTtV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Qa\x02\xE0\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15aT\xE0WaT\xE0aT\xA6V[`@R\x90V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15aU\x0FWaU\x0FaT\xA6V[`@R\x91\x90PV[\x805g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x16\x81\x14a1\xF5W`\0\x80\xFD[`\0a\x01\0\x80\x83\x85\x03\x12\x15aUCW`\0\x80\xFD[`@Q\x90\x81\x01\x90g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x81\x83\x10\x17\x15aUfWaUfaT\xA6V[\x81`@R\x80\x92PaUv\x84aU\x17V[\x81RaU\x84` \x85\x01aU\x17V[` \x82\x01R`@\x84\x015`@\x82\x01R``\x84\x015``\x82\x01R`\x80\x84\x015`\x80\x82\x01R`\xA0\x84\x015`\xA0\x82\x01R`\xC0\x84\x015`\xC0\x82\x01R`\xE0\x84\x015`\xE0\x82\x01RPP\x92\x91PPV[`\0`@\x82\x84\x03\x12\x15aU\xDFW`\0\x80\xFD[`@Q`@\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15aV\x02WaV\x02aT\xA6V[`@R\x825\x81R` \x92\x83\x015\x92\x81\x01\x92\x90\x92RP\x91\x90PV[`\0\x80\x82\x84\x03a\x05\x80\x81\x12\x15aV1W`\0\x80\xFD[aV;\x85\x85aU/V[\x92Pa\x01\0a\x04\x80\x80\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\x84\x01\x12\x15aVrW`\0\x80\xFD[aVzaT\xBCV[\x92PaV\x88\x87\x83\x88\x01aU\xCDV[\x83Ra\x01@aV\x99\x88\x82\x89\x01aU\xCDV[` \x85\x01Ra\x01\x80aV\xAD\x89\x82\x8A\x01aU\xCDV[`@\x86\x01Ra\x01\xC0aV\xC1\x8A\x82\x8B\x01aU\xCDV[``\x87\x01Ra\x02\0aV\xD5\x8B\x82\x8C\x01aU\xCDV[`\x80\x88\x01Ra\x02@aV\xE9\x8C\x82\x8D\x01aU\xCDV[`\xA0\x89\x01Ra\x02\x80aV\xFD\x8D\x82\x8E\x01aU\xCDV[`\xC0\x8A\x01Ra\x02\xC0aW\x11\x8E\x82\x8F\x01aU\xCDV[`\xE0\x8B\x01RaW$\x8Ea\x03\0\x8F\x01aU\xCDV[\x89\x8B\x01RaW6\x8Ea\x03@\x8F\x01aU\xCDV[a\x01 \x8B\x01RaWJ\x8Ea\x03\x80\x8F\x01aU\xCDV[\x87\x8B\x01RaW\\\x8Ea\x03\xC0\x8F\x01aU\xCDV[a\x01`\x8B\x01RaWp\x8Ea\x04\0\x8F\x01aU\xCDV[\x86\x8B\x01Ra\x04@\x8D\x015a\x01\xA0\x8B\x01Ra\x04`\x8D\x015\x85\x8B\x01R\x87\x8D\x015a\x01\xE0\x8B\x01Ra\x04\xA0\x8D\x015\x84\x8B\x01Ra\x04\xC0\x8D\x015a\x02 \x8B\x01Ra\x04\xE0\x8D\x015\x83\x8B\x01Ra\x05\0\x8D\x015a\x02`\x8B\x01Ra\x05 \x8D\x015\x82\x8B\x01Ra\x05@\x8D\x015a\x02\xA0\x8B\x01Ra\x05`\x8D\x015\x81\x8B\x01RPPPPPPPPP\x80\x91PP\x92P\x92\x90PV[`\0\x80`@\x83\x85\x03\x12\x15aX\x07W`\0\x80\xFD[aX\x10\x83aTtV[\x91P` \x80\x84\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15aX.W`\0\x80\xFD[\x81\x86\x01\x91P\x86`\x1F\x83\x01\x12aXBW`\0\x80\xFD[\x815\x81\x81\x11\x15aXTWaXTaT\xA6V[aXf\x84`\x1F\x19`\x1F\x84\x01\x16\x01aT\xE6V[\x91P\x80\x82R\x87\x84\x82\x85\x01\x01\x11\x15aX|W`\0\x80\xFD[\x80\x84\x84\x01\x85\x84\x017`\0\x84\x82\x84\x01\x01RP\x80\x93PPPP\x92P\x92\x90PV[\x805c\xFF\xFF\xFF\xFF\x81\x16\x81\x14a1\xF5W`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15aX\xC0W`\0\x80\xFD[a \x96\x82aX\x9AV[`\0\x80`\0a\x01@\x84\x86\x03\x12\x15aX\xDFW`\0\x80\xFD[aX\xE9\x85\x85aU/V[\x92PaX\xF8a\x01\0\x85\x01aX\x9AV[\x91PaY\x07a\x01 \x85\x01aTtV[\x90P\x92P\x92P\x92V[`\0a\x01\0\x82\x84\x03\x12\x15aY#W`\0\x80\xFD[a \x96\x83\x83aU/V[`\0[\x83\x81\x10\x15aYHW\x81\x81\x01Q\x83\x82\x01R` \x01aY0V[PP`\0\x91\x01RV[` \x81R`\0\x82Q\x80` \x84\x01RaYp\x81`@\x85\x01` \x87\x01aY-V[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x81\x16\x83\x82\x16\x02\x80\x82\x16\x91\x90\x82\x81\x14aD\xDDWaD\xDDaY\x84V[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x81\x16\x83\x82\x16\x01\x90\x80\x82\x11\x15a3\x82Wa3\x82aY\x84V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\0` \x82\x84\x03\x12\x15aZ\x07W`\0\x80\xFD[PQ\x91\x90PV[\x80\x82\x01\x80\x82\x11\x15a)\xFDWa)\xFDaY\x84V[`\0\x82QaZ3\x81\x84` \x87\x01aY-V[\x91\x90\x91\x01\x92\x91PPV[`\0\x87Q` aZP\x82\x85\x83\x8D\x01aY-V[\x88Q\x91\x84\x01\x91aZc\x81\x84\x84\x8D\x01aY-V[\x88Q\x92\x01\x91aZu\x81\x84\x84\x8C\x01aY-V[\x87Q\x92\x01\x91aZ\x87\x81\x84\x84\x8B\x01aY-V[\x86Q\x92\x01\x91aZ\x99\x81\x84\x84\x8A\x01aY-V[\x85Q\x92\x01\x91aZ\xAB\x81\x84\x84\x89\x01aY-V[\x91\x90\x91\x01\x99\x98PPPPPPPPPV[`\0\x83QaZ\xCE\x81\x84` \x88\x01aY-V[\x83Q\x90\x83\x01\x90aZ\xE2\x81\x83` \x88\x01aY-V[\x01\x94\x93PPPPV[`\0\x87QaZ\xFD\x81\x84` \x8C\x01aY-V[\x91\x90\x91\x01\x95\x86RP` \x85\x01\x93\x90\x93R`@\x84\x01\x91\x90\x91R``\x83\x01R`\x80\x82\x01R`\xA0\x01\x91\x90PV[`\0\x84Qa[9\x81\x84` \x89\x01aY-V[\x84Q\x90\x83\x01\x90a[M\x81\x83` \x89\x01aY-V[\x84Q\x91\x01\x90a[`\x81\x83` \x88\x01aY-V[\x01\x95\x94PPPPPV[cNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[`\0\x82a[\x9DWcNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[P\x06\x90V[\x81\x81\x03\x81\x81\x11\x15a)\xFDWa)\xFDaY\x84V[`\0\x85Qa[\xC7\x81\x84` \x8A\x01aY-V[\x85Q\x90\x83\x01\x90a[\xDB\x81\x83` \x8A\x01aY-V[\x85Q\x91\x01\x90a[\xEE\x81\x83` \x89\x01aY-V[\x84Q\x91\x01\x90a\\\x01\x81\x83` \x88\x01aY-V[\x01\x96\x95PPPPPPV[`\0\x89Q` a\\\x1F\x82\x85\x83\x8F\x01aY-V[\x8AQ\x91\x84\x01\x91a\\2\x81\x84\x84\x8F\x01aY-V[\x8AQ\x92\x01\x91a\\D\x81\x84\x84\x8E\x01aY-V[\x89Q\x92\x01\x91a\\V\x81\x84\x84\x8D\x01aY-V[\x88Q\x92\x01\x91a\\h\x81\x84\x84\x8C\x01aY-V[\x87Q\x92\x01\x91a\\z\x81\x84\x84\x8B\x01aY-V[\x86Q\x92\x01\x91a\\\x8C\x81\x84\x84\x8A\x01aY-V[\x85Q\x92\x01\x91a\\\x9E\x81\x84\x84\x89\x01aY-V[\x91\x90\x91\x01\x9B\x9APPPPPPPPPPPV[`\0\x88Q` a\\\xC4\x82\x85\x83\x8E\x01aY-V[\x89Q\x91\x84\x01\x91a\\\xD7\x81\x84\x84\x8E\x01aY-V[\x89Q\x92\x01\x91a\\\xE9\x81\x84\x84\x8D\x01aY-V[\x88Q\x92\x01\x91a\\\xFB\x81\x84\x84\x8C\x01aY-V[\x87Q\x92\x01\x91a]\r\x81\x84\x84\x8B\x01aY-V[\x86Q\x92\x01\x91a]\x1F\x81\x84\x84\x8A\x01aY-V[\x85Q\x92\x01\x91a]1\x81\x84\x84\x89\x01aY-V[\x91\x90\x91\x01\x9A\x99PPPPPPPPPPV[`\0\x8AQa]U\x81\x84` \x8F\x01aY-V[\x91\x90\x91\x01\x98\x89RP` \x88\x01\x96\x90\x96R`@\x87\x01\x94\x90\x94R``\x86\x01\x92\x90\x92R`\x80\x85\x01R`\xA0\x84\x01R`\xC0\x83\x01R`\xE0\x82\x01Ra\x01\0\x01\x91\x90PV\xFE\xA1dsolcC\0\x08\x17\0\n";
+ const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R`\x046\x10a\x01RW`\x005`\xE0\x1C\x80c\x01?\xA5\xFC\x14a\x01WW\x80c\r\x8En,\x14a\x01yW\x80c1=\xF7\xB1\x14a\x01\xABW\x80c8+!Z\x14a\x01\xD8W\x80c@\x999\xB7\x14a\x01\xFCW\x80cHG\xAE]\x14a\x02\x1CW\x80cO\x1E\xF2\x86\x14a\x02\x9EW\x80cR\xD1\x90-\x14a\x02\xB1W\x80cTd`\x85\x14a\x02\xC6W\x80cb\x82w3\x14a\x02\xDBW\x80ci\xCCj\x04\x14a\x02\xF1W\x80cpS\xFCQ\x14a\x03\x06W\x80cqP\x18\xA6\x14a\x03\x1BW\x80cvg\x18\x08\x14a\x030W\x80cv\xB6\xB7\xCB\x14a\x03dW\x80c\x7F\x17\xBA\xAD\x14a\x03zW\x80c\x82\xD0\x7F\xF3\x14a\x04-W\x80c\x85\x84\xD2?\x14a\x04BW\x80c\x8D\xA5\xCB[\x14a\x04\x86W\x80c\xA2D\xD5\x96\x14a\x04\x9BW\x80c\xA5\x1Eo\xEA\x14a\x04\xBBW\x80c\xAA\x92'2\x14a\x04\xDBW\x80c\xAD<\xB1\xCC\x14a\x04\xFBW\x80c\xBD2Q\x9A\x14a\x059W\x80c\xCAo\xE8U\x14a\x05jW\x80c\xDB\x13\xB6\n\x14a\x05\x80W\x80c\xE003\x01\x14a\x05\xBFW\x80c\xF0h T\x14a\x05\xDFW\x80c\xF2\xFD\xE3\x8B\x14a\x06\x11W[`\0\x80\xFD[4\x80\x15a\x01cW`\0\x80\xFD[Pa\x01wa\x01r6`\x04aO\xA1V[a\x061V[\0[4\x80\x15a\x01\x85W`\0\x80\xFD[P`@\x80Q`\x01\x81R`\0` \x82\x01\x81\x90R\x91\x81\x01\x91\x90\x91R``\x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\xB7W`\0\x80\xFD[P`\x06Ta\x01\xCB\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Qa\x01\xA2\x91\x90aO\xBCV[4\x80\x15a\x01\xE4W`\0\x80\xFD[Pa\x01\xEE`\x03T\x81V[`@Q\x90\x81R` \x01a\x01\xA2V[4\x80\x15a\x02\x08W`\0\x80\xFD[Pa\x01wa\x02\x176`\x04aQAV[a\x06\xF1V[4\x80\x15a\x02(W`\0\x80\xFD[Pa\x021a\n\x1CV[`@Qa\x01\xA2\x91\x90`\0a\x01\0\x82\x01\x90P`\x01\x80`@\x1B\x03\x80\x84Q\x16\x83R\x80` \x85\x01Q\x16` \x84\x01RP`@\x83\x01Q`@\x83\x01R``\x83\x01Q``\x83\x01R`\x80\x83\x01Q`\x80\x83\x01R`\xA0\x83\x01Q`\xA0\x83\x01R`\xC0\x83\x01Q`\xC0\x83\x01R`\xE0\x83\x01Q`\xE0\x83\x01R\x92\x91PPV[a\x01wa\x02\xAC6`\x04aR\xFBV[a\n\xAEV[4\x80\x15a\x02\xBDW`\0\x80\xFD[Pa\x01\xEEa\n\xCDV[4\x80\x15a\x02\xD2W`\0\x80\xFD[P`\x08Ta\x01\xEEV[4\x80\x15a\x02\xE7W`\0\x80\xFD[Pa\x01\xEE`\x02T\x81V[4\x80\x15a\x02\xFDW`\0\x80\xFD[Pa\x01wa\n\xEAV[4\x80\x15a\x03\x12W`\0\x80\xFD[P`\x07Ta\x01\xEEV[4\x80\x15a\x03'W`\0\x80\xFD[Pa\x01wa\x0BZV[4\x80\x15a\x03F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x14\xD4a\x10^V[\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x81`@Qa\x06\xE6\x91\x90aO\xBCV[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x15]WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x15Z\x91\x81\x01\x90aUrV[`\x01[a\x15|W\x81`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x04\x01a\x08[\x91\x90aO\xBCV[`\0\x80Q` aY]\x839\x81Q\x91R\x81\x14a\x15\xADW`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x08[V[a\x15\xB7\x83\x83a \xB2V[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\x0BXW`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\x16\x0Fa\x16aV[\x80T`\x01`\x01`\xA0\x1B\x03\x84\x81\x16`\x01`\x01`\xA0\x1B\x03\x19\x83\x16\x81\x17\x84U`@Q\x93\x94P\x91\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90`\0\x90\xA3PPPV[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x90V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90V[a\x16\xB1a!\x08V[a\x10[\x81a!-V[a\x0BXa!\x08V[\x81Q`\x01`\x01`@\x1B\x03\x16\x15\x15\x80a\x16\xE6WP` \x82\x01Q`\x01`\x01`@\x1B\x03\x16\x15\x15[\x80a\x16\xF3WP`\x80\x82\x01Q\x15[\x80a\x17\0WP`\xA0\x82\x01Q\x15[\x80a\x17\rWP`\xC0\x82\x01Q\x15[\x80a\x17\x1AWP`\xE0\x82\x01Q\x15[\x80a\x17)WPc\xFF\xFF\xFF\xFF\x81\x16\x15[\x15a\x17GW`@QcP\xDD\x03\xF7`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81`\x05`\0\x80`\x04\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP\x81`\x05`\0\x80`\x08\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP`\0\x80`\x0Ca\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP\x80`\0\x80a\x01\0\n\x81T\x81c\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83c\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\0a\x19-\x83a\x0E\xBDV[`\x01\x81\x81U`\xE0\x85\x01Q`\x02\x81\x81U`\x03\x93\x90\x93U`\x04U`\x07\x80T\x80\x83\x01\x82U`\0\x91\x82RC`\0\x80Q` aY\x1D\x839\x81Q\x91R\x90\x91\x01U`@\x80Q\x80\x82\x01\x82R` \x80\x89\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16\x83R\x92\x90\x98\x01Q\x97\x81\x01\x97\x88R`\x08\x80T\x94\x85\x01\x81U\x90\x92R\x90Q`\0\x80Q` aY\x9D\x839\x81Q\x91R\x92\x90\x93\x02\x91\x82\x01\x80T`\x01`\x01`@\x1B\x03\x19\x16\x93\x90\x91\x16\x92\x90\x92\x17\x90\x91U\x92Q`\0\x80Q` aY\xDD\x839\x81Q\x91R\x90\x93\x01\x92\x90\x92UPPV[a\x19\xEDaM\xF6V[b\x10\0\0\x81R`\x08` \x82\x01R\x7F \xC9@13\xDF\xDE\x9A\x9D8-\xF7o\xB0R5qd\x87%\xAB\xC0\xA7\xC1(0\xBBi\x0E\xC8;3`@\x82\x01QR\x7F\x03\xA0\xA9\xAC\xC3\xE3\x81Z~\xD6\xCB\x13y\xF7\xD1W\xE641dr\x93v9*i:\xCB\xD3\xEC(<` `@\x83\x01Q\x01R\x7F(f\xC1\x8A\xD1\xDF\x10\xEF\x13T,\xCEbP\xCE\x02\xCB*kr\xAE\0\xA9\x85.'\x11\x87\xE9\xE4\xE0\xDB``\x82\x01QR\x7F!\xBE#*B$jVc\xEB\xF4\x83G\x0C\xCAfo\xFE\x9DO\x0Ec\xB9)\xC5\x96\xA7e\x87\x14\xE9p` ``\x83\x01Q\x01R\x7F\x07\xD7xs\xB9\x86\0t\x11\x8Eu\x80\x8CyF\x8B\x83\xC8\xEDd\xBA\x14\xDB\\\xB5\xAF\xA8\xE54\xDE{\x99`\x80\x82\x01QR\x7F\x0B\xE0\xF4H\x83\x90\x80\x13-G\xDE\x17\xDE\0\x99\xB4\xCDt\xAE\x1Ekq\xCD\xDA\x06\xCD\xEB\xB8h\xA5\x0Cm` `\x80\x83\x01Q\x01R\x7F\x13\xBDE\xA0#I\x1E\xAD\xEAD\xCC?$\xCF\xBD\x17\x96\xEA\xDE\x9C\x0E9\xEE\x81\xD9\xF6>\xA0\xA5\x80f%`\xA0\x82\x01QR\x7F\x18\xF9\\\xDD\xA4,\xE1\x1D\x9D\x10\xA3\xB35\xAC\xC2\x14\xE3\x80|W\x8CSY@]\x81\x0C \x8D\xF6\0\x93` `\xA0\x83\x01Q\x01R\x7F\tp\xD9xv4a\xF0\x9E\x9E\xC64T\x074\x978nM(/\xED\xC2\xAC[\x96|\xB9\xFD?\xA8\xA9`\xC0\x82\x01QR\x7F(\xC2!\x7F{\xAC\xF6\xF8\xB2\xB8\xEEJ\x90\xFC\xF8\xB5\xBC\xA0B\x05\xEA\x84\xE8\xE1\xEBT\xB8]\xD4\x1B\xDE(` `\xC0\x83\x01Q\x01R\x7F\x02\xFE=\x02\x98\x8D\xB7\x188\0R\x97\n\xBAF\xA3)m\xF5\xF2\x9Bsk\xA1\xF2\xC4\xCC\xFF\xC8\xB5\x96\x93`\xE0\x82\x01QR\x7F ,>9\x0C\xEE|\\\x85%\xDA#)\xA1\x9FI6\xF6\xF7\x1C\xA9}\xDElo\xA3+8-Z\xCC\x03` `\xE0\x83\x01Q\x01R\x7F#\xAC\x10\xAEl\xA5\xCA\xCE\xE8tK\xB99\xAA\xA859\tT\xB9\x1A\xE6h\xA2\xC8\xD0\xED\xDAU\x8A\x89\xE7a\x01\0\x82\x01QR\x7F\x1C\x8C+\x85l\xDA\xDE%k\xA3#\x7F9\xAF\xD5\xE1p\xA9S \x12\xF7\xAE\xCA\xE4\x9DE\x9B)\xF6\xF6\xAD` a\x01\0\x83\x01Q\x01R\x7F\x16\xEC\x03\xD2`\xBDz\xC1\xC5\x0F\xFAcV]Rt\xB4X,\xEE\xA5/\xF4\x0B\x81\xCD\xFE\x8FDO\x01\xE4a\x01 \x82\x01QR\x7F)9!Rr0\x97\xE0q\x13\xC3\xD7xm$^\xC4\x0C0\x92\x80\x15\xCDP\xB5f\x8AON\xA1p1` a\x01 \x83\x01Q\x01R\x7F,\xDB\xFB:@S\xC8H\x9B\x0C\x94\xE7C8\xAC\x19\x11\x8D\xF7\xA0k\xC5k\x1E\xB4\xD0\xE0\xDCN\xAErHa\x01@\x82\x01QR\x7F\x07\xFE\xA1'\xDA\xE9C\xB8\xDC\x14\x8F\x14\x08\xD4\x0C\xFFF\\\x9CG!\x946i\xB1\xE4\xFDZ9\xDBp6` a\x01@\x83\x01Q\x01R\x7F\x03\x14U\xA7\x9A.\x0C\xE7\x8Al\xB55&\xEC\x04\xAC\x19qj\x86\xB0\x8A\x93\xDFH\xD1x\xF8\xB7~V\x19a\x01`\x82\x01QR\x7F\x11\x86#\xE6\xBC\x13n\xE6\xD3\xF9\x90|\xD4\xAD\x04\xA9A\x8E\xA0;\xA9\x9A\xD7S\"|\xDF\xEEY\x8E\x84\x15` a\x01`\x83\x01Q\x01R\x7F\x08a\xD1\x99wa\xA8R\"j\xAC{\xA9q{\xF6\xAEVE\x10\x99\xBEwL\xDF\x02\xEF5*X\xCB\xC8a\x01\x80\x82\x01QR\x7F\x08\x05\xE3\x92\xBC\xBC\x12\xE4\nr'xc-s\xFE\x98\x1EK\xC6\xFAm\x11x\xB7\n\xF7\xBE\x1C\xB9\xA3\xA3` a\x01\x80\x83\x01Q\x01R\x7F\x10\x1D\x1E9x\xCB\x9F\x1E0=A1D\xEB\xE6v\x82\xC9\xEB\x0C\xFE\x11$)Y\xAA`)\xD7\x8C\xDB\xBCa\x01\xA0\x82\x01QR\x7F\x08\x9E\xB9\xC7'\xE6\xCB\x07\x08+\xC3\xE6\xF4\x0C\xF0OC\x9F\xE4\x80\0`+XGt\xDA\xD7\xEF\xC6`|` a\x01\xA0\x83\x01Q\x01R\x7F-H\x9F$\x93&:\xA8s\xBC\xD9O!\xEF\xB4[\xF2W\xA6\x1D\x81\xC0\xC9\\2\x97\x91e\x06e;@a\x01\xC0\x82\x01QR\x7F\x18\xE4]bz\xAD\xD4\xDF'\x94\xEC\xD9\x90\x9F\xAC\x1Au?\x0Co\xA8\xA9\xC6eJzX\xB0\x91/\xFF\xD5` a\x01\xC0\x83\x01Q\x01R\x7F\x0EC\xE3\xA4\xB1<\xB48\xE2\xAD\x92F\x14&\x1A\xD0$\x02\x14\xFA\x1C\x83\xFC\xDAj\x0B\xF7y\xEB9\xFF\xC5a\x01\xE0\x82\x01QR\x7F\x0E\xAB\xA9\xF4)\xC5\xF6\xFC1\x03\xD4\xCC@V\xC5\0\xFFBB]\x8Ede\xC5\xB8\xE1E!\x9F\x9C\\\xD3` a\x01\xE0\x83\x01Q\x01R\x7F)\xAE5\x1D\t\xDC\xF4\x1C\n\x80\xAB\x059785\x8B\xAA\xB3~o\xBCFK;\xB12X\x99J\x1F\xA4a\x02\0\x82\x01QR\x7F+{\xC7F\x08\xD7\xEC}\xAD\xD0Y}j@\x10\xD8\xBF\xC2\xB3\x19\0(\x19\x01\xCE\xDCB\xBD\xBB\x0F\xB8\xFC` a\x02\0\x83\x01Q\x01R\x7F\x06h\x02\xC7\xCE\xB9\xE9\x13\xD4\xF6T3\xA2\x06a\xE0\x97\xAC\xAC\x1A\xFF\xEC\xBBSJT\xF7j)x\"&a\x02 \x82\x01QR\x7F'\xEC\x80\xE8\x11\xE66\xF34\x82g\x92<\x8Ed\x1B\xD9\x8A~7\xC5!fp\xCB\xFF\x14\xAE2?\x9E\x0E` a\x02 \x83\x01Q\x01R\x7F\x12`M\x1F\x87\xC5\x83\xF6\xC9q\x0Cs\xEA\xF5\x90\xAF\x9D\x07\xAAt=\x13\x81\xD0\xE9\xDF\xF0\xEA\xB2aB9a\x02@\x82\x01QR\x7F\x15\x88W\x9El3x\xEA2\xCBd\x12\x05\xEFv*c\xCD5:\x0B\xD6p9E(\xAD \x81\xEE\x8D\xD4` a\x02@\x83\x01Q\x01R\x7F$}e&\x1D:J\xB0B\xBA\x93s1\xF6\xD0\xC0\xC5\xEB\x9E\xA7\x87S\xA9 \x84\xDB\x1Ai9\xE1\x9E\x82a\x02`\x82\x01QR\x7F,\xE6\xCCfJ2\x14{\xFEj\x0C\x94\xA9[\xF0Ify@\\\xCA\xE0\x16H\xCDN\xC0!\x14Q \xD5` a\x02`\x83\x01Q\x01R\x90V[`\0a\x1F\xD2\x82a!5V[a\x1F\xF5\x83`\0\x81Q\x81\x10a\x1F\xE8Wa\x1F\xE8aU%V[` \x02` \x01\x01Qa\x10\x90V[a \x0B\x83`\x01\x81Q\x81\x10a\x1F\xE8Wa\x1F\xE8aU%V[a !\x83`\x02\x81Q\x81\x10a\x1F\xE8Wa\x1F\xE8aU%V[a 7\x83`\x03\x81Q\x81\x10a\x1F\xE8Wa\x1F\xE8aU%V[a M\x83`\x04\x81Q\x81\x10a\x1F\xE8Wa\x1F\xE8aU%V[a c\x83`\x05\x81Q\x81\x10a\x1F\xE8Wa\x1F\xE8aU%V[a y\x83`\x06\x81Q\x81\x10a\x1F\xE8Wa\x1F\xE8aU%V[a \x8F\x83`\x07\x81Q\x81\x10a\x1F\xE8Wa\x1F\xE8aU%V[`\0a \x9C\x85\x85\x85a\"mV[\x90Pa \xA7\x81a#\xB7V[\x91PP[\x93\x92PPPV[a \xBB\x82a(\x16V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a!\0Wa\x15\xB7\x82\x82a(rV[a\n\xC9a(\xE8V[a!\x10a)\x07V[a\x0BXW`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x10(a!\x08V[\x80Qa!@\x90a)!V[a!M\x81` \x01Qa)!V[a!Z\x81`@\x01Qa)!V[a!g\x81``\x01Qa)!V[a!t\x81`\x80\x01Qa)!V[a!\x81\x81`\xA0\x01Qa)!V[a!\x8E\x81`\xC0\x01Qa)!V[a!\x9B\x81`\xE0\x01Qa)!V[a!\xA9\x81a\x01\0\x01Qa)!V[a!\xB7\x81a\x01 \x01Qa)!V[a!\xC5\x81a\x01@\x01Qa)!V[a!\xD3\x81a\x01`\x01Qa)!V[a!\xE1\x81a\x01\x80\x01Qa)!V[a!\xEF\x81a\x01\xA0\x01Qa\x10\x90V[a!\xFD\x81a\x01\xC0\x01Qa\x10\x90V[a\"\x0B\x81a\x01\xE0\x01Qa\x10\x90V[a\"\x19\x81a\x02\0\x01Qa\x10\x90V[a\"'\x81a\x02 \x01Qa\x10\x90V[a\"5\x81a\x02@\x01Qa\x10\x90V[a\"C\x81a\x02`\x01Qa\x10\x90V[a\"Q\x81a\x02\x80\x01Qa\x10\x90V[a\"_\x81a\x02\xA0\x01Qa\x10\x90V[a\x10[\x81a\x02\xC0\x01Qa\x10\x90V[a\"uaN\xFAV[\x83` \x01Q\x83Q\x14a\"\x9AW`@Qc \xFA\x9D\x89`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\"\xA7\x85\x85\x85a)\xAFV[\x90P`\0a\"\xB8\x86`\0\x01Qa,\xCEV[\x90P`\0a\"\xCB\x82\x84`\xA0\x01Q\x88a0\x99V[`@\x80Q`\x1E\x80\x82Ra\x03\xE0\x82\x01\x90\x92R\x91\x92P`\0\x91\x90` \x82\x01a\x03\xC0\x806\x837PP`@\x80Q`\x1E\x80\x82Ra\x03\xE0\x82\x01\x90\x92R\x92\x93P`\0\x92\x91P` \x82\x01[a#\x16aO4V[\x81R` \x01\x90`\x01\x90\x03\x90\x81a#\x0EW\x90PP\x90P`\0a#;\x8A\x85\x8A\x89\x87\x87a0\xF9V[`\xA0\x87\x01Q``\x87\x01Q\x91\x92P\x90`\0\x80Q` aY}\x839\x81Q\x91R`\0\x81\x83\x85\t`@\x80Qa\x01\0\x81\x01\x82R`\xE0\x9C\x8D\x01Q\x81R` \x81\x01\x96\x90\x96R\x85\x01RPPP``\x81\x01\x91\x90\x91R`\x80\x81\x01\x92\x90\x92R`\xA0\x82\x01Ra\x01`\x86\x01Q`\xC0\x82\x01Ra\x01\x80\x90\x95\x01Q\x92\x85\x01\x92\x90\x92RP\x91\x94\x93PPPPV[`\0`\0\x80Q` aY}\x839\x81Q\x91Ra#\xD0aO4V[a#\xD8aO4V[`@\x80Q`\x02\x80\x82R``\x82\x01\x83R`\0\x92` \x83\x01\x90\x806\x837PP`@\x80Q`\x02\x80\x82R``\x82\x01\x90\x92R\x92\x93P`\0\x92\x91P` \x82\x01[a$\x1AaO4V[\x81R` \x01\x90`\x01\x90\x03\x90\x81a$\x12W\x90PP\x90P`\0`\x01\x90P\x80\x83`\0\x81Q\x81\x10a$IWa$IaU%V[` \x02` \x01\x01\x81\x81RPP\x87`\xC0\x01Q\x82`\0\x81Q\x81\x10a$mWa$maU%V[` \x02` \x01\x01\x81\x90RP\x87`\0\x01Q\x83`\x01\x81Q\x81\x10a$\x90Wa$\x90aU%V[` \x02` \x01\x01\x81\x81RPP\x87`\xE0\x01Q\x82`\x01\x81Q\x81\x10a$\xB4Wa$\xB4aU%V[` \x02` \x01\x01\x81\x90RPa$\xC9\x82\x84a1.V[`\x80\x89\x01QQ\x90\x95P``\x93P\x83\x92P\x90P`\0a$\xE8\x82`\x02aU\x8BV[a$\xF3\x90`\x01aU\x8BV[\x90P\x80`\x01`\x01`@\x1B\x03\x81\x11\x15a%\rWa%\raO\xD0V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a%6W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x93P\x80`\x01`\x01`@\x1B\x03\x81\x11\x15a%QWa%QaO\xD0V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a%\x8AW\x81` \x01[a%waO4V[\x81R` \x01\x90`\x01\x90\x03\x90\x81a%oW\x90P[P\x92PPP`\0\x80`\0[\x89`\x80\x01QQ\x81\x10\x15a&.W\x89`\x80\x01Q\x81\x81Q\x81\x10a%\xB8Wa%\xB8aU%V[` \x02` \x01\x01Q\x85\x83\x81Q\x81\x10a%\xD2Wa%\xD2aU%V[` \x02` \x01\x01\x81\x81RPP\x89`\xA0\x01Q\x81\x81Q\x81\x10a%\xF4Wa%\xF4aU%V[` \x02` \x01\x01Q\x84\x83\x81Q\x81\x10a&\x0EWa&\x0EaU%V[` \x90\x81\x02\x91\x90\x91\x01\x01Ra&$`\x01\x83aU\x8BV[\x91P`\x01\x01a%\x95V[P\x88` \x01Q\x84\x82\x81Q\x81\x10a&FWa&FaU%V[` \x02` \x01\x01\x81\x81RPP\x88`\xC0\x01Q\x83\x82\x81Q\x81\x10a&iWa&iaU%V[` \x90\x81\x02\x91\x90\x91\x01\x01Ra&\x7F`\x01\x82aU\x8BV[\x89Q`@\x8B\x01Q\x91\x92P\x90`\0\x89\x82\x84\t\x90P\x80\x87\x85\x81Q\x81\x10a&\xA5Wa&\xA5aU%V[` \x02` \x01\x01\x81\x81RPPPPP\x88`\xE0\x01Q\x83\x82\x81Q\x81\x10a&\xCBWa&\xCBaU%V[` \x90\x81\x02\x91\x90\x91\x01\x01Ra&\xE1`\x01\x82aU\x8BV[``\x8A\x01Q\x90\x91P\x87\x81\x84\x08\x92PPa&\xF9\x82a2\x1CV[\x84\x82\x81Q\x81\x10a'\x0BWa'\x0BaU%V[` \x02` \x01\x01\x81\x81RPPa'\x1Fa2NV[\x83\x82\x81Q\x81\x10a'1Wa'1aU%V[` \x02` \x01\x01\x81\x90RPa'Na'I\x84\x86a1.V[a2oV[\x94PPPPP`\0`@Q\x80`\x80\x01`@R\x80\x7F\x01\x18\xC4\xD5\xB87\xBC\xC2\xBC\x89\xB5\xB3\x98\xB5\x97N\x9FYD\x07;2\x07\x8B~#\x1F\xEC\x93\x88\x83\xB0\x81R` \x01\x7F&\x0E\x01\xB2Q\xF6\xF1\xC7\xE7\xFFNX\x07\x91\xDE\xE8\xEAQ\xD8z5\x8E\x03\x8BN\xFE0\xFA\xC0\x93\x83\xC1\x81R` \x01\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U\x81R` \x01\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4\x81RP\x90Pa(\x0C\x83\x82\x84a(\x07a2\xDCV[a3\xADV[\x96\x95PPPPPPV[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a(CW\x80`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x04\x01a\x08[\x91\x90aO\xBCV[`\0\x80Q` aY]\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa(\x8F\x91\x90aU\x9EV[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a(\xCAW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a(\xCFV[``\x91P[P\x91P\x91Pa(\xDF\x85\x83\x83a4\x90V[\x95\x94PPPPPV[4\x15a\x0BXW`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a)\x11a\x16\x85V[T`\x01`@\x1B\x90\x04`\xFF\x16\x91\x90PV[`\0`\0\x80Q` aX\xFD\x839\x81Q\x91Ra);\x83a4\xE3V[\x15a)EWPPPV[\x82Q` \x84\x01Q\x82`\x03\x84\x85\x85\x86\t\x85\t\x08\x83\x82\x83\t\x14\x83\x82\x10\x84\x84\x10\x16\x16\x93PPP\x81a\x15\xB7W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x17`$\x82\x01Rv\x10\x9B\x8C\x8DM\x0E\x88\x1A[\x9D\x98[\x1AY\x08\x11\xCCH\x1C\x1B\xDA[\x9D`J\x1B`D\x82\x01R`d\x01a\x08[V[a)\xF7`@Q\x80a\x01\0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`@\x80Q\x80\x82\x01\x90\x91R``\x81R`\0` \x82\x01R`\0\x80Q` aY}\x839\x81Q\x91Ra*&\x82\x87\x87a4\xF2V[\x81Q\x84Qa*3\x90a8\x8BV[a*@\x86` \x01Qa8\x8BV[a*M\x87`@\x01Qa8\x8BV[a*Z\x88``\x01Qa8\x8BV[a*g\x89`\x80\x01Qa8\x8BV[`@Q` \x01a*|\x96\x95\x94\x93\x92\x91\x90aU\xBAV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra*\x97\x82a9\0V[Pa*\xA1\x82a9\0V[``\x84\x01Ra*\xAF\x82a9\0V[`\x80\x84\x01R\x81Q`\xA0\x85\x01Qa*\xC4\x90a8\x8BV[`@Q` \x01a*\xD5\x92\x91\x90aV9V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra*\xF0\x82a9\0V[\x83R\x81Q`\xC0\x85\x01Qa+\x02\x90a8\x8BV[a+\x0F\x86`\xE0\x01Qa8\x8BV[a+\x1D\x87a\x01\0\x01Qa8\x8BV[a++\x88a\x01 \x01Qa8\x8BV[a+9\x89a\x01@\x01Qa8\x8BV[`@Q` \x01a+N\x96\x95\x94\x93\x92\x91\x90aU\xBAV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra+i\x82a9\0V[`\xA0\x84\x01R\x81Qa\x01\xA0\x85\x01Qa+\x7F\x90a9bV[a+\x8D\x86a\x01\xC0\x01Qa9bV[a+\x9B\x87a\x01\xE0\x01Qa9bV[a+\xA9\x88a\x02\0\x01Qa9bV[a+\xB7\x89a\x02 \x01Qa9bV[`@Q` \x01a+\xCC\x96\x95\x94\x93\x92\x91\x90aVhV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x83Ra\x02@\x85\x01Qa+\xEE\x90a9bV[a+\xFC\x86a\x02`\x01Qa9bV[a,\n\x87a\x02\x80\x01Qa9bV[a,\x18\x88a\x02\xA0\x01Qa9bV[a,&\x89a\x02\xC0\x01Qa9bV[`@Q` \x01a,;\x96\x95\x94\x93\x92\x91\x90aVhV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra,V\x82a9\0V[`\xC0\x84\x01R\x81Qa\x01`\x85\x01Qa,l\x90a8\x8BV[a,z\x86a\x01\x80\x01Qa8\x8BV[`@Q` \x01a,\x8C\x93\x92\x91\x90aV\xA4V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra,\xA7\x82a9\0V[`\xE0\x84\x01R\x82Q\x81\x81\x80\t\x82\x82\x82\t` \x86\x01\x91\x90\x91R`@\x85\x01RP\x91\x95\x94PPPPPV[a-\0`@Q\x80`\xA0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[\x81b\x01\0\0\x03a-\x94WP`@\x80Q`\xA0\x81\x01\x82R`\x10\x81R` \x81\x01\x92\x90\x92R\x7F0d\x1E\x0E\x92\xBE\xBE\xF8\x18&\x8Df;\xCA\xD6\xDB\xCF\xD6\xC0\x14\x91p\xF6\xD7\xD3P\xB1\xB1\xFAl\x10\x01\x90\x82\x01R~\xEE\xB2\xCBY\x81\xEDEd\x9A\xBE\xBD\xE0\x81\xDC\xFF\x16\xC8`\x1D\xE44~}\xD1b\x8B\xA2\xDA\xACC\xB7``\x82\x01R\x7F\x0B]V\xB7\x7F\xE7\x04\xE8\xE9#8\xC0\x08/7\xE0\x91\x12d\x14\xC80\xE4\xC6\x92-Z\xC8\x02\xD8B\xD4`\x80\x82\x01R\x90V[\x81b\x02\0\0\x03a.)WP`@\x80Q`\xA0\x81\x01\x82R`\x11\x81R` \x81\x01\x92\x90\x92R\x7F0d6@\xB9\xF8/\x90\xE8;i\x8E^\xA6\x17\x9C|\x05T.\x85\x953\xB4\x8B\x99S\xA2\xF56\x08\x01\x90\x82\x01R\x7F\x1B\xF8-\xEB\xA7\xD7I\x02\xC3p\x8C\xC6\xE7\x0Ea\xF3\x05\x12\xEC\xA9VU!\x0E'nXX\xCE\x8FX\xE5``\x82\x01R\x7F$L\xF0\x10\xC4<\xA8r7\xD8\xB0\x0B\xF9\xDDP\xC4\xC0\x1C\x7F\x08k\xD4\xE8\xC9 \xE7RQ\xD9o\r\"`\x80\x82\x01R\x90V[\x81b\x04\0\0\x03a.\xBEWP`@\x80Q`\xA0\x81\x01\x82R`\x12\x81R` \x81\x01\x92\x90\x92R\x7F0dBY\xCD\x94\xE7\xDDPE\xD7\xA2p\x13\xB7\xFC\xD2\x1C\x9E;\x7F\xA7R\"\xE7\xBD\xA4\x9Br\x9B\x04\x01\x90\x82\x01R\x7F\x19\xDD\xBC\xAF:\x8DF\xC1\\\x01v\xFB\xB5\xB9^M\xC5p\x88\xFF\x13\xF4\xD1\xBD\x84\xC6\xBF\xA5}\xCD\xC0\xE0``\x82\x01R\x7F\x03hS\xF0\x83x\x0E\x87\xF8\xD7\xC7\x1D\x11\x11\x19\xC5}\xBE\x11\x8C\"\xD5\xADpz\x821tf\xC5\x17L`\x80\x82\x01R\x90V[\x81b\x08\0\0\x03a/SWP`@\x80Q`\xA0\x81\x01\x82R`\x13\x81R` \x81\x01\x92\x90\x92R\x7F0dHfWcD\x03\x84K\x0E\xACx\xCA\x88,\xFD(CA\xFC\xB0aZ\x15\xCF\xCD\x17\xB1M\x82\x01\x90\x82\x01R\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD``\x82\x01R\x7F\x06\xE4\x02\xC0\xA3\x14\xFBg\xA1\\\xF8\x06fJ\xE1\xB7\"\xDB\xC0\xEF\xE6nl\x81\xD9\x8F\x99$\xCASS!`\x80\x82\x01R\x90V[\x81b\x10\0\0\x03a/\xE8WP`@\x80Q`\xA0\x81\x01\x82R`\x14\x81R` \x81\x01\x92\x90\x92R\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x90\x82\x01R\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW``\x82\x01R\x7F\x10\x0C3-!\0\x89_\xABds\xBC,Q\xBF\xCAR\x1FE\xCB;\xAC\xA6&\x08R\xA8\xFD\xE2l\x91\xF3`\x80\x82\x01R\x90V[\x81` \x03a0{WP`@\x80Q`\xA0\x81\x01\x82R`\x05\x81R` \x81\x01\x92\x90\x92R\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x90\x82\x01R\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0``\x82\x01R\x7F'$q6\x03\xBF\xBDy\n\xEA\xF3\xE7\xDF%\xD8\xE7\xEF\x8F1\x134\x90[M\x8C\x99\x98\x0C\xF2\x10\x97\x9D`\x80\x82\x01R\x90V[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x91\x90PV[a0\xBD`@Q\x80``\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[a0\xC7\x84\x84a:\x99V[\x80\x82Ra0\xD7\x90\x85\x90\x85\x90a:\xEDV[` \x82\x01R\x80Qa0\xED\x90\x85\x90\x84\x90\x86\x90a;aV[`@\x82\x01R\x93\x92PPPV[`\0\x80a1\x07\x85\x87\x89a=\x15V[\x90Pa1\x17\x88\x86\x89\x89\x88\x88a>\x05V[a1\"\x81\x87\x86aA\x11V[\x98\x97PPPPPPPPV[a16aO4V[\x82Q\x82Q\x14a1\x87W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FMSM error: length does not match`D\x82\x01R`d\x01a\x08[V[a1\xC5\x83`\0\x81Q\x81\x10a1\x9DWa1\x9DaU%V[` \x02` \x01\x01Q\x83`\0\x81Q\x81\x10a1\xB8Wa1\xB8aU%V[` \x02` \x01\x01QaAaV[\x90P`\x01[\x82Q\x81\x10\x15a2\x15Wa2\x0B\x82a2\x06\x86\x84\x81Q\x81\x10a1\xECWa1\xECaU%V[` \x02` \x01\x01Q\x86\x85\x81Q\x81\x10a1\xB8Wa1\xB8aU%V[aA\xF5V[\x91P`\x01\x01a1\xCAV[P\x92\x91PPV[`\0a26`\0\x80Q` aY}\x839\x81Q\x91R\x83aV\xFDV[a\x10\x1A\x90`\0\x80Q` aY}\x839\x81Q\x91RaU\x12V[a2VaO4V[P`@\x80Q\x80\x82\x01\x90\x91R`\x01\x81R`\x02` \x82\x01R\x90V[a2waO4V[a2\x80\x82a4\xE3V[\x15a2\x89WP\x90V[`@Q\x80`@\x01`@R\x80\x83`\0\x01Q\x81R` \x01`\0\x80Q` aX\xFD\x839\x81Q\x91R\x84` \x01Qa2\xBC\x91\x90aV\xFDV[a2\xD4\x90`\0\x80Q` aX\xFD\x839\x81Q\x91RaU\x12V[\x90R\x92\x91PPV[a3\x07`@Q\x80`\x80\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`@Q\x80`\x80\x01`@R\x80\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x81R` \x01\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2\x81R` \x01\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA\x81R` \x01\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[\x81RP\x90P\x90V[`\0\x80`\0`@Q\x87Q\x81R` \x88\x01Q` \x82\x01R` \x87\x01Q`@\x82\x01R\x86Q``\x82\x01R``\x87\x01Q`\x80\x82\x01R`@\x87\x01Q`\xA0\x82\x01R\x85Q`\xC0\x82\x01R` \x86\x01Q`\xE0\x82\x01R` \x85\x01Qa\x01\0\x82\x01R\x84Qa\x01 \x82\x01R``\x85\x01Qa\x01@\x82\x01R`@\x85\x01Qa\x01`\x82\x01R` `\0a\x01\x80\x83`\x08Z\xFA\x91PP`\0Q\x91P\x80a4\x82W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1C`$\x82\x01R{Bn254: Pairing check failed!` \x1B`D\x82\x01R`d\x01a\x08[V[P\x15\x15\x90P[\x94\x93PPPPV[``\x82a4\xA5Wa4\xA0\x82aB\x90V[a \xABV[\x81Q\x15\x80\x15a4\xBCWP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a4\xDCW\x83`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x04\x01a\x08[\x91\x90aO\xBCV[P\x80a \xABV[\x80Q` \x90\x91\x01Q\x15\x90\x15\x16\x90V[\x82Q`\xFE\x90a5-a5\x03\x83a9bV[`@Q` \x01a5\x15\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R`\0`\x04aB\xB9V[a5ga5=\x86`\0\x01Qa9bV[`@Q` \x01a5O\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R`\0`\x08aB\xB9V[a5wa5=\x87` \x01Qa9bV[`@Q` \x01a5\x8A\x94\x93\x92\x91\x90aW\x1FV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x85Ra5\xA7`\x01a9bV[a5\xBE`\0\x80Q` aZ\x1D\x839\x81Q\x91Ra9bV[a5\xD5`\0\x80Q` aY\xBD\x839\x81Q\x91Ra9bV[a5\xEC`\0\x80Q` aY\xFD\x839\x81Q\x91Ra9bV[a6\x03`\0\x80Q` aY=\x839\x81Q\x91Ra9bV[`@Q` \x01a6\x18\x96\x95\x94\x93\x92\x91\x90aVhV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x85R`\xE0\x84\x01Qa69\x90a8\x8BV[a6G\x85a\x01\0\x01Qa8\x8BV[a6U\x86a\x01 \x01Qa8\x8BV[a6c\x87a\x01@\x01Qa8\x8BV[a6q\x88a\x01`\x01Qa8\x8BV[a6\x7F\x89a\x01\x80\x01Qa8\x8BV[a6\x8D\x8Aa\x01\xE0\x01Qa8\x8BV[`@Q` \x01a6\xA4\x98\x97\x96\x95\x94\x93\x92\x91\x90aWvV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x85Ra\x02\0\x84\x01Qa6\xC6\x90a8\x8BV[a6\xD4\x85a\x02 \x01Qa8\x8BV[a6\xE2\x86a\x02@\x01Qa8\x8BV[a6\xF0\x87a\x01\xA0\x01Qa8\x8BV[a6\xFE\x88a\x01\xC0\x01Qa8\x8BV[a7\x0C\x89a\x02`\x01Qa8\x8BV[`@Q` \x01a7\"\x97\x96\x95\x94\x93\x92\x91\x90aX\x1BV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x81R\x81\x86R\x84\x01Qa7A\x90a8\x8BV[a7N\x85``\x01Qa8\x8BV[a7[\x86`\x80\x01Qa8\x8BV[a7h\x87`\xA0\x01Qa8\x8BV[a7u\x88`\xC0\x01Qa8\x8BV[`@Q` \x01a7\x8A\x96\x95\x94\x93\x92\x91\x90aU\xBAV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x85R\x82Qa7\xC1\x90\x84\x90`\0\x90a7\xB4Wa7\xB4aU%V[` \x02` \x01\x01Qa9bV[a7\xD7\x84`\x01\x81Q\x81\x10a7\xB4Wa7\xB4aU%V[a7\xED\x85`\x02\x81Q\x81\x10a7\xB4Wa7\xB4aU%V[a8\x03\x86`\x03\x81Q\x81\x10a7\xB4Wa7\xB4aU%V[a8\x19\x87`\x04\x81Q\x81\x10a7\xB4Wa7\xB4aU%V[a8/\x88`\x05\x81Q\x81\x10a7\xB4Wa7\xB4aU%V[a8E\x89`\x06\x81Q\x81\x10a7\xB4Wa7\xB4aU%V[a8[\x8A`\x07\x81Q\x81\x10a7\xB4Wa7\xB4aU%V[`@Q` \x01a8s\x99\x98\x97\x96\x95\x94\x93\x92\x91\x90aX\xADV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x90\x93RPPPV[```\0a8\x98\x83a4\xE3V[\x15a8\xA4W`\x01`\xFE\x1B\x17[` \x83\x01Q`\0\x80Q` aX\xFD\x839\x81Q\x91R`\x01\x91\x90\x91\x1B\x10a8\xCAWP`\x01`\xFF\x1B[\x82Qa8\xD7\x90\x82\x17a9bV[`@Q` \x01a8\xE9\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91PP\x91\x90PV[` \x80\x82\x01Q\x82Q\x80Q`@Q\x83\x81R`\0\x94\x85\x94\x93\x92\x91\x90\x81\x01\x85[\x83\x81\x10\x15a97W` \x81\x86\x01\x81\x01Q\x83\x83\x01R\x01a9\x1DV[PP` \x91\x82\x01\x90 \x90\x86\x01\x81\x90R\x92P`\0a(\x0C`\0\x80Q` aY}\x839\x81Q\x91R\x85aV\xFDV[`\0\x81\x90P`\x08\x81~\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\x16\x90\x1B`\x08\x82\x7F\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\x16\x90\x1C\x17\x90P`\x10\x81}\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\x16\x90\x1B`\x10\x82}\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\x19\x16\x90\x1C\x17\x90P` \x81{\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\x16\x90\x1B` \x82{\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\x19\x16\x90\x1C\x17\x90P`@\x81`\x01`\x01`@\x1B\x03`\x01`\x80\x1B\x03`\x01`\xC0\x1B\x03\x16\x90\x1B`@\x82`\x01`\x01`@\x1B\x03`\x01`\x80\x1B\x03`\x01`\xC0\x1B\x03\x19\x16\x90\x1C\x17\x90P`\x80\x81\x90\x1B`\x80\x82\x90\x1C\x17\x90P\x91\x90PV[\x81Q`\0\x90`\0\x80Q` aY}\x839\x81Q\x91R\x90\x83\x80\x15a:\xDDW\x84\x93P`\0[\x82\x81\x10\x15a:\xD1W\x83\x85\x86\t\x94P`\x01\x01a:\xBBV[P`\x01\x84\x03\x93Pa:\xE4V[`\x01\x83\x03\x93P[PPP\x92\x91PPV[`\0\x82`\x01\x03a:\xFFWP`\x01a \xABV[\x81`\0\x03a;\x0FWP`\0a \xABV[`@\x84\x01Q`\0\x80Q` aY}\x839\x81Q\x91R\x90`\0\x90\x82\x81\x86\t\x90P\x85\x80\x15a;?W`\x01\x87\x03\x92Pa;FV[`\x01\x84\x03\x92P[Pa;P\x82aC\xC6V[\x91P\x82\x82\x82\t\x97\x96PPPPPPPV[\x82Q`\0\x90`\0\x80Q` aY}\x839\x81Q\x91R\x90\x83\x83\x03a;\xE2W`\x01`\0[\x82\x81\x10\x15a;\xD5W\x81\x87\x03a;\xB6W\x87\x81\x81Q\x81\x10a;\xA3Wa;\xA3aU%V[` \x02` \x01\x01Q\x94PPPPPa4\x88V[\x83\x80a;\xC4Wa;\xC4aV\xE7V[\x89``\x01Q\x83\t\x91P`\x01\x01a;\x82V[P`\0\x93PPPPa4\x88V[`\0\x80`\0\x80\x8A`@\x01Q\x90P`\0\x80a;\xFC\x8D\x88aDlV[\x90P`\0\x87`\x01`\x01`@\x1B\x03\x81\x11\x15a<\x18Wa<\x18aO\xD0V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x13\x86\x86\x86\x86\x85\x87aE1V[`\xC0\x85\x01Q\x82Q`\0\x80Q` aY}\x839\x81Q\x91R\x91\x90\x81\x90\x81\x90\x86\x90`\x14\x90\x81\x10a>BWa>BaU%V[` \x02` \x01\x01\x81\x81RPP\x85`\0\x01Q\x84`\x14\x81Q\x81\x10a>fWa>faU%V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x15\x81Q\x81\x10a>\x8BWa>\x8BaU%V[` \x02` \x01\x01\x81\x81RPP\x85` \x01Q\x84`\x15\x81Q\x81\x10a>\xAFWa>\xAFaU%V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x16\x81Q\x81\x10a>\xD4Wa>\xD4aU%V[` \x02` \x01\x01\x81\x81RPP\x85`@\x01Q\x84`\x16\x81Q\x81\x10a>\xF8Wa>\xF8aU%V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x17\x81Q\x81\x10a?\x1DWa?\x1DaU%V[` \x02` \x01\x01\x81\x81RPP\x85``\x01Q\x84`\x17\x81Q\x81\x10a?AWa?AaU%V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x18\x81Q\x81\x10a?fWa?faU%V[` \x02` \x01\x01\x81\x81RPP\x85`\x80\x01Q\x84`\x18\x81Q\x81\x10a?\x8AWa?\x8AaU%V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x19\x81Q\x81\x10a?\xAFWa?\xAFaU%V[` \x02` \x01\x01\x81\x81RPP\x88`@\x01Q\x84`\x19\x81Q\x81\x10a?\xD3Wa?\xD3aU%V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1A\x81Q\x81\x10a?\xF8Wa?\xF8aU%V[` \x02` \x01\x01\x81\x81RPP\x88``\x01Q\x84`\x1A\x81Q\x81\x10a@\x1CWa@\x1CaU%V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1B\x81Q\x81\x10a@AWa@AaU%V[` \x02` \x01\x01\x81\x81RPP\x88`\x80\x01Q\x84`\x1B\x81Q\x81\x10a@eWa@eaU%V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1C\x81Q\x81\x10a@\x8AWa@\x8AaU%V[` \x02` \x01\x01\x81\x81RPP\x88`\xA0\x01Q\x84`\x1C\x81Q\x81\x10a@\xAEWa@\xAEaU%V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x87`\xE0\x01Q\x85`\x1D\x81Q\x81\x10a@\xD7Wa@\xD7aU%V[` \x02` \x01\x01\x81\x81RPP\x85`\xA0\x01Q\x84`\x1D\x81Q\x81\x10a@\xFBWa@\xFBaU%V[` \x02` \x01\x01\x81\x90RPPPPPPPPPPV[`\0\x80Q` aY}\x839\x81Q\x91R\x83\x81\x03\x90`\0[`\n\x81\x10\x15aAXW` `\x15\x82\x01\x02\x84\x01Q` \x82\x02a\x01\xA0\x01\x86\x01Q\x83\x84\x82\x84\t\x86\x08\x94PPP`\x01\x01aA'V[PP\x93\x92PPPV[aAiaO4V[aAqaONV[\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R`@\x81\x01\x83\x90R`\0``\x83`\x80\x84`\x07a\x07\xD0Z\x03\xFA\x90P\x80\x80aA\xA3W`\0\x80\xFD[P\x80aA\xEDW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x19`$\x82\x01RxBn254: scalar mul failed!`8\x1B`D\x82\x01R`d\x01a\x08[V[PP\x92\x91PPV[aA\xFDaO4V[aB\x05aOlV[\x83Q\x81R` \x80\x85\x01Q\x81\x83\x01R\x83Q`@\x83\x01R\x83\x01Q``\x80\x83\x01\x91\x90\x91R`\0\x90\x83`\xC0\x84`\x06a\x07\xD0Z\x03\xFA\x90P\x80\x80aBBW`\0\x80\xFD[P\x80aA\xEDW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: group addition failed!\0\0\0`D\x82\x01R`d\x01a\x08[V[\x80Q\x15aB\xA0W\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x81aB\xC7\x81`\x1FaU\x8BV[\x10\x15aC\x06W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0E`$\x82\x01Rmslice_overflow`\x90\x1B`D\x82\x01R`d\x01a\x08[V[aC\x10\x82\x84aU\x8BV[\x84Q\x10\x15aCTW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x11`$\x82\x01Rpslice_outOfBounds`x\x1B`D\x82\x01R`d\x01a\x08[V[``\x82\x15\x80\x15aCsW`@Q\x91P`\0\x82R` \x82\x01`@RaC\xBDV[`@Q\x91P`\x1F\x84\x16\x80\x15` \x02\x81\x84\x01\x01\x85\x81\x01\x87\x83\x15` \x02\x84\x8B\x01\x01\x01[\x81\x83\x10\x15aC\xACW\x80Q\x83R` \x92\x83\x01\x92\x01aC\x94V[PP\x85\x84R`\x1F\x01`\x1F\x19\x16`@RP[P\x94\x93PPPPV[`\0\x80`\0`\0\x80Q` aY}\x839\x81Q\x91R\x90P`@Q` \x81R` \x80\x82\x01R` `@\x82\x01R\x84``\x82\x01R`\x02\x82\x03`\x80\x82\x01R\x81`\xA0\x82\x01R` `\0`\xC0\x83`\x05Z\xFA\x92PP`\0Q\x92P\x81aDeW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: pow precompile failed!\0\0\0`D\x82\x01R`d\x01a\x08[V[PP\x91\x90PV[``\x82` \x01Q\x82\x11\x15aD\x93W`@Qc\x8C^\x11\xF1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x83\x01Q`\x01`\0\x80Q` aY}\x839\x81Q\x91R\x84`\x01`\x01`@\x1B\x03\x81\x11\x15aD\xC1WaD\xC1aO\xD0V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15aD\xEAW\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x93P\x84\x15\x19\x15a:\xE4W` \x84\x01\x85` \x02\x81\x01`\x01\x82R` \x82\x01\x91P[\x80\x82\x10\x15aE&W\x82\x85\x85\t\x93P\x83\x82R` \x82\x01\x91PaE\nV[PPPPP\x92\x91PPV[`\0\x80`\0\x80`\0\x80`\0\x80Q` aY}\x839\x81Q\x91R\x90P\x80` \x8B\x01Q` \x8D\x01Q\t\x95P\x8AQ\x93P\x80`\xA0\x8C\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xA0\x8A\x01Q\x84\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80`\0\x80Q` aZ\x1D\x839\x81Q\x91R\x84\t\x91P\x80a\x01\xC0\x8A\x01Q\x83\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80`\0\x80Q` aY\xBD\x839\x81Q\x91R\x84\t\x91P\x80a\x01\xE0\x8A\x01Q\x83\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80`\0\x80Q` aY\xFD\x839\x81Q\x91R\x84\t\x91P\x80a\x02\0\x8A\x01Q\x83\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80`\0\x80Q` aY=\x839\x81Q\x91R\x84\t\x91P\x80a\x02 \x8A\x01Q\x83\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80\x84\x87\x08\x95P\x88`\xA0\x01Q\x88`\0\x81Q\x81\x10aF`WaF`aU%V[` \x02` \x01\x01\x81\x90RP\x85\x87`\0\x81Q\x81\x10aF\x7FWaF\x7FaU%V[` \x02` \x01\x01\x81\x81RPP\x80``\x8C\x01Q\x8CQ\t\x94P\x80a\x02\xC0\x8A\x01Q\x86\t\x94P\x80a\x02@\x8A\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xA0\x8A\x01Q\x84\x08\x92P\x80`\x80\x8C\x01Q\x84\x08\x92P\x80\x83\x86\t\x94P\x80a\x02`\x8A\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xC0\x8A\x01Q\x84\x08\x92P\x80`\x80\x8C\x01Q\x84\x08\x92P\x80\x83\x86\t\x94P\x80a\x02\x80\x8A\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xE0\x8A\x01Q\x84\x08\x92P\x80`\x80\x8C\x01Q\x84\x08\x92P\x80\x83\x86\t\x94P\x80a\x02\xA0\x8A\x01Q``\x8D\x01Q\t\x92P\x80a\x02\0\x8A\x01Q\x84\x08\x92P\x80`\x80\x8C\x01Q\x84\x08\x92P\x80\x83\x86\t\x94P\x8B`\xC0\x01Q\x88`\x01\x81Q\x81\x10aGaWaGaaU%V[` \x90\x81\x02\x91\x90\x91\x01\x01RaGv\x85\x82aU\x12V[\x87`\x01\x81Q\x81\x10aG\x89WaG\x89aU%V[` \x02` \x01\x01\x81\x81RPP\x88a\x01\xA0\x01Q\x87`\x02\x81Q\x81\x10aG\xAEWaG\xAEaU%V[` \x02` \x01\x01\x81\x81RPP\x88a\x01\xC0\x01Q\x87`\x03\x81Q\x81\x10aG\xD3WaG\xD3aU%V[` \x02` \x01\x01\x81\x81RPP\x88a\x01\xE0\x01Q\x87`\x04\x81Q\x81\x10aG\xF8WaG\xF8aU%V[` \x02` \x01\x01\x81\x81RPP\x88a\x02\0\x01Q\x87`\x05\x81Q\x81\x10aH\x1DWaH\x1DaU%V[` \x02` \x01\x01\x81\x81RPP\x8B`\xE0\x01Q\x88`\x02\x81Q\x81\x10aHAWaHAaU%V[` \x02` \x01\x01\x81\x90RP\x8Ba\x01\0\x01Q\x88`\x03\x81Q\x81\x10aHeWaHeaU%V[` \x02` \x01\x01\x81\x90RP\x8Ba\x01 \x01Q\x88`\x04\x81Q\x81\x10aH\x89WaH\x89aU%V[` \x02` \x01\x01\x81\x90RP\x8Ba\x01@\x01Q\x88`\x05\x81Q\x81\x10aH\xADWaH\xADaU%V[` \x02` \x01\x01\x81\x90RP\x80a\x01\xC0\x8A\x01Qa\x01\xA0\x8B\x01Q\t\x92P\x82\x87`\x06\x81Q\x81\x10aH\xDCWaH\xDCaU%V[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01`\x01Q\x88`\x06\x81Q\x81\x10aI\x01WaI\x01aU%V[` \x02` \x01\x01\x81\x90RP\x80a\x02\0\x8A\x01Qa\x01\xE0\x8B\x01Q\t\x92P\x82\x87`\x07\x81Q\x81\x10aI0WaI0aU%V[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01\x80\x01Q\x88`\x07\x81Q\x81\x10aIUWaIUaU%V[` \x02` \x01\x01\x81\x90RPa\x01\xA0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\x08\x81Q\x81\x10aI\x8EWaI\x8EaU%V[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01\xE0\x01Q\x88`\x08\x81Q\x81\x10aI\xB3WaI\xB3aU%V[` \x02` \x01\x01\x81\x90RPa\x01\xC0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\t\x81Q\x81\x10aI\xECWaI\xECaU%V[` \x02` \x01\x01\x81\x81RPP\x8Ba\x02\0\x01Q\x88`\t\x81Q\x81\x10aJ\x11WaJ\x11aU%V[` \x02` \x01\x01\x81\x90RPa\x01\xE0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\n\x81Q\x81\x10aJJWaJJaU%V[` \x02` \x01\x01\x81\x81RPP\x8Ba\x02 \x01Q\x88`\n\x81Q\x81\x10aJoWaJoaU%V[` \x02` \x01\x01\x81\x90RPa\x02\0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\x0B\x81Q\x81\x10aJ\xA8WaJ\xA8aU%V[` \x02` \x01\x01\x81\x81RPP\x8Ba\x02@\x01Q\x88`\x0B\x81Q\x81\x10aJ\xCDWaJ\xCDaU%V[` \x02` \x01\x01\x81\x90RP\x88a\x02 \x01Q\x81aJ\xE9\x91\x90aU\x12V[\x87`\x0C\x81Q\x81\x10aJ\xFCWaJ\xFCaU%V[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01\xA0\x01Q\x88`\x0C\x81Q\x81\x10aK!WaK!aU%V[` \x02` \x01\x01\x81\x90RP`\x01\x87`\r\x81Q\x81\x10aKAWaKAaU%V[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01\xC0\x01Q\x88`\r\x81Q\x81\x10aKfWaKfaU%V[` \x02` \x01\x01\x81\x90RP\x80a\x01\xC0\x8A\x01Qa\x01\xA0\x8B\x01Q\t\x92P\x80a\x01\xE0\x8A\x01Q\x84\t\x92P\x80a\x02\0\x8A\x01Q\x84\t\x92P\x80a\x02 \x8A\x01Q\x84\t\x92P\x82\x87`\x0E\x81Q\x81\x10aK\xB6WaK\xB6aU%V[` \x02` \x01\x01\x81\x81RPP\x8Ba\x02`\x01Q\x88`\x0E\x81Q\x81\x10aK\xDBWaK\xDBaU%V[` \x90\x81\x02\x91\x90\x91\x01\x01R\x89QaK\xF2\x90\x82aU\x12V[\x87`\x0F\x81Q\x81\x10aL\x05WaL\x05aU%V[` \x02` \x01\x01\x81\x81RPP\x88`\xC0\x01Q\x88`\x0F\x81Q\x81\x10aL)WaL)aU%V[` \x02` \x01\x01\x81\x90RP\x80`\x01\x8BQ\x08`\xA0\x8C\x01Q\x90\x93P\x81\x90\x80\t\x91P\x80\x82\x84\t\x92P\x80\x83` `\x10\x02\x89\x01Q\t\x91P\x81\x87`\x10\x81Q\x81\x10aLoWaLoaU%V[` \x02` \x01\x01\x81\x81RPP\x88`\xE0\x01Q\x88`\x10\x81Q\x81\x10aL\x93WaL\x93aU%V[` \x02` \x01\x01\x81\x90RP\x80\x83` `\x11\x02\x89\x01Q\t\x91P\x81\x87`\x11\x81Q\x81\x10aL\xBFWaL\xBFaU%V[` \x02` \x01\x01\x81\x81RPP\x88a\x01\0\x01Q\x88`\x11\x81Q\x81\x10aL\xE4WaL\xE4aU%V[` \x02` \x01\x01\x81\x90RP\x80\x83` `\x12\x02\x89\x01Q\t\x91P\x81\x87`\x12\x81Q\x81\x10aM\x10WaM\x10aU%V[` \x02` \x01\x01\x81\x81RPP\x88a\x01 \x01Q\x88`\x12\x81Q\x81\x10aM5WaM5aU%V[` \x02` \x01\x01\x81\x90RP\x80\x83` `\x13\x02\x89\x01Q\t\x91P\x81\x87`\x13\x81Q\x81\x10aMaWaMaaU%V[` \x02` \x01\x01\x81\x81RPP\x88a\x01@\x01Q\x88`\x13\x81Q\x81\x10aM\x86WaM\x86aU%V[` \x02` \x01\x01\x81\x90RPPPPPPPPPPPPPV[`@Q\x80a\x01\0\x01`@R\x80`\0`\x01`\x01`@\x1B\x03\x16\x81R` \x01`\0`\x01`\x01`@\x1B\x03\x16\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`@Q\x80a\x02\x80\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01aN\x18aO4V[\x81R` \x01aN%aO4V[\x81R` \x01aN2aO4V[\x81R` \x01aN?aO4V[\x81R` \x01aNLaO4V[\x81R` \x01aNYaO4V[\x81R` \x01aNfaO4V[\x81R` \x01aNsaO4V[\x81R` \x01aN\x80aO4V[\x81R` \x01aN\x8DaO4V[\x81R` \x01aN\x9AaO4V[\x81R` \x01aN\xA7aO4V[\x81R` \x01aN\xB4aO4V[\x81R` \x01aN\xC1aO4V[\x81R` \x01aN\xCEaO4V[\x81R` \x01aN\xDBaO4V[\x81R` \x01aN\xE8aO4V[\x81R` \x01aN\xF5aO4V[\x90R\x90V[`@Q\x80a\x01\0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01``\x81R` \x01``\x81R` \x01aN\xE8[`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[`@Q\x80``\x01`@R\x80`\x03\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[`@Q\x80`\x80\x01`@R\x80`\x04\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a0\x94W`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15aO\xB3W`\0\x80\xFD[a \xAB\x82aO\x8AV[`\x01`\x01`\xA0\x1B\x03\x91\x90\x91\x16\x81R` \x01\x90V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Qa\x02\xE0\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15aP\tWaP\taO\xD0V[`@R\x90V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15aP7WaP7aO\xD0V[`@R\x91\x90PV[\x805`\x01`\x01`@\x1B\x03\x81\x16\x81\x14a0\x94W`\0\x80\xFD[`\0a\x01\0\x80\x83\x85\x03\x12\x15aPjW`\0\x80\xFD[`@Q\x90\x81\x01\x90`\x01`\x01`@\x1B\x03\x82\x11\x81\x83\x10\x17\x15aP\x8CWaP\x8CaO\xD0V[\x81`@R\x80\x92PaP\x9C\x84aP?V[\x81RaP\xAA` \x85\x01aP?V[` \x82\x01R`@\x84\x015`@\x82\x01R``\x84\x015``\x82\x01R`\x80\x84\x015`\x80\x82\x01R`\xA0\x84\x015`\xA0\x82\x01R`\xC0\x84\x015`\xC0\x82\x01R`\xE0\x84\x015`\xE0\x82\x01RPP\x92\x91PPV[`\0`@\x82\x84\x03\x12\x15aQ\x05W`\0\x80\xFD[`@\x80Q\x90\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15aQ'WaQ'aO\xD0V[`@R\x825\x81R` \x92\x83\x015\x92\x81\x01\x92\x90\x92RP\x91\x90PV[`\0\x80\x82\x84\x03a\x05\x80\x81\x12\x15aQVW`\0\x80\xFD[aQ`\x85\x85aPVV[\x92Pa\x01\0a\x04\x80\x80`\xFF\x19\x84\x01\x12\x15aQyW`\0\x80\xFD[aQ\x81aO\xE6V[\x92PaQ\x8F\x87\x83\x88\x01aP\xF3V[\x83Ra\x01@aQ\xA0\x88\x82\x89\x01aP\xF3V[` \x85\x01Ra\x01\x80aQ\xB4\x89\x82\x8A\x01aP\xF3V[`@\x86\x01Ra\x01\xC0aQ\xC8\x8A\x82\x8B\x01aP\xF3V[``\x87\x01Ra\x02\0aQ\xDC\x8B\x82\x8C\x01aP\xF3V[`\x80\x88\x01Ra\x02@aQ\xF0\x8C\x82\x8D\x01aP\xF3V[`\xA0\x89\x01Ra\x02\x80aR\x04\x8D\x82\x8E\x01aP\xF3V[`\xC0\x8A\x01Ra\x02\xC0aR\x18\x8E\x82\x8F\x01aP\xF3V[`\xE0\x8B\x01RaR+\x8Ea\x03\0\x8F\x01aP\xF3V[\x89\x8B\x01RaR=\x8Ea\x03@\x8F\x01aP\xF3V[a\x01 \x8B\x01RaRQ\x8Ea\x03\x80\x8F\x01aP\xF3V[\x87\x8B\x01RaRc\x8Ea\x03\xC0\x8F\x01aP\xF3V[a\x01`\x8B\x01RaRw\x8Ea\x04\0\x8F\x01aP\xF3V[\x86\x8B\x01Ra\x04@\x8D\x015a\x01\xA0\x8B\x01Ra\x04`\x8D\x015\x85\x8B\x01R\x87\x8D\x015a\x01\xE0\x8B\x01Ra\x04\xA0\x8D\x015\x84\x8B\x01Ra\x04\xC0\x8D\x015a\x02 \x8B\x01Ra\x04\xE0\x8D\x015\x83\x8B\x01Ra\x05\0\x8D\x015a\x02`\x8B\x01Ra\x05 \x8D\x015\x82\x8B\x01Ra\x05@\x8D\x015a\x02\xA0\x8B\x01Ra\x05`\x8D\x015\x81\x8B\x01RPPPPPPPPP\x80\x91PP\x92P\x92\x90PV[`\0\x80`@\x83\x85\x03\x12\x15aS\x0EW`\0\x80\xFD[aS\x17\x83aO\x8AV[\x91P` \x83\x81\x015`\x01`\x01`@\x1B\x03\x80\x82\x11\x15aS4W`\0\x80\xFD[\x81\x86\x01\x91P\x86`\x1F\x83\x01\x12aSHW`\0\x80\xFD[\x815\x81\x81\x11\x15aSZWaSZaO\xD0V[aSl`\x1F\x82\x01`\x1F\x19\x16\x85\x01aP\x0FV[\x91P\x80\x82R\x87\x84\x82\x85\x01\x01\x11\x15aS\x82W`\0\x80\xFD[\x80\x84\x84\x01\x85\x84\x017`\0\x84\x82\x84\x01\x01RP\x80\x93PPPP\x92P\x92\x90PV[`\x01`\x01`@\x1B\x03\x91\x90\x91\x16\x81R` \x01\x90V[\x805c\xFF\xFF\xFF\xFF\x81\x16\x81\x14a0\x94W`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15aS\xDAW`\0\x80\xFD[a \xAB\x82aS\xB4V[`\0` \x82\x84\x03\x12\x15aS\xF5W`\0\x80\xFD[P5\x91\x90PV[`\0\x80`\0a\x01@\x84\x86\x03\x12\x15aT\x12W`\0\x80\xFD[aT\x1C\x85\x85aPVV[\x92PaT+a\x01\0\x85\x01aS\xB4V[\x91PaT:a\x01 \x85\x01aO\x8AV[\x90P\x92P\x92P\x92V[`\0a\x01\0\x82\x84\x03\x12\x15aTVW`\0\x80\xFD[a \xAB\x83\x83aPVV[`\0[\x83\x81\x10\x15aT{W\x81\x81\x01Q\x83\x82\x01R` \x01aTcV[PP`\0\x91\x01RV[` \x81R`\0\x82Q\x80` \x84\x01RaT\xA3\x81`@\x85\x01` \x87\x01aT`V[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[`\0\x80`@\x83\x85\x03\x12\x15aT\xCAW`\0\x80\xFD[PP\x805\x92` \x90\x91\x015\x91PV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\x01`\x01`@\x1B\x03\x81\x81\x16\x83\x82\x16\x02\x80\x82\x16\x91\x90\x82\x81\x14aA\xEDWaA\xEDaT\xD9V[\x81\x81\x03\x81\x81\x11\x15a\x10\x1AWa\x10\x1AaT\xD9V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\0\x81aUJWaUJaT\xD9V[P`\0\x19\x01\x90V[`\x01`\x01`@\x1B\x03\x81\x81\x16\x83\x82\x16\x01\x90\x80\x82\x11\x15a2\x15Wa2\x15aT\xD9V[`\0` \x82\x84\x03\x12\x15aU\x84W`\0\x80\xFD[PQ\x91\x90PV[\x80\x82\x01\x80\x82\x11\x15a\x10\x1AWa\x10\x1AaT\xD9V[`\0\x82QaU\xB0\x81\x84` \x87\x01aT`V[\x91\x90\x91\x01\x92\x91PPV[`\0\x87Q` aU\xCD\x82\x85\x83\x8D\x01aT`V[\x88Q\x91\x84\x01\x91aU\xE0\x81\x84\x84\x8D\x01aT`V[\x88Q\x92\x01\x91aU\xF2\x81\x84\x84\x8C\x01aT`V[\x87Q\x92\x01\x91aV\x04\x81\x84\x84\x8B\x01aT`V[\x86Q\x92\x01\x91aV\x16\x81\x84\x84\x8A\x01aT`V[\x85Q\x92\x01\x91aV(\x81\x84\x84\x89\x01aT`V[\x91\x90\x91\x01\x99\x98PPPPPPPPPV[`\0\x83QaVK\x81\x84` \x88\x01aT`V[\x83Q\x90\x83\x01\x90aV_\x81\x83` \x88\x01aT`V[\x01\x94\x93PPPPV[`\0\x87QaVz\x81\x84` \x8C\x01aT`V[\x91\x90\x91\x01\x95\x86RP` \x85\x01\x93\x90\x93R`@\x84\x01\x91\x90\x91R``\x83\x01R`\x80\x82\x01R`\xA0\x01\x91\x90PV[`\0\x84QaV\xB6\x81\x84` \x89\x01aT`V[\x84Q\x90\x83\x01\x90aV\xCA\x81\x83` \x89\x01aT`V[\x84Q\x91\x01\x90aV\xDD\x81\x83` \x88\x01aT`V[\x01\x95\x94PPPPPV[cNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[`\0\x82aW\x1AWcNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[P\x06\x90V[`\0\x85QaW1\x81\x84` \x8A\x01aT`V[\x85Q\x90\x83\x01\x90aWE\x81\x83` \x8A\x01aT`V[\x85Q\x91\x01\x90aWX\x81\x83` \x89\x01aT`V[\x84Q\x91\x01\x90aWk\x81\x83` \x88\x01aT`V[\x01\x96\x95PPPPPPV[`\0\x89Q` aW\x89\x82\x85\x83\x8F\x01aT`V[\x8AQ\x91\x84\x01\x91aW\x9C\x81\x84\x84\x8F\x01aT`V[\x8AQ\x92\x01\x91aW\xAE\x81\x84\x84\x8E\x01aT`V[\x89Q\x92\x01\x91aW\xC0\x81\x84\x84\x8D\x01aT`V[\x88Q\x92\x01\x91aW\xD2\x81\x84\x84\x8C\x01aT`V[\x87Q\x92\x01\x91aW\xE4\x81\x84\x84\x8B\x01aT`V[\x86Q\x92\x01\x91aW\xF6\x81\x84\x84\x8A\x01aT`V[\x85Q\x92\x01\x91aX\x08\x81\x84\x84\x89\x01aT`V[\x91\x90\x91\x01\x9B\x9APPPPPPPPPPPV[`\0\x88Q` aX.\x82\x85\x83\x8E\x01aT`V[\x89Q\x91\x84\x01\x91aXA\x81\x84\x84\x8E\x01aT`V[\x89Q\x92\x01\x91aXS\x81\x84\x84\x8D\x01aT`V[\x88Q\x92\x01\x91aXe\x81\x84\x84\x8C\x01aT`V[\x87Q\x92\x01\x91aXw\x81\x84\x84\x8B\x01aT`V[\x86Q\x92\x01\x91aX\x89\x81\x84\x84\x8A\x01aT`V[\x85Q\x92\x01\x91aX\x9B\x81\x84\x84\x89\x01aT`V[\x91\x90\x91\x01\x9A\x99PPPPPPPPPPV[`\0\x8AQaX\xBF\x81\x84` \x8F\x01aT`V[\x91\x90\x91\x01\x98\x89RP` \x88\x01\x96\x90\x96R`@\x87\x01\x94\x90\x94R``\x86\x01\x92\x90\x92R`\x80\x85\x01R`\xA0\x84\x01R`\xC0\x83\x01R`\xE0\x82\x01Ra\x01\0\x01\x91\x90PV\xFE0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\xA6l\xC9(\xB5\xED\xB8*\xF9\xBDI\x92)T\x15Z\xB7\xB0\x94&\x94\xBE\xA4\xCEDf\x1D\x9A\x876\xC6\x88.+\x91Ea\x03i\x8A\xDFW\xB7\x99\x96\x9D\xEA\x1C\x8Fs\x9D\xA5\xD8\xD4\r\xD3\xEB\x92\"\xDB|\x81\xE8\x816\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\xF3\xF7\xA9\xFE6O\xAA\xB9;!m\xA5\n2\x14\x15O\"\xA0\xA2\xB4\x15\xB2:\x84\xC8\x16\x9E\x8Bcn\xE3\x1E\xE6x\xA0G\nu\xA6\xEA\xA8\xFE\x83p`I\x8B\xA8(\xA3p;1\x1D\x0Fw\xF0\x10BJ\xFE\xB0%\xF3\xF7\xA9\xFE6O\xAA\xB9;!m\xA5\n2\x14\x15O\"\xA0\xA2\xB4\x15\xB2:\x84\xC8\x16\x9E\x8Bcn\xE4 B\xA5\x87\xA9\x0C\x18{\n\x08|\x03\xE2\x9C\x96\x8B\x95\x0B\x1D\xB2m\\\x82\xD6f\x90Zh\x95y\x0C\n/\x8D\xD1\xF1\xA7X ::ethers::contract::builders::ContractCall {
+ self.0
+ .method_hash([84, 100, 96, 133], ())
+ .expect("method not found (this should never happen)")
+ }
+ ///Calls the contract's `getHotShotCommitment` (0x8584d23f) function
+ pub fn get_hot_shot_commitment(
+ &self,
+ hot_shot_block_height: ::ethers::core::types::U256,
+ ) -> ::ethers::contract::builders::ContractCall {
+ self.0
+ .method_hash([133, 132, 210, 63], hot_shot_block_height)
+ .expect("method not found (this should never happen)")
+ }
+ ///Calls the contract's `getStateUpdateBlockNumbersCount` (0x7053fc51) function
+ pub fn get_state_update_block_numbers_count(
+ &self,
+ ) -> ::ethers::contract::builders::ContractCall {
+ self.0
+ .method_hash([112, 83, 252, 81], ())
+ .expect("method not found (this should never happen)")
+ }
///Calls the contract's `getVersion` (0x0d8e6e2c) function
pub fn get_version(&self) -> ::ethers::contract::builders::ContractCall {
self.0
.method_hash([13, 142, 110, 44], ())
.expect("method not found (this should never happen)")
}
+ ///Calls the contract's `hotShotCommitments` (0xdb13b60a) function
+ pub fn hot_shot_commitments(
+ &self,
+ p0: ::ethers::core::types::U256,
+ ) -> ::ethers::contract::builders::ContractCall
+ {
+ self.0
+ .method_hash([219, 19, 182, 10], p0)
+ .expect("method not found (this should never happen)")
+ }
///Calls the contract's `initialize` (0xa244d596) function
pub fn initialize(
&self,
@@ -1092,6 +1286,16 @@ pub mod light_client {
.method_hash([162, 68, 213, 150], (genesis, num_blocks_per_epoch, owner))
.expect("method not found (this should never happen)")
}
+ ///Calls the contract's `lagOverEscapeHatchThreshold` (0xe0303301) function
+ pub fn lag_over_escape_hatch_threshold(
+ &self,
+ block_number: ::ethers::core::types::U256,
+ threshold: ::ethers::core::types::U256,
+ ) -> ::ethers::contract::builders::ContractCall {
+ self.0
+ .method_hash([224, 48, 51, 1], (block_number, threshold))
+ .expect("method not found (this should never happen)")
+ }
///Calls the contract's `newFinalizedState` (0x409939b7) function
pub fn new_finalized_state(
&self,
@@ -1147,6 +1351,15 @@ pub mod light_client {
.method_hash([1, 63, 165, 252], prover)
.expect("method not found (this should never happen)")
}
+ ///Calls the contract's `stateUpdateBlockNumbers` (0xa51e6fea) function
+ pub fn state_update_block_numbers(
+ &self,
+ p0: ::ethers::core::types::U256,
+ ) -> ::ethers::contract::builders::ContractCall {
+ self.0
+ .method_hash([165, 30, 111, 234], p0)
+ .expect("method not found (this should never happen)")
+ }
///Calls the contract's `states` (0x7f17baad) function
pub fn states(
&self,
@@ -1343,6 +1556,24 @@ pub mod light_client {
)]
#[etherror(name = "FailedInnerCall", abi = "FailedInnerCall()")]
pub struct FailedInnerCall;
+ ///Custom Error type `InsufficientSnapshotHistory` with signature `InsufficientSnapshotHistory()` and selector `0xb0b43877`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthError,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[etherror(
+ name = "InsufficientSnapshotHistory",
+ abi = "InsufficientSnapshotHistory()"
+ )]
+ pub struct InsufficientSnapshotHistory;
///Custom Error type `InvalidAddress` with signature `InvalidAddress()` and selector `0xe6c4247b`
#[derive(
Clone,
@@ -1373,6 +1604,24 @@ pub mod light_client {
)]
#[etherror(name = "InvalidArgs", abi = "InvalidArgs()")]
pub struct InvalidArgs;
+ ///Custom Error type `InvalidHotShotBlockForCommitmentCheck` with signature `InvalidHotShotBlockForCommitmentCheck()` and selector `0x615a9264`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthError,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[etherror(
+ name = "InvalidHotShotBlockForCommitmentCheck",
+ abi = "InvalidHotShotBlockForCommitmentCheck()"
+ )]
+ pub struct InvalidHotShotBlockForCommitmentCheck;
///Custom Error type `InvalidInitialization` with signature `InvalidInitialization()` and selector `0xf92ee8a9`
#[derive(
Clone,
@@ -1649,8 +1898,10 @@ pub mod light_client {
ERC1967InvalidImplementation(ERC1967InvalidImplementation),
ERC1967NonPayable(ERC1967NonPayable),
FailedInnerCall(FailedInnerCall),
+ InsufficientSnapshotHistory(InsufficientSnapshotHistory),
InvalidAddress(InvalidAddress),
InvalidArgs(InvalidArgs),
+ InvalidHotShotBlockForCommitmentCheck(InvalidHotShotBlockForCommitmentCheck),
InvalidInitialization(InvalidInitialization),
InvalidPolyEvalArgs(InvalidPolyEvalArgs),
InvalidProof(InvalidProof),
@@ -1697,12 +1948,24 @@ pub mod light_client {
if let Ok(decoded) = ::decode(data) {
return Ok(Self::FailedInnerCall(decoded));
}
+ if let Ok(decoded) =
+ ::decode(data)
+ {
+ return Ok(Self::InsufficientSnapshotHistory(decoded));
+ }
if let Ok(decoded) = ::decode(data) {
return Ok(Self::InvalidAddress(decoded));
}
if let Ok(decoded) = ::decode(data) {
return Ok(Self::InvalidArgs(decoded));
}
+ if let Ok(decoded) =
+ ::decode(
+ data,
+ )
+ {
+ return Ok(Self::InvalidHotShotBlockForCommitmentCheck(decoded));
+ }
if let Ok(decoded) =
::decode(data)
{
@@ -1785,8 +2048,14 @@ pub mod light_client {
}
Self::ERC1967NonPayable(element) => ::ethers::core::abi::AbiEncode::encode(element),
Self::FailedInnerCall(element) => ::ethers::core::abi::AbiEncode::encode(element),
+ Self::InsufficientSnapshotHistory(element) => {
+ ::ethers::core::abi::AbiEncode::encode(element)
+ }
Self::InvalidAddress(element) => ::ethers::core::abi::AbiEncode::encode(element),
Self::InvalidArgs(element) => ::ethers::core::abi::AbiEncode::encode(element),
+ Self::InvalidHotShotBlockForCommitmentCheck(element) => {
+ ::ethers::core::abi::AbiEncode::encode(element)
+ }
Self::InvalidInitialization(element) => {
::ethers::core::abi::AbiEncode::encode(element)
}
@@ -1847,12 +2116,20 @@ pub mod light_client {
== ::selector() => {
true
}
+ _ if selector
+ == ::selector() => {
+ true
+ }
_ if selector
== ::selector() => {
true
}
_ if selector
== ::selector() => true,
+ _ if selector
+ == ::selector() => {
+ true
+ }
_ if selector
== ::selector() => {
true
@@ -1926,8 +2203,12 @@ pub mod light_client {
}
Self::ERC1967NonPayable(element) => ::core::fmt::Display::fmt(element, f),
Self::FailedInnerCall(element) => ::core::fmt::Display::fmt(element, f),
+ Self::InsufficientSnapshotHistory(element) => ::core::fmt::Display::fmt(element, f),
Self::InvalidAddress(element) => ::core::fmt::Display::fmt(element, f),
Self::InvalidArgs(element) => ::core::fmt::Display::fmt(element, f),
+ Self::InvalidHotShotBlockForCommitmentCheck(element) => {
+ ::core::fmt::Display::fmt(element, f)
+ }
Self::InvalidInitialization(element) => ::core::fmt::Display::fmt(element, f),
Self::InvalidPolyEvalArgs(element) => ::core::fmt::Display::fmt(element, f),
Self::InvalidProof(element) => ::core::fmt::Display::fmt(element, f),
@@ -1977,6 +2258,11 @@ pub mod light_client {
Self::FailedInnerCall(value)
}
}
+ impl ::core::convert::From for LightClientErrors {
+ fn from(value: InsufficientSnapshotHistory) -> Self {
+ Self::InsufficientSnapshotHistory(value)
+ }
+ }
impl ::core::convert::From for LightClientErrors {
fn from(value: InvalidAddress) -> Self {
Self::InvalidAddress(value)
@@ -1987,6 +2273,11 @@ pub mod light_client {
Self::InvalidArgs(value)
}
}
+ impl ::core::convert::From for LightClientErrors {
+ fn from(value: InvalidHotShotBlockForCommitmentCheck) -> Self {
+ Self::InvalidHotShotBlockForCommitmentCheck(value)
+ }
+ }
impl ::core::convert::From for LightClientErrors {
fn from(value: InvalidInitialization) -> Self {
Self::InvalidInitialization(value)
@@ -2469,6 +2760,59 @@ pub mod light_client {
)]
#[ethcall(name = "getGenesisState", abi = "getGenesisState()")]
pub struct GetGenesisStateCall;
+ ///Container type for all input parameters for the `getHotShotBlockCommitmentsCount` function with signature `getHotShotBlockCommitmentsCount()` and selector `0x54646085`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthCall,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[ethcall(
+ name = "getHotShotBlockCommitmentsCount",
+ abi = "getHotShotBlockCommitmentsCount()"
+ )]
+ pub struct GetHotShotBlockCommitmentsCountCall;
+ ///Container type for all input parameters for the `getHotShotCommitment` function with signature `getHotShotCommitment(uint256)` and selector `0x8584d23f`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthCall,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[ethcall(name = "getHotShotCommitment", abi = "getHotShotCommitment(uint256)")]
+ pub struct GetHotShotCommitmentCall {
+ pub hot_shot_block_height: ::ethers::core::types::U256,
+ }
+ ///Container type for all input parameters for the `getStateUpdateBlockNumbersCount` function with signature `getStateUpdateBlockNumbersCount()` and selector `0x7053fc51`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthCall,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[ethcall(
+ name = "getStateUpdateBlockNumbersCount",
+ abi = "getStateUpdateBlockNumbersCount()"
+ )]
+ pub struct GetStateUpdateBlockNumbersCountCall;
///Container type for all input parameters for the `getVersion` function with signature `getVersion()` and selector `0x0d8e6e2c`
#[derive(
Clone,
@@ -2484,6 +2828,21 @@ pub mod light_client {
)]
#[ethcall(name = "getVersion", abi = "getVersion()")]
pub struct GetVersionCall;
+ ///Container type for all input parameters for the `hotShotCommitments` function with signature `hotShotCommitments(uint256)` and selector `0xdb13b60a`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthCall,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[ethcall(name = "hotShotCommitments", abi = "hotShotCommitments(uint256)")]
+ pub struct HotShotCommitmentsCall(pub ::ethers::core::types::U256);
///Container type for all input parameters for the `initialize` function with signature `initialize((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256),uint32,address)` and selector `0xa244d596`
#[derive(
Clone,
@@ -2506,6 +2865,27 @@ pub mod light_client {
pub num_blocks_per_epoch: u32,
pub owner: ::ethers::core::types::Address,
}
+ ///Container type for all input parameters for the `lagOverEscapeHatchThreshold` function with signature `lagOverEscapeHatchThreshold(uint256,uint256)` and selector `0xe0303301`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthCall,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[ethcall(
+ name = "lagOverEscapeHatchThreshold",
+ abi = "lagOverEscapeHatchThreshold(uint256,uint256)"
+ )]
+ pub struct LagOverEscapeHatchThresholdCall {
+ pub block_number: ::ethers::core::types::U256,
+ pub threshold: ::ethers::core::types::U256,
+ }
///Container type for all input parameters for the `newFinalizedState` function with signature `newFinalizedState((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256),((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))` and selector `0x409939b7`
#[derive(
Clone,
@@ -2617,6 +2997,24 @@ pub mod light_client {
pub struct SetPermissionedProverCall {
pub prover: ::ethers::core::types::Address,
}
+ ///Container type for all input parameters for the `stateUpdateBlockNumbers` function with signature `stateUpdateBlockNumbers(uint256)` and selector `0xa51e6fea`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthCall,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[ethcall(
+ name = "stateUpdateBlockNumbers",
+ abi = "stateUpdateBlockNumbers(uint256)"
+ )]
+ pub struct StateUpdateBlockNumbersCall(pub ::ethers::core::types::U256);
///Container type for all input parameters for the `states` function with signature `states(uint32)` and selector `0x7f17baad`
#[derive(
Clone,
@@ -2714,8 +3112,13 @@ pub mod light_client {
FrozenThreshold(FrozenThresholdCall),
GetFinalizedState(GetFinalizedStateCall),
GetGenesisState(GetGenesisStateCall),
+ GetHotShotBlockCommitmentsCount(GetHotShotBlockCommitmentsCountCall),
+ GetHotShotCommitment(GetHotShotCommitmentCall),
+ GetStateUpdateBlockNumbersCount(GetStateUpdateBlockNumbersCountCall),
GetVersion(GetVersionCall),
+ HotShotCommitments(HotShotCommitmentsCall),
Initialize(InitializeCall),
+ LagOverEscapeHatchThreshold(LagOverEscapeHatchThresholdCall),
NewFinalizedState(NewFinalizedStateCall),
Owner(OwnerCall),
PermissionedProver(PermissionedProverCall),
@@ -2723,6 +3126,7 @@ pub mod light_client {
ProxiableUUID(ProxiableUUIDCall),
RenounceOwnership(RenounceOwnershipCall),
SetPermissionedProver(SetPermissionedProverCall),
+ StateUpdateBlockNumbers(StateUpdateBlockNumbersCall),
States(StatesCall),
TransferOwnership(TransferOwnershipCall),
UpgradeToAndCall(UpgradeToAndCallCall),
@@ -2778,12 +3182,41 @@ pub mod light_client {
{
return Ok(Self::GetGenesisState(decoded));
}
+ if let Ok(decoded) =
+ ::decode(
+ data,
+ )
+ {
+ return Ok(Self::GetHotShotBlockCommitmentsCount(decoded));
+ }
+ if let Ok(decoded) =
+ ::decode(data)
+ {
+ return Ok(Self::GetHotShotCommitment(decoded));
+ }
+ if let Ok(decoded) =
+ ::decode(
+ data,
+ )
+ {
+ return Ok(Self::GetStateUpdateBlockNumbersCount(decoded));
+ }
if let Ok(decoded) = ::decode(data) {
return Ok(Self::GetVersion(decoded));
}
+ if let Ok(decoded) =
+ ::decode(data)
+ {
+ return Ok(Self::HotShotCommitments(decoded));
+ }
if let Ok(decoded) = ::decode(data) {
return Ok(Self::Initialize(decoded));
}
+ if let Ok(decoded) =
+ ::decode(data)
+ {
+ return Ok(Self::LagOverEscapeHatchThreshold(decoded));
+ }
if let Ok(decoded) =
::decode(data)
{
@@ -2816,6 +3249,11 @@ pub mod light_client {
{
return Ok(Self::SetPermissionedProver(decoded));
}
+ if let Ok(decoded) =
+ ::decode(data)
+ {
+ return Ok(Self::StateUpdateBlockNumbers(decoded));
+ }
if let Ok(decoded) = ::decode(data) {
return Ok(Self::States(decoded));
}
@@ -2862,8 +3300,23 @@ pub mod light_client {
Self::FrozenThreshold(element) => ::ethers::core::abi::AbiEncode::encode(element),
Self::GetFinalizedState(element) => ::ethers::core::abi::AbiEncode::encode(element),
Self::GetGenesisState(element) => ::ethers::core::abi::AbiEncode::encode(element),
+ Self::GetHotShotBlockCommitmentsCount(element) => {
+ ::ethers::core::abi::AbiEncode::encode(element)
+ }
+ Self::GetHotShotCommitment(element) => {
+ ::ethers::core::abi::AbiEncode::encode(element)
+ }
+ Self::GetStateUpdateBlockNumbersCount(element) => {
+ ::ethers::core::abi::AbiEncode::encode(element)
+ }
Self::GetVersion(element) => ::ethers::core::abi::AbiEncode::encode(element),
+ Self::HotShotCommitments(element) => {
+ ::ethers::core::abi::AbiEncode::encode(element)
+ }
Self::Initialize(element) => ::ethers::core::abi::AbiEncode::encode(element),
+ Self::LagOverEscapeHatchThreshold(element) => {
+ ::ethers::core::abi::AbiEncode::encode(element)
+ }
Self::NewFinalizedState(element) => ::ethers::core::abi::AbiEncode::encode(element),
Self::Owner(element) => ::ethers::core::abi::AbiEncode::encode(element),
Self::PermissionedProver(element) => {
@@ -2877,6 +3330,9 @@ pub mod light_client {
Self::SetPermissionedProver(element) => {
::ethers::core::abi::AbiEncode::encode(element)
}
+ Self::StateUpdateBlockNumbers(element) => {
+ ::ethers::core::abi::AbiEncode::encode(element)
+ }
Self::States(element) => ::ethers::core::abi::AbiEncode::encode(element),
Self::TransferOwnership(element) => ::ethers::core::abi::AbiEncode::encode(element),
Self::UpgradeToAndCall(element) => ::ethers::core::abi::AbiEncode::encode(element),
@@ -2901,8 +3357,17 @@ pub mod light_client {
Self::FrozenThreshold(element) => ::core::fmt::Display::fmt(element, f),
Self::GetFinalizedState(element) => ::core::fmt::Display::fmt(element, f),
Self::GetGenesisState(element) => ::core::fmt::Display::fmt(element, f),
+ Self::GetHotShotBlockCommitmentsCount(element) => {
+ ::core::fmt::Display::fmt(element, f)
+ }
+ Self::GetHotShotCommitment(element) => ::core::fmt::Display::fmt(element, f),
+ Self::GetStateUpdateBlockNumbersCount(element) => {
+ ::core::fmt::Display::fmt(element, f)
+ }
Self::GetVersion(element) => ::core::fmt::Display::fmt(element, f),
+ Self::HotShotCommitments(element) => ::core::fmt::Display::fmt(element, f),
Self::Initialize(element) => ::core::fmt::Display::fmt(element, f),
+ Self::LagOverEscapeHatchThreshold(element) => ::core::fmt::Display::fmt(element, f),
Self::NewFinalizedState(element) => ::core::fmt::Display::fmt(element, f),
Self::Owner(element) => ::core::fmt::Display::fmt(element, f),
Self::PermissionedProver(element) => ::core::fmt::Display::fmt(element, f),
@@ -2910,6 +3375,7 @@ pub mod light_client {
Self::ProxiableUUID(element) => ::core::fmt::Display::fmt(element, f),
Self::RenounceOwnership(element) => ::core::fmt::Display::fmt(element, f),
Self::SetPermissionedProver(element) => ::core::fmt::Display::fmt(element, f),
+ Self::StateUpdateBlockNumbers(element) => ::core::fmt::Display::fmt(element, f),
Self::States(element) => ::core::fmt::Display::fmt(element, f),
Self::TransferOwnership(element) => ::core::fmt::Display::fmt(element, f),
Self::UpgradeToAndCall(element) => ::core::fmt::Display::fmt(element, f),
@@ -2963,16 +3429,41 @@ pub mod light_client {
Self::GetGenesisState(value)
}
}
+ impl ::core::convert::From for LightClientCalls {
+ fn from(value: GetHotShotBlockCommitmentsCountCall) -> Self {
+ Self::GetHotShotBlockCommitmentsCount(value)
+ }
+ }
+ impl ::core::convert::From for LightClientCalls {
+ fn from(value: GetHotShotCommitmentCall) -> Self {
+ Self::GetHotShotCommitment(value)
+ }
+ }
+ impl ::core::convert::From for LightClientCalls {
+ fn from(value: GetStateUpdateBlockNumbersCountCall) -> Self {
+ Self::GetStateUpdateBlockNumbersCount(value)
+ }
+ }
impl ::core::convert::From for LightClientCalls {
fn from(value: GetVersionCall) -> Self {
Self::GetVersion(value)
}
}
+ impl ::core::convert::From for LightClientCalls {
+ fn from(value: HotShotCommitmentsCall) -> Self {
+ Self::HotShotCommitments(value)
+ }
+ }
impl ::core::convert::From for LightClientCalls {
fn from(value: InitializeCall) -> Self {
Self::Initialize(value)
}
}
+ impl ::core::convert::From for LightClientCalls {
+ fn from(value: LagOverEscapeHatchThresholdCall) -> Self {
+ Self::LagOverEscapeHatchThreshold(value)
+ }
+ }
impl ::core::convert::From for LightClientCalls {
fn from(value: NewFinalizedStateCall) -> Self {
Self::NewFinalizedState(value)
@@ -3008,6 +3499,11 @@ pub mod light_client {
Self::SetPermissionedProver(value)
}
}
+ impl ::core::convert::From for LightClientCalls {
+ fn from(value: StateUpdateBlockNumbersCall) -> Self {
+ Self::StateUpdateBlockNumbers(value)
+ }
+ }
impl ::core::convert::From for LightClientCalls {
fn from(value: StatesCall) -> Self {
Self::States(value)
@@ -3145,6 +3641,48 @@ pub mod light_client {
Hash,
)]
pub struct GetGenesisStateReturn(pub LightClientState);
+ ///Container type for all return fields from the `getHotShotBlockCommitmentsCount` function with signature `getHotShotBlockCommitmentsCount()` and selector `0x54646085`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthAbiType,
+ ::ethers::contract::EthAbiCodec,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ pub struct GetHotShotBlockCommitmentsCountReturn(pub ::ethers::core::types::U256);
+ ///Container type for all return fields from the `getHotShotCommitment` function with signature `getHotShotCommitment(uint256)` and selector `0x8584d23f`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthAbiType,
+ ::ethers::contract::EthAbiCodec,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ pub struct GetHotShotCommitmentReturn(pub HotShotCommitment);
+ ///Container type for all return fields from the `getStateUpdateBlockNumbersCount` function with signature `getStateUpdateBlockNumbersCount()` and selector `0x7053fc51`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthAbiType,
+ ::ethers::contract::EthAbiCodec,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ pub struct GetStateUpdateBlockNumbersCountReturn(pub ::ethers::core::types::U256);
///Container type for all return fields from the `getVersion` function with signature `getVersion()` and selector `0x0d8e6e2c`
#[derive(
Clone,
@@ -3163,6 +3701,37 @@ pub mod light_client {
pub minor_version: u8,
pub patch_version: u8,
}
+ ///Container type for all return fields from the `hotShotCommitments` function with signature `hotShotCommitments(uint256)` and selector `0xdb13b60a`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthAbiType,
+ ::ethers::contract::EthAbiCodec,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ pub struct HotShotCommitmentsReturn {
+ pub block_height: u64,
+ pub block_comm_root: ::ethers::core::types::U256,
+ }
+ ///Container type for all return fields from the `lagOverEscapeHatchThreshold` function with signature `lagOverEscapeHatchThreshold(uint256,uint256)` and selector `0xe0303301`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthAbiType,
+ ::ethers::contract::EthAbiCodec,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ pub struct LagOverEscapeHatchThresholdReturn(pub bool);
///Container type for all return fields from the `owner` function with signature `owner()` and selector `0x8da5cb5b`
#[derive(
Clone,
@@ -3219,6 +3788,20 @@ pub mod light_client {
Hash,
)]
pub struct ProxiableUUIDReturn(pub [u8; 32]);
+ ///Container type for all return fields from the `stateUpdateBlockNumbers` function with signature `stateUpdateBlockNumbers(uint256)` and selector `0xa51e6fea`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthAbiType,
+ ::ethers::contract::EthAbiCodec,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ pub struct StateUpdateBlockNumbersReturn(pub ::ethers::core::types::U256);
///Container type for all return fields from the `states` function with signature `states(uint32)` and selector `0x7f17baad`
#[derive(
Clone,
diff --git a/contract-bindings/src/light_client_mock.rs b/contract-bindings/src/light_client_mock.rs
index 59c983a95..1a755d3e7 100644
--- a/contract-bindings/src/light_client_mock.rs
+++ b/contract-bindings/src/light_client_mock.rs
@@ -219,6 +219,65 @@ pub mod light_client_mock {
state_mutability: ::ethers::core::abi::ethabi::StateMutability::View,
},],
),
+ (
+ ::std::borrow::ToOwned::to_owned("getHotShotBlockCommitmentsCount"),
+ ::std::vec![::ethers::core::abi::ethabi::Function {
+ name: ::std::borrow::ToOwned::to_owned("getHotShotBlockCommitmentsCount",),
+ inputs: ::std::vec![],
+ outputs: ::std::vec![::ethers::core::abi::ethabi::Param {
+ name: ::std::string::String::new(),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint256"),
+ ),
+ },],
+ constant: ::core::option::Option::None,
+ state_mutability: ::ethers::core::abi::ethabi::StateMutability::View,
+ },],
+ ),
+ (
+ ::std::borrow::ToOwned::to_owned("getHotShotCommitment"),
+ ::std::vec![::ethers::core::abi::ethabi::Function {
+ name: ::std::borrow::ToOwned::to_owned("getHotShotCommitment",),
+ inputs: ::std::vec![::ethers::core::abi::ethabi::Param {
+ name: ::std::borrow::ToOwned::to_owned("hotShotBlockHeight",),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint256"),
+ ),
+ },],
+ outputs: ::std::vec![::ethers::core::abi::ethabi::Param {
+ name: ::std::string::String::new(),
+ kind: ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![
+ ::ethers::core::abi::ethabi::ParamType::Uint(64usize),
+ ::ethers::core::abi::ethabi::ParamType::Uint(256usize),
+ ],),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned(
+ "struct LightClient.HotShotCommitment",
+ ),
+ ),
+ },],
+ constant: ::core::option::Option::None,
+ state_mutability: ::ethers::core::abi::ethabi::StateMutability::View,
+ },],
+ ),
+ (
+ ::std::borrow::ToOwned::to_owned("getStateUpdateBlockNumbersCount"),
+ ::std::vec![::ethers::core::abi::ethabi::Function {
+ name: ::std::borrow::ToOwned::to_owned("getStateUpdateBlockNumbersCount",),
+ inputs: ::std::vec![],
+ outputs: ::std::vec![::ethers::core::abi::ethabi::Param {
+ name: ::std::string::String::new(),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint256"),
+ ),
+ },],
+ constant: ::core::option::Option::None,
+ state_mutability: ::ethers::core::abi::ethabi::StateMutability::View,
+ },],
+ ),
(
::std::borrow::ToOwned::to_owned("getVersion"),
::std::vec![::ethers::core::abi::ethabi::Function {
@@ -251,6 +310,37 @@ pub mod light_client_mock {
state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure,
},],
),
+ (
+ ::std::borrow::ToOwned::to_owned("hotShotCommitments"),
+ ::std::vec![::ethers::core::abi::ethabi::Function {
+ name: ::std::borrow::ToOwned::to_owned("hotShotCommitments"),
+ inputs: ::std::vec![::ethers::core::abi::ethabi::Param {
+ name: ::std::string::String::new(),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint256"),
+ ),
+ },],
+ outputs: ::std::vec![
+ ::ethers::core::abi::ethabi::Param {
+ name: ::std::borrow::ToOwned::to_owned("blockHeight"),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint64"),
+ ),
+ },
+ ::ethers::core::abi::ethabi::Param {
+ name: ::std::borrow::ToOwned::to_owned("blockCommRoot"),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("BN254.ScalarField"),
+ ),
+ },
+ ],
+ constant: ::core::option::Option::None,
+ state_mutability: ::ethers::core::abi::ethabi::StateMutability::View,
+ },],
+ ),
(
::std::borrow::ToOwned::to_owned("initialize"),
::std::vec![::ethers::core::abi::ethabi::Function {
@@ -294,6 +384,37 @@ pub mod light_client_mock {
state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable,
},],
),
+ (
+ ::std::borrow::ToOwned::to_owned("lagOverEscapeHatchThreshold"),
+ ::std::vec![::ethers::core::abi::ethabi::Function {
+ name: ::std::borrow::ToOwned::to_owned("lagOverEscapeHatchThreshold",),
+ inputs: ::std::vec![
+ ::ethers::core::abi::ethabi::Param {
+ name: ::std::borrow::ToOwned::to_owned("blockNumber"),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint256"),
+ ),
+ },
+ ::ethers::core::abi::ethabi::Param {
+ name: ::std::borrow::ToOwned::to_owned("threshold"),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint256"),
+ ),
+ },
+ ],
+ outputs: ::std::vec![::ethers::core::abi::ethabi::Param {
+ name: ::std::string::String::new(),
+ kind: ::ethers::core::abi::ethabi::ParamType::Bool,
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("bool"),
+ ),
+ },],
+ constant: ::core::option::Option::None,
+ state_mutability: ::ethers::core::abi::ethabi::StateMutability::View,
+ },],
+ ),
(
::std::borrow::ToOwned::to_owned("newFinalizedState"),
::std::vec![::ethers::core::abi::ethabi::Function {
@@ -512,6 +633,57 @@ pub mod light_client_mock {
state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable,
},],
),
+ (
+ ::std::borrow::ToOwned::to_owned("setHotShotCommitments"),
+ ::std::vec![::ethers::core::abi::ethabi::Function {
+ name: ::std::borrow::ToOwned::to_owned("setHotShotCommitments",),
+ inputs: ::std::vec![::ethers::core::abi::ethabi::Param {
+ name: ::std::borrow::ToOwned::to_owned("values"),
+ kind: ::ethers::core::abi::ethabi::ParamType::Array(
+ ::std::boxed::Box::new(
+ ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![
+ ::ethers::core::abi::ethabi::ParamType::Uint(64usize),
+ ::ethers::core::abi::ethabi::ParamType::Uint(256usize),
+ ],),
+ ),
+ ),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned(
+ "struct LightClient.HotShotCommitment[]",
+ ),
+ ),
+ },],
+ outputs: ::std::vec![],
+ constant: ::core::option::Option::None,
+ state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable,
+ },],
+ ),
+ (
+ ::std::borrow::ToOwned::to_owned("setHotShotDownSince"),
+ ::std::vec![::ethers::core::abi::ethabi::Function {
+ name: ::std::borrow::ToOwned::to_owned("setHotShotDownSince",),
+ inputs: ::std::vec![::ethers::core::abi::ethabi::Param {
+ name: ::std::borrow::ToOwned::to_owned("l1Height"),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint256"),
+ ),
+ },],
+ outputs: ::std::vec![],
+ constant: ::core::option::Option::None,
+ state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable,
+ },],
+ ),
+ (
+ ::std::borrow::ToOwned::to_owned("setHotShotUp"),
+ ::std::vec![::ethers::core::abi::ethabi::Function {
+ name: ::std::borrow::ToOwned::to_owned("setHotShotUp"),
+ inputs: ::std::vec![],
+ outputs: ::std::vec![],
+ constant: ::core::option::Option::None,
+ state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable,
+ },],
+ ),
(
::std::borrow::ToOwned::to_owned("setPermissionedProver"),
::std::vec![::ethers::core::abi::ethabi::Function {
@@ -528,6 +700,48 @@ pub mod light_client_mock {
state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable,
},],
),
+ (
+ ::std::borrow::ToOwned::to_owned("setStateUpdateBlockNumbers"),
+ ::std::vec![::ethers::core::abi::ethabi::Function {
+ name: ::std::borrow::ToOwned::to_owned("setStateUpdateBlockNumbers",),
+ inputs: ::std::vec![::ethers::core::abi::ethabi::Param {
+ name: ::std::borrow::ToOwned::to_owned("values"),
+ kind: ::ethers::core::abi::ethabi::ParamType::Array(
+ ::std::boxed::Box::new(
+ ::ethers::core::abi::ethabi::ParamType::Uint(256usize),
+ ),
+ ),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint256[]"),
+ ),
+ },],
+ outputs: ::std::vec![],
+ constant: ::core::option::Option::None,
+ state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable,
+ },],
+ ),
+ (
+ ::std::borrow::ToOwned::to_owned("stateUpdateBlockNumbers"),
+ ::std::vec![::ethers::core::abi::ethabi::Function {
+ name: ::std::borrow::ToOwned::to_owned("stateUpdateBlockNumbers",),
+ inputs: ::std::vec![::ethers::core::abi::ethabi::Param {
+ name: ::std::string::String::new(),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint256"),
+ ),
+ },],
+ outputs: ::std::vec![::ethers::core::abi::ethabi::Param {
+ name: ::std::string::String::new(),
+ kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,),
+ internal_type: ::core::option::Option::Some(
+ ::std::borrow::ToOwned::to_owned("uint256"),
+ ),
+ },],
+ constant: ::core::option::Option::None,
+ state_mutability: ::ethers::core::abi::ethabi::StateMutability::View,
+ },],
+ ),
(
::std::borrow::ToOwned::to_owned("states"),
::std::vec![::ethers::core::abi::ethabi::Function {
@@ -829,6 +1043,13 @@ pub mod light_client_mock {
inputs: ::std::vec![],
},],
),
+ (
+ ::std::borrow::ToOwned::to_owned("InsufficientSnapshotHistory"),
+ ::std::vec![::ethers::core::abi::ethabi::AbiError {
+ name: ::std::borrow::ToOwned::to_owned("InsufficientSnapshotHistory",),
+ inputs: ::std::vec![],
+ },],
+ ),
(
::std::borrow::ToOwned::to_owned("InvalidAddress"),
::std::vec![::ethers::core::abi::ethabi::AbiError {
@@ -843,6 +1064,15 @@ pub mod light_client_mock {
inputs: ::std::vec![],
},],
),
+ (
+ ::std::borrow::ToOwned::to_owned("InvalidHotShotBlockForCommitmentCheck"),
+ ::std::vec![::ethers::core::abi::ethabi::AbiError {
+ name: ::std::borrow::ToOwned::to_owned(
+ "InvalidHotShotBlockForCommitmentCheck",
+ ),
+ inputs: ::std::vec![],
+ },],
+ ),
(
::std::borrow::ToOwned::to_owned("InvalidInitialization"),
::std::vec![::ethers::core::abi::ethabi::AbiError {
@@ -988,12 +1218,12 @@ pub mod light_client_mock {
pub static LIGHTCLIENTMOCK_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> =
::ethers::contract::Lazy::new(__abi);
#[rustfmt::skip]
- const __BYTECODE: &[u8] = b"`\xA0`@R0`\x80R4\x80\x15b\0\0\x15W`\0\x80\xFD[P`@Qb\0c\xCE8\x03\x80b\0c\xCE\x839\x81\x01`@\x81\x90Rb\0\08\x91b\0\x04\x1BV[b\0\0Bb\0\0VV[b\0\0N\x82\x82b\0\x01\nV[PPb\0\x04\xEEV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16\x15b\0\0\xA7W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80T`\x01`\x01`@\x1B\x03\x90\x81\x16\x14b\0\x01\x07W\x80T`\x01`\x01`@\x1B\x03\x19\x16`\x01`\x01`@\x1B\x03\x90\x81\x17\x82U`@Q\x90\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PV[\x81Q`\x01`\x01`@\x1B\x03\x16\x15\x15\x80b\0\x01/WP` \x82\x01Q`\x01`\x01`@\x1B\x03\x16\x15\x15[\x80b\0\x01=WP`\x80\x82\x01Q\x15[\x80b\0\x01KWP`\xA0\x82\x01Q\x15[\x80b\0\x01YWP`\xC0\x82\x01Q\x15[\x80b\0\x01gWP`\xE0\x82\x01Q\x15[\x80b\0\x01wWPc\xFF\xFF\xFF\xFF\x81\x16\x15[\x15b\0\x01\x96W`@QcP\xDD\x03\xF7`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81`\x05`\0\x80`\x04\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP\x81`\x05`\0\x80`\x08\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP`\0\x80`\x0Ca\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP\x80`\0\x80a\x01\0\n\x81T\x81c\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83c\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\0b\0\x03\x84\x83b\0\x03\xA1` \x1B` \x1CV[`\x01\x81\x90U`\xE0\x90\x93\x01Q`\x02\x81\x90U`\x03\x93\x90\x93UPP`\x04UV[`\x80\x80\x82\x01Q`\xA0\x83\x01Q`\xC0\x84\x01Q`@\x80Q` \x81\x01\x94\x90\x94R\x83\x01\x91\x90\x91R``\x82\x01R`\0\x91\x01`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x91\x90PV[\x80Q`\x01`\x01`@\x1B\x03\x81\x16\x81\x14b\0\x04\x01W`\0\x80\xFD[\x91\x90PV[\x80Qc\xFF\xFF\xFF\xFF\x81\x16\x81\x14b\0\x04\x01W`\0\x80\xFD[`\0\x80\x82\x84\x03a\x01 \x81\x12\x15b\0\x041W`\0\x80\xFD[a\x01\0\x80\x82\x12\x15b\0\x04BW`\0\x80\xFD[`@Q\x91P\x80\x82\x01`\x01`\x01`@\x1B\x03\x81\x11\x83\x82\x10\x17\x15b\0\x04tWcNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Rb\0\x04\x82\x85b\0\x03\xE9V[\x82Rb\0\x04\x92` \x86\x01b\0\x03\xE9V[` \x83\x01R`@\x85\x01Q`@\x83\x01R``\x85\x01Q``\x83\x01R`\x80\x85\x01Q`\x80\x83\x01R`\xA0\x85\x01Q`\xA0\x83\x01R`\xC0\x85\x01Q`\xC0\x83\x01R`\xE0\x85\x01Q`\xE0\x83\x01R\x81\x93Pb\0\x04\xE3\x81\x86\x01b\0\x04\x06V[\x92PPP\x92P\x92\x90PV[`\x80Qa^\xB6b\0\x05\x18`\09`\0\x81\x81a\x14\xD2\x01R\x81\x81a\x14\xFB\x01Ra\x16\xE9\x01Ra^\xB6`\0\xF3\xFE`\x80`@R`\x046\x10a\x01\x96W`\x005`\xE0\x1C\x80cqP\x18\xA6\x11a\0\xE1W\x80c\xA2D\xD5\x96\x11a\0\x8AW\x80c\xBD2Q\x9A\x11a\0dW\x80c\xBD2Q\x9A\x14a\x06\xBFW\x80c\xCAo\xE8U\x14a\x07\x01W\x80c\xF0h T\x14a\x07\x17W\x80c\xF2\xFD\xE3\x8B\x14a\x07IW`\0\x80\xFD[\x80c\xA2D\xD5\x96\x14a\x05\xE6W\x80c\xAA\x92'2\x14a\x06\x06W\x80c\xAD<\xB1\xCC\x14a\x06iW`\0\x80\xFD[\x80c\x7F\x17\xBA\xAD\x11a\0\xBBW\x80c\x7F\x17\xBA\xAD\x14a\x04\xDFW\x80c\x82\xD0\x7F\xF3\x14a\x05\x94W\x80c\x8D\xA5\xCB[\x14a\x05\xA9W`\0\x80\xFD[\x80cqP\x18\xA6\x14a\x04jW\x80cvg\x18\x08\x14a\x04\x7FW\x80cv\xB6\xB7\xCB\x14a\x04\xC9W`\0\x80\xFD[\x80c@\x999\xB7\x11a\x01CW\x80cR\xD1\x90-\x11a\x01\x1DW\x80cR\xD1\x90-\x14a\x04*W\x80cb\x82w3\x14a\x04?W\x80ci\xCCj\x04\x14a\x04UW`\0\x80\xFD[\x80c@\x999\xB7\x14a\x03sW\x80cHG\xAE]\x14a\x03\x93W\x80cO\x1E\xF2\x86\x14a\x04\x17W`\0\x80\xFD[\x80c1=\xF7\xB1\x11a\x01tW\x80c1=\xF7\xB1\x14a\x02\xB1W\x80c8+!Z\x14a\x02\xE9W\x80c9I\xD1\xE9\x14a\x03\rW`\0\x80\xFD[\x80c\x01?\xA5\xFC\x14a\x01\x9BW\x80c\r\x8En,\x14a\x01\xBDW\x80c *\n\xDB\x14a\x01\xEFW[`\0\x80\xFD[4\x80\x15a\x01\xA7W`\0\x80\xFD[Pa\x01\xBBa\x01\xB66`\x04aU\x87V[a\x07iV[\0[4\x80\x15a\x01\xC9W`\0\x80\xFD[P`@\x80Q`\x01\x81R`\0` \x82\x01\x81\x90R\x91\x81\x01\x91\x90\x91R``\x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\xFBW`\0\x80\xFD[Pa\x01\xBBa\x02\n6`\x04aV\xC9V[`\0\x80Tc\xFF\xFF\xFF\xFF`\x01`@\x1B\x91\x82\x90\x04\x16\x82R`\x05` \x81\x81R`@\x93\x84\x90 \x85Q\x81T\x92\x87\x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x81\x16\x90\x95\x02\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90\x93\x16\x94\x16\x93\x90\x93\x17\x17\x82U\x91\x83\x01Q`\x01\x82\x01U``\x83\x01Q`\x02\x82\x01U`\x80\x83\x01Q`\x03\x82\x01U`\xA0\x83\x01Q`\x04\x82\x01U`\xC0\x83\x01Q\x91\x81\x01\x91\x90\x91U`\xE0\x90\x91\x01Q`\x06\x90\x91\x01UV[4\x80\x15a\x02\xBDW`\0\x80\xFD[P`\x06Ta\x02\xD1\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x01\xE6V[4\x80\x15a\x02\xF5W`\0\x80\xFD[Pa\x02\xFF`\x03T\x81V[`@Q\x90\x81R` \x01a\x01\xE6V[4\x80\x15a\x03\x19W`\0\x80\xFD[Pa\x01\xBBa\x03(6`\x04aV\xE6V[`\0\x80Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x92\x16l\x01\0\0\0\0\0\0\0\0\0\0\0\0\x02\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x92\x16\x91\x90\x91\x17\x90UV[4\x80\x15a\x03\x7FW`\0\x80\xFD[Pa\x01\xBBa\x03\x8E6`\x04aWPV[a\x08\x81V[4\x80\x15a\x03\x9FW`\0\x80\xFD[Pa\x03\xA8a\x0B\xB9V[`@Qa\x01\xE6\x91\x90`\0a\x01\0\x82\x01\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x84Q\x16\x83R\x80` \x85\x01Q\x16` \x84\x01RP`@\x83\x01Q`@\x83\x01R``\x83\x01Q``\x83\x01R`\x80\x83\x01Q`\x80\x83\x01R`\xA0\x83\x01Q`\xA0\x83\x01R`\xC0\x83\x01Q`\xC0\x83\x01R`\xE0\x83\x01Q`\xE0\x83\x01R\x92\x91PPV[a\x01\xBBa\x04%6`\x04aY(V[a\x0C\xA1V[4\x80\x15a\x046W`\0\x80\xFD[Pa\x02\xFFa\x0C\xC0V[4\x80\x15a\x04KW`\0\x80\xFD[Pa\x02\xFF`\x02T\x81V[4\x80\x15a\x04aW`\0\x80\xFD[Pa\x01\xBBa\x0C\xEFV[4\x80\x15a\x04vW`\0\x80\xFD[Pa\x01\xBBa\r\xA1V[4\x80\x15a\x04\x8BW`\0\x80\xFD[P`\0Ta\x04\xB0\x90l\x01\0\0\0\0\0\0\0\0\0\0\0\0\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81V[`@Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x91\x16\x81R` \x01a\x01\xE6V[4\x80\x15a\x04\xD5W`\0\x80\xFD[Pa\x02\xFF`\x01T\x81V[4\x80\x15a\x04\xEBW`\0\x80\xFD[Pa\x05Ma\x04\xFA6`\x04aY\xE2V[`\x05` \x81\x90R`\0\x91\x82R`@\x90\x91 \x80T`\x01\x82\x01T`\x02\x83\x01T`\x03\x84\x01T`\x04\x85\x01T\x95\x85\x01T`\x06\x90\x95\x01Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x86\x16\x97`\x01`@\x1B\x90\x96\x04\x16\x95\x93\x94\x92\x93\x91\x92\x91\x90\x88V[`@\x80Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x99\x8A\x16\x81R\x98\x90\x97\x16` \x89\x01R\x95\x87\x01\x94\x90\x94R``\x86\x01\x92\x90\x92R`\x80\x85\x01R`\xA0\x84\x01R`\xC0\x83\x01R`\xE0\x82\x01Ra\x01\0\x01a\x01\xE6V[4\x80\x15a\x05\xA0W`\0\x80\xFD[Pa\x03\xA8a\r\xB3V[4\x80\x15a\x05\xB5W`\0\x80\xFD[P\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16a\x02\xD1V[4\x80\x15a\x05\xF2W`\0\x80\xFD[Pa\x01\xBBa\x06\x016`\x04aY\xFDV[a\x0E\x98V[4\x80\x15a\x06\x12W`\0\x80\xFD[Pa\x02\xFFa\x06!6`\x04aV\xC9V[`\x80\x80\x82\x01Q`\xA0\x83\x01Q`\xC0\x84\x01Q`@\x80Q` \x81\x01\x94\x90\x94R\x83\x01\x91\x90\x91R``\x82\x01R`\0\x91\x01`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x91\x90PV[4\x80\x15a\x06uW`\0\x80\xFD[Pa\x06\xB2`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01\x7F5.0.0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RP\x81V[`@Qa\x01\xE6\x91\x90aZhV[4\x80\x15a\x06\xCBW`\0\x80\xFD[P`\x06Ta\x06\xF1\x90t\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16\x81V[`@Q\x90\x15\x15\x81R` \x01a\x01\xE6V[4\x80\x15a\x07\rW`\0\x80\xFD[Pa\x02\xFF`\x04T\x81V[4\x80\x15a\x07#W`\0\x80\xFD[P`\0Ta\x074\x90c\xFF\xFF\xFF\xFF\x16\x81V[`@Qc\xFF\xFF\xFF\xFF\x90\x91\x16\x81R` \x01a\x01\xE6V[4\x80\x15a\x07UW`\0\x80\xFD[Pa\x01\xBBa\x07d6`\x04aU\x87V[a\x10$V[a\x07qa\x10{V[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x07\xB1W`@Q\x7F\xE6\xC4${\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x06T`\x01`\x01`\xA0\x1B\x03\x90\x81\x16\x90\x82\x16\x03a\x07\xF9W`@Q\x7F\xA8c\xAE\xC9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x06\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16`\x01`\x01`\xA0\x1B\x03\x83\x81\x16\x91\x90\x91\x17t\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x17\x91\x82\x90U`@Q\x91\x16\x81R\x7F\x80\x17\xBB\x88\x7F\xDF\x8F\xCAC\x14\xA9\xD4\x0Fns\xB3\xB8\x10\x02\xD6~\\\xFA\x85\xD8\x81s\xAFj\xA4`r\x90` \x01[`@Q\x80\x91\x03\x90\xA1PV[`\x06Tt\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16\x80\x15a\x08\xB6WP`\x06T`\x01`\x01`\xA0\x1B\x03\x163\x14\x15[\x15a\t/W`\x06T`\x01`\x01`\xA0\x1B\x03\x16a\x08\xFDW`@Q\x7F%\xCD\xA3\xCE\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Q\x7F\xA3\xA6G\x80\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\t7a\r\xB3V[Q\x82Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x91\x82\x16\x91\x16\x11\x15\x80a\txWPa\tXa\r\xB3V[` \x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x82` \x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x11\x15[\x15a\t\xAFW`@Q\x7F\x05\x1CF\xEF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x80Ta\t\xDE\x90c\xFF\xFF\xFF\xFF\x81\x16\x90l\x01\0\0\0\0\0\0\0\0\0\0\0\0\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16aZ\xB1V[`\0\x80Tc\xFF\xFF\xFF\xFF`\x01`@\x1B\x91\x82\x90\x04\x16\x82R`\x05` R`@\x90\x91 T\x91\x92P\x90\x04g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x81\x16\x90\x82\x16\x14\x80\x15\x81a\n7WP\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x84` \x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x11[\x15a\n\x7FW`@Q\x7F\x1B#5\xF8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[a\n\x8C\x84`@\x01Qa\x10\xEFV[a\n\x99\x84``\x01Qa\x10\xEFV[a\n\xA6\x84`\x80\x01Qa\x10\xEFV[a\n\xB3\x84`\xA0\x01Qa\x10\xEFV[a\n\xC0\x84`\xC0\x01Qa\x10\xEFV[\x80\x15a\n\xCEWa\n\xCEa\x11_V[a\n\xD8\x84\x84a\x12\xBCV[`\0\x80Tc\xFF\xFF\xFF\xFF`\x01`@\x1B\x91\x82\x90\x04\x16\x82R`\x05` \x81\x81R`@\x93\x84\x90 \x88Q\x81T\x8A\x84\x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x81\x16\x96\x87\x02\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90\x92\x16\x92\x16\x91\x82\x17\x17\x82U\x89\x86\x01Q`\x01\x83\x01\x81\x90U``\x8B\x01Q`\x02\x84\x01U`\x80\x8B\x01Q`\x03\x84\x01U`\xA0\x8B\x01Q`\x04\x84\x01U`\xC0\x8B\x01Q\x94\x83\x01\x94\x90\x94U`\xE0\x8A\x01Q`\x06\x90\x92\x01\x91\x90\x91U\x93Q\x91\x82R\x91\x92\x91\x7F\xA0Jw9$PZA\x85d67%\xF5h2\xF5w.k\x8D\r\xBDn\xFC\xE7$\xDF\xE8\x03\xDA\xE6\x91\x01`@Q\x80\x91\x03\x90\xA3PPPPV[a\x0C\x15`@Q\x80a\x01\0\x01`@R\x80`\0g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\0g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[P`\0\x80Td\x01\0\0\0\0\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05` \x81\x81R`@\x92\x83\x90 \x83Qa\x01\0\x81\x01\x85R\x81Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x16\x83R`\x01`@\x1B\x90\x91\x04\x16\x92\x81\x01\x92\x90\x92R`\x01\x81\x01T\x93\x82\x01\x93\x90\x93R`\x02\x83\x01T``\x82\x01R`\x03\x83\x01T`\x80\x82\x01R`\x04\x83\x01T`\xA0\x82\x01R\x90\x82\x01T`\xC0\x82\x01R`\x06\x90\x91\x01T`\xE0\x82\x01R\x90V[a\x0C\xA9a\x14\xC7V[a\x0C\xB2\x82a\x15\x97V[a\x0C\xBC\x82\x82a\x15\xD8V[PPV[`\0a\x0C\xCAa\x16\xDEV[P\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x90V[a\x0C\xF7a\x10{V[`\x06Tt\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16\x15a\rmW`\x06\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x90U`@Q\x7F\x9A_W\xDE\x85m\xD6h\xC5M\xD9^\\U\xDF\x93C!q\xCB\xCAI\xA8wmV \xEAY\xC0$P\x90`\0\x90\xA1V[`@Q\x7F\xA8c\xAE\xC9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[a\r\xA9a\x10{V[a\r\x9F`\0a\x17@V[a\x0E\x0F`@Q\x80a\x01\0\x01`@R\x80`\0g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\0g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[P`\0\x80Tc\xFF\xFF\xFF\xFF`\x01`@\x1B\x91\x82\x90\x04\x16\x82R`\x05` \x81\x81R`@\x93\x84\x90 \x84Qa\x01\0\x81\x01\x86R\x81Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x16\x83R\x95\x90\x04\x90\x94\x16\x91\x84\x01\x91\x90\x91R`\x01\x81\x01T\x93\x83\x01\x93\x90\x93R`\x02\x83\x01T``\x83\x01R`\x03\x83\x01T`\x80\x83\x01R`\x04\x83\x01T`\xA0\x83\x01R\x82\x01T`\xC0\x82\x01R`\x06\x90\x91\x01T`\xE0\x82\x01R\x90V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\0\x81\x15\x80\x15a\x0E\xDEWP\x82[\x90P`\0\x82g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\x01\x14\x80\x15a\x0E\xFBWP0;\x15[\x90P\x81\x15\x80\x15a\x0F\tWP\x80\x15[\x15a\x0F@W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\x16`\x01\x17\x85U\x83\x15a\x0F\x86W\x84Th\xFF\0\0\0\0\0\0\0\0\x19\x16`\x01`@\x1B\x17\x85U[a\x0F\x8F\x86a\x17\xC9V[a\x0F\x97a\x17\xDAV[`\0\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\xFF\xFF\xFF\xFF\x16`\x01`@\x1B\x17\x90Ua\x0F\xCF\x88\x88a\x17\xE2V[\x83\x15a\x10\x1AW\x84Th\xFF\0\0\0\0\0\0\0\0\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPPPV[a\x10,a\x10{V[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x10oW`@Q\x7F\x1EO\xBD\xF7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\0`\x04\x82\x01R`$\x01a\nvV[a\x10x\x81a\x17@V[PV[3a\x10\xAD\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\r\x9FW`@Q\x7F\x11\x8C\xDA\xA7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R3`\x04\x82\x01R`$\x01a\nvV[\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x81\x10\x80a\x0C\xBCW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1B`$\x82\x01R\x7FBn254: invalid scalar field\0\0\0\0\0`D\x82\x01R`d\x01a\nvV[`\0\x80T`\x01`@\x1B\x80\x82\x04c\xFF\xFF\xFF\xFF\x16\x80\x84R`\x05` \x81\x81R`@\x80\x87 \x81Qa\x01\0\x81\x01\x83R\x81Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x16\x83R\x97\x90\x04\x87\x16\x81\x85\x01R`\x01\x80\x83\x01T\x82\x85\x01R`\x02\x80\x84\x01T``\x80\x85\x01\x91\x90\x91R`\x03\x80\x86\x01T`\x80\x80\x87\x01\x82\x90R`\x04\x80\x89\x01T`\xA0\x89\x01\x81\x90R\x89\x8D\x01T`\xC0\x8A\x01\x81\x90R`\x06\x90\x9A\x01\x80T`\xE0\x90\x9A\x01\x99\x90\x99R\x8AQ\x80\x8D\x01\x94\x90\x94R\x83\x8B\x01R\x82\x85\x01\x98\x90\x98R\x88Q\x80\x83\x03\x90\x94\x01\x84R\x01\x90\x96R\x80Q\x90\x87\x01 \x85T\x83U\x94\x85\x90U\x83T\x90U\x95\x89R\x93\x90\x92R\x91T\x90U\x93\x90\x92\x90\x91`\x0C\x91a\x12T\x91\x85\x91l\x01\0\0\0\0\0\0\0\0\0\0\0\0\x90\x04\x16aZ\xD5V[\x82Ta\x01\0\x92\x90\x92\ng\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x81\x02\x19\x90\x93\x16\x91\x83\x16\x02\x17\x90\x91U`\0T`@Ql\x01\0\0\0\0\0\0\0\0\0\0\0\0\x90\x91\x04\x90\x91\x16\x81R\x7F\xDB5X%\x9E\x03\x9D~P\xE8\x16\xB9\xDC\xCE0\xFB\x11M\x8A\x9C\x86\xEC\xA5\xAB\x14\xB6\x01\x94\xD6\x94]?\x91P` \x01a\x08vV[`\0a\x12\xC6a\x1A\xD2V[`@\x80Q`\x08\x80\x82Ra\x01 \x82\x01\x90\x92R\x91\x92P`\0\x91\x90` \x82\x01a\x01\0\x806\x837\x01\x90PP\x90P`\x02T\x81`\0\x81Q\x81\x10a\x13\x05Wa\x13\x05aZ\xF6V[` \x02` \x01\x01\x81\x81RPP\x83`\0\x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81`\x01\x81Q\x81\x10a\x133Wa\x133aZ\xF6V[` \x02` \x01\x01\x81\x81RPP\x83` \x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81`\x02\x81Q\x81\x10a\x13aWa\x13aaZ\xF6V[` \x02` \x01\x01\x81\x81RPP\x83`@\x01Q\x81`\x03\x81Q\x81\x10a\x13\x85Wa\x13\x85aZ\xF6V[` \x02` \x01\x01\x81\x81RPP\x83``\x01Q\x81`\x04\x81Q\x81\x10a\x13\xA9Wa\x13\xA9aZ\xF6V[` \x90\x81\x02\x91\x90\x91\x01\x81\x01\x91\x90\x91R`\0\x80T`\x01`@\x1B\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05\x91\x82\x90R`@\x90 `\x03\x01T\x82Q\x90\x91\x83\x91\x81\x10a\x13\xEDWa\x13\xEDaZ\xF6V[` \x90\x81\x02\x91\x90\x91\x01\x81\x01\x91\x90\x91R`\0\x80T`\x01`@\x1B\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05\x90\x91R`@\x90 `\x04\x01T\x81Q\x82\x90`\x06\x90\x81\x10a\x141Wa\x141aZ\xF6V[` \x90\x81\x02\x91\x90\x91\x01\x81\x01\x91\x90\x91R`\0\x80T`\x01`@\x1B\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05\x91\x82\x90R`@\x90 \x01T\x81Q\x82\x90`\x07\x90\x81\x10a\x14tWa\x14taZ\xF6V[` \x02` \x01\x01\x81\x81RPPa\x14\x8B\x82\x82\x85a \xB3V[a\x14\xC1W`@Q\x7F\t\xBD\xE39\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[PPPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14\x80a\x15`WP\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\x01`\x01`\xA0\x1B\x03\x16a\x15T\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBCT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\r\x9FW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x15\x9Fa\x10{V[`@Q`\x01`\x01`\xA0\x1B\x03\x82\x16\x81R\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x90` \x01a\x08vV[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x162WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x16/\x91\x81\x01\x90a[\x0CV[`\x01[a\x16sW`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\nvV[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x81\x14a\x16\xCFW`@Q\x7F\xAA\x1DI\xA4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x81\x01\x82\x90R`$\x01a\nvV[a\x16\xD9\x83\x83a!\x9EV[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\r\x9FW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81\x16`\x01`\x01`\xA0\x1B\x03\x84\x81\x16\x91\x82\x17\x84U`@Q\x92\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90`\0\x90\xA3PPPV[a\x17\xD1a!\xF4V[a\x10x\x81a\"VV[a\r\x9Fa!\xF4V[\x81Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x15\x15\x80a\x18\x08WP` \x82\x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x15\x15[\x80a\x18\x15WP`\x80\x82\x01Q\x15[\x80a\x18\"WP`\xA0\x82\x01Q\x15[\x80a\x18/WP`\xC0\x82\x01Q\x15[\x80a\x18!\x03<6\x8A\x93b-\xD4\x05\xB9\x05\xA0\xEB4L\x98\xB9\xD7\xCF\x08\xB0\xC5\xEB\xF7\xC89`\xA0\x82\x01QR~\x13y4*Mw\xD4p\x87C\xAF\xF0\x1F\xF2z\xA1\x19\x17G\x8F\xDC\x8E+}F0\x81sWr\xEA` `\xA0\x83\x01Q\x01R\x7F\x19M\xAF\x85\xD9\xEE\xD9\x93{(\xE2\xA6\x80\xFC\xC5\xA7i\"\xC1\\\xD3\x1D\xC4\xF6\0\xE1I9\xB8 \x0C\xE7`\xC0\x82\x01QR\x7F%(\x0B\x12F$\x91\x1C\x7F\x87\xB4\xC2\xD8\x7FY\xC6\xC0~>\xEE\xB1\raM\xA2\x16\xF6!\x9F\xFEP\xB6` `\xC0\x83\x01Q\x01R\x7F\x04\x88.\xF3\x98\x99\xEA8\xC9gzH\xB8\xF8\xCCjg(N\x17\xFF\x94\x02\x89\xFA\xAA5\x9E\xEC\x9B3\xA6`\xE0\x82\x01QR\x7F\x1B\xAE\x9F6\xE6\x19\x078\xC7\x11P\x1B\xE5?)\x9B\xF6\x13H\xE6\x1E.\xF9\xD5wv\x0Ed\xF6)6\x8D` `\xE0\x83\x01Q\x01R\x7F-\x81\r0\x12\x0C\xB9>\x1A%K\x89\xED\n\xE8lv\x1FI\xB4\xF1)E\x9C\xD54\xF9U\x18Q5\x0Fa\x01\0\x82\x01QR\x7F\x0B%9M\xA5\xA1\xD45\xDA\xCC\xC2\xEA\xDD\x03\x9E,'\t\xF5\xF4/\xAB\xD9\xAF\xBA\x81^\xD6-j\xF3k` a\x01\0\x83\x01Q\x01R\x7F\x1C,\xE7\xBEW\x0B\xEA\x9EC\xF3\xD3\xD7\xCB\xCA\x84\xBD\xB4\xFC\x89\xB5:\xE6WS\x1D\xE7&p\xA6\x10^\x08a\x01 \x82\x01QR\x7F\x1A\x02U\xEC\x8C|\x87i3[\xC9\xDCk\"*\xC6\xA0Nvm\x08\xB4\\\x8C\xC5sY,\x05\xBC\x9C\x14` a\x01 \x83\x01Q\x01R\x7F\x1C\x16AY\x13k\x8F[Gs\xE13\xF4\x83\xA8\xA1\x92\xAB\x15\xD6\xD3\xEE\x01/\x17\x1B=\x02\xFDE\x06\xE7a\x01@\x82\x01QR\x7F'.\xB7\xD63\xCE\xDBh\xCE\x01\x13\xF4B\n\xB5a\x0B\x81\xB8\xBA\x1A\xB94\x8D\xB1Wa\xD4\x0E\x8D\xF5\xBA` a\x01@\x83\x01Q\x01R\x7F\x0EDf9\xAAl\xAF%\xE9>\xF7G\x08N9\xB8\xEA\x90\xAB\xF2;\xB4\x8C(\xFD_\x9B\xA7\xBAeP\"a\x01`\x82\x01QR\x7F\x03>\x19Z\x9E\xA3\xA9\xCE@\xB7+g:\xFBEDL\xA1\xB1_\x05C\xF4M\x10\xF5\xC6@\xA7\x80go` a\x01`\x83\x01Q\x01R\x7F\x0E\x8D\xB2\xB2\x89=\xF2=\xD6\x81y\x96\xF7_\x10\0\x9D\x99\"\x07\x93\xECsa\x01\xC0\x82\x01QR\x7F\x19\xEB\x12\xA7\x82|\r\xDFc\x83\xFE\x80l9S\xBD\x06\xB0\x8A\xAE{\xF2\xA0\x1FU\xC9\x86\xA8OP\xCC(` a\x01\xC0\x83\x01Q\x01R\x7F\x01V\x910\x88F\xE6\x8E\xA8V\xA2\xCB$\xC9\x90?\x0C\x86\x05\xDE\xA1\x90\x82\x91\x80\xFFk\xDD\x1Ce\x08\x03a\x01\xE0\x82\x01QR\x7F\x1F\xFDx\x9B\x15[\x8A\xCB\x13\xE0\xF6\xA4\x8BP\xF7\xAA\x80\x92T\x08\x88\xD0\t\x14\x10W\xD4V\x90\x91X$` a\x01\xE0\x83\x01Q\x01R\x7F\x05E\xACz\xA6m\xCF7\x19\x98\x848\xC8\x06\xFCbM\xE5z\xB4?\x85\x809/\x88\xC8l\x13x\xCEJa\x02\0\x82\x01QR\x7F\x16\xB7\xF2P\x84.\xCFN6\x90pj\x1E\x15-zW\xF7\x0FUo\x92\x07m\xA7\x85\xFD\xD3c\xC1\x9F\xCF` a\x02\0\x83\x01Q\x01R\x7F \xCB\x7F\xF3Z\x83\xA7\xDC1@6\xE4p\xF1L0\xFB\x0E\x98\xD3]f;$;\",\xAAo\xC7\xDBDa\x02 \x82\x01QR\x7F\x14\x9FAWDpth\xBD\xAAN\x85E \x1A\xB4\r\x191\xA7\xD3\x1F#v\x8F\xA7\xC6Ut\xEE>\xAB` a\x02 \x83\x01Q\x01R\x7F\n%\xC1\xB7W9\x06\xDCN\x19;N\xA8/\xD1\xFE|\xCE\xBCM\x92]\xAD&\xF0\xFF\t\xC8L\x9F\x1Aua\x02@\x82\x01QR\x7F\nR\x1F\xF3\x0C\x8F6fy\x8F\x84|]L7\x96X\xFB\xA1\x01V\xE7\xA9I\x9F'\x13\xFA\xE9\xBF+\xE1` a\x02@\x83\x01Q\x01R\x7F\x03\xDBe\x10\xC3\xF16)\xFD\xED\x9AZ-AeK\xBC\xE4\xEFm\x02L\xADS\x10\0Q\xD4\xA3\xF3\xEB\xC9a\x02`\x82\x01QR\x7F\x08\xE8\n\\\x8EL\x9B\x9F&\xF3\0<\xC5\x94\x03\xA1\x8D16\xAF\xD00\x86\x8D%\xCC\x8B\x80~*\xB3p` a\x02`\x83\x01Q\x01R\x90V[`\0a \xBE\x82a\"^V[a \xE1\x83`\0\x81Q\x81\x10a \xD4Wa \xD4aZ\xF6V[` \x02` \x01\x01Qa\x10\xEFV[a \xF7\x83`\x01\x81Q\x81\x10a \xD4Wa \xD4aZ\xF6V[a!\r\x83`\x02\x81Q\x81\x10a \xD4Wa \xD4aZ\xF6V[a!#\x83`\x03\x81Q\x81\x10a \xD4Wa \xD4aZ\xF6V[a!9\x83`\x04\x81Q\x81\x10a \xD4Wa \xD4aZ\xF6V[a!O\x83`\x05\x81Q\x81\x10a \xD4Wa \xD4aZ\xF6V[a!e\x83`\x06\x81Q\x81\x10a \xD4Wa \xD4aZ\xF6V[a!{\x83`\x07\x81Q\x81\x10a \xD4Wa \xD4aZ\xF6V[`\0a!\x88\x85\x85\x85a#\x96V[\x90Pa!\x93\x81a%\x17V[\x91PP[\x93\x92PPPV[a!\xA7\x82a)\xDFV[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a!\xECWa\x16\xD9\x82\x82a*\x87V[a\x0C\xBCa*\xFFV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0T`\x01`@\x1B\x90\x04`\xFF\x16a\r\x9FW`@Q\x7F\xD7\xE6\xBC\xF8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x10,a!\xF4V[\x80Qa\"i\x90a+7V[a\"v\x81` \x01Qa+7V[a\"\x83\x81`@\x01Qa+7V[a\"\x90\x81``\x01Qa+7V[a\"\x9D\x81`\x80\x01Qa+7V[a\"\xAA\x81`\xA0\x01Qa+7V[a\"\xB7\x81`\xC0\x01Qa+7V[a\"\xC4\x81`\xE0\x01Qa+7V[a\"\xD2\x81a\x01\0\x01Qa+7V[a\"\xE0\x81a\x01 \x01Qa+7V[a\"\xEE\x81a\x01@\x01Qa+7V[a\"\xFC\x81a\x01`\x01Qa+7V[a#\n\x81a\x01\x80\x01Qa+7V[a#\x18\x81a\x01\xA0\x01Qa\x10\xEFV[a#&\x81a\x01\xC0\x01Qa\x10\xEFV[a#4\x81a\x01\xE0\x01Qa\x10\xEFV[a#B\x81a\x02\0\x01Qa\x10\xEFV[a#P\x81a\x02 \x01Qa\x10\xEFV[a#^\x81a\x02@\x01Qa\x10\xEFV[a#l\x81a\x02`\x01Qa\x10\xEFV[a#z\x81a\x02\x80\x01Qa\x10\xEFV[a#\x88\x81a\x02\xA0\x01Qa\x10\xEFV[a\x10x\x81a\x02\xC0\x01Qa\x10\xEFV[a#\x9EaT\xE1V[\x83` \x01Q\x83Q\x14a#\xDCW`@Q\x7FA\xF5;\x12\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a#\xE9\x85\x85\x85a+\xE1V[\x90P`\0a#\xFA\x86`\0\x01Qa/\x12V[\x90P`\0a$\r\x82\x84`\xA0\x01Q\x88a2\xF6V[`@\x80Q`\x1E\x80\x82Ra\x03\xE0\x82\x01\x90\x92R\x91\x92P`\0\x91\x90` \x82\x01a\x03\xC0\x806\x837PP`@\x80Q`\x1E\x80\x82Ra\x03\xE0\x82\x01\x90\x92R\x92\x93P`\0\x92\x91P` \x82\x01[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81R` \x01\x90`\x01\x90\x03\x90\x81a$PW\x90PP\x90P`\0a$\x89\x8A\x85\x8A\x89\x87\x87a3VV[`\xA0\x87\x01Q``\x87\x01Q\x91\x92P\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01`\0\x81\x83\x85\t`@\x80Qa\x01\0\x81\x01\x82R`\xE0\x9C\x8D\x01Q\x81R` \x81\x01\x96\x90\x96R\x85\x01RPPP``\x81\x01\x91\x90\x91R`\x80\x81\x01\x92\x90\x92R`\xA0\x82\x01Ra\x01`\x86\x01Q`\xC0\x82\x01Ra\x01\x80\x90\x95\x01Q\x92\x85\x01\x92\x90\x92RP\x91\x94\x93PPPPV[`@\x80Q\x80\x82\x01\x82R`\0\x80\x82R` \x80\x83\x01\x82\x90R\x83Q\x80\x85\x01\x85R\x82\x81R\x90\x81\x01\x82\x90R\x83Q`\x02\x80\x82R``\x82\x01\x90\x95R\x91\x93\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x93\x92\x85\x91\x81` \x01` \x82\x02\x806\x837PP`@\x80Q`\x02\x80\x82R``\x82\x01\x90\x92R\x92\x93P`\0\x92\x91P` \x82\x01[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81R` \x01\x90`\x01\x90\x03\x90\x81a%\x9DW\x90PP\x90P`\0`\x01\x90P\x80\x83`\0\x81Q\x81\x10a%\xE0Wa%\xE0aZ\xF6V[` \x02` \x01\x01\x81\x81RPP\x87`\xC0\x01Q\x82`\0\x81Q\x81\x10a&\x04Wa&\x04aZ\xF6V[` \x02` \x01\x01\x81\x90RP\x87`\0\x01Q\x83`\x01\x81Q\x81\x10a&'Wa&'aZ\xF6V[` \x02` \x01\x01\x81\x81RPP\x87`\xE0\x01Q\x82`\x01\x81Q\x81\x10a&KWa&KaZ\xF6V[` \x02` \x01\x01\x81\x90RPa&`\x82\x84a3\x8BV[`\x80\x89\x01QQ\x90\x95P``\x93P\x83\x92P\x90P`\0a&\x7F\x82`\x02a[%V[a&\x8A\x90`\x01a[%V[\x90P\x80g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a&\xA5Wa&\xA5aU\xA2V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a&\xCEW\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x93P\x80g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a&\xEAWa&\xEAaU\xA2V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a'/W\x81` \x01[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81R` \x01\x90`\x01\x90\x03\x90\x81a'\x08W\x90P[P\x92PPP`\0\x80`\0[\x89`\x80\x01QQ\x81\x10\x15a'\xD3W\x89`\x80\x01Q\x81\x81Q\x81\x10a']Wa']aZ\xF6V[` \x02` \x01\x01Q\x85\x83\x81Q\x81\x10a'wWa'waZ\xF6V[` \x02` \x01\x01\x81\x81RPP\x89`\xA0\x01Q\x81\x81Q\x81\x10a'\x99Wa'\x99aZ\xF6V[` \x02` \x01\x01Q\x84\x83\x81Q\x81\x10a'\xB3Wa'\xB3aZ\xF6V[` \x90\x81\x02\x91\x90\x91\x01\x01Ra'\xC9`\x01\x83a[%V[\x91P`\x01\x01a':V[P\x88` \x01Q\x84\x82\x81Q\x81\x10a'\xEBWa'\xEBaZ\xF6V[` \x02` \x01\x01\x81\x81RPP\x88`\xC0\x01Q\x83\x82\x81Q\x81\x10a(\x0EWa(\x0EaZ\xF6V[` \x90\x81\x02\x91\x90\x91\x01\x01Ra($`\x01\x82a[%V[\x89Q`@\x8B\x01Q\x91\x92P\x90`\0\x89\x82\x84\t\x90P\x80\x87\x85\x81Q\x81\x10a(JWa(JaZ\xF6V[` \x02` \x01\x01\x81\x81RPPPPP\x88`\xE0\x01Q\x83\x82\x81Q\x81\x10a(pWa(paZ\xF6V[` \x90\x81\x02\x91\x90\x91\x01\x01Ra(\x86`\x01\x82a[%V[``\x8A\x01Q\x90\x91P\x87\x81\x84\x08\x92PPa(\x9E\x82a4\x85V[\x84\x82\x81Q\x81\x10a(\xB0Wa(\xB0aZ\xF6V[` \x02` \x01\x01\x81\x81RPPa(\xE8`@\x80Q\x80\x82\x01\x82R`\0\x80\x82R` \x91\x82\x01R\x81Q\x80\x83\x01\x90\x92R`\x01\x82R`\x02\x90\x82\x01R\x90V[\x83\x82\x81Q\x81\x10a(\xFAWa(\xFAaZ\xF6V[` \x02` \x01\x01\x81\x90RPa)\x17a)\x12\x84\x86a3\x8BV[a4\xDBV[\x94PPPPP`\0`@Q\x80`\x80\x01`@R\x80\x7F\x01\x18\xC4\xD5\xB87\xBC\xC2\xBC\x89\xB5\xB3\x98\xB5\x97N\x9FYD\x07;2\x07\x8B~#\x1F\xEC\x93\x88\x83\xB0\x81R` \x01\x7F&\x0E\x01\xB2Q\xF6\xF1\xC7\xE7\xFFNX\x07\x91\xDE\xE8\xEAQ\xD8z5\x8E\x03\x8BN\xFE0\xFA\xC0\x93\x83\xC1\x81R` \x01\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U\x81R` \x01\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4\x81RP\x90Pa)\xD5\x83\x82\x84a)\xD0a5zV[a6KV[\x96\x95PPPPPPV[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a*.W`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\nvV[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa*\xA4\x91\x90a[8V[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a*\xDFW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a*\xE4V[``\x91P[P\x91P\x91Pa*\xF4\x85\x83\x83a7/V[\x92PPP[\x92\x91PPV[4\x15a\r\x9FW`@Q\x7F\xB3\x98\x97\x9F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80Q` \x82\x01Q`\0\x91\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x91\x15\x90\x15\x16\x15a+qWPPPV[\x82Q` \x84\x01Q\x82`\x03\x84\x85\x85\x86\t\x85\t\x08\x83\x82\x83\t\x14\x83\x82\x10\x84\x84\x10\x16\x16\x93PPP\x81a\x16\xD9W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x17`$\x82\x01R\x7FBn254: invalid G1 point\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\nvV[a,)`@Q\x80a\x01\0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`@\x80Q\x80\x82\x01\x90\x91R``\x81R`\0` \x82\x01R\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01a,j\x82\x87\x87a7\xA4V[\x81Q\x84Qa,w\x90a;\x85V[a,\x84\x86` \x01Qa;\x85V[a,\x91\x87`@\x01Qa;\x85V[a,\x9E\x88``\x01Qa;\x85V[a,\xAB\x89`\x80\x01Qa;\x85V[`@Q` \x01a,\xC0\x96\x95\x94\x93\x92\x91\x90a[TV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra,\xDB\x82aV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra.\xEB\x82a\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x90\x82\x01R\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0``\x82\x01R\x7F'$q6\x03\xBF\xBDy\n\xEA\xF3\xE7\xDF%\xD8\xE7\xEF\x8F1\x134\x90[M\x8C\x99\x98\x0C\xF2\x10\x97\x9D`\x80\x82\x01R\x90V[`@Q\x7F\xE2\xEF\t\xE5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x91\x90PV[a3\x1A`@Q\x80``\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[a3$\x84\x84a>\x08V[\x80\x82Ra34\x90\x85\x90\x85\x90a>nV[` \x82\x01R\x80Qa3J\x90\x85\x90\x84\x90\x86\x90a>\xF4V[`@\x82\x01R\x93\x92PPPV[`\0\x80a3d\x85\x87\x89a@\xBBV[\x90Pa3t\x88\x86\x89\x89\x88\x88aA\xBDV[a3\x7F\x81\x87\x86aD\xDBV[\x98\x97PPPPPPPPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x82Q\x82Q\x14a3\xF0W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FMSM error: length does not match`D\x82\x01R`d\x01a\nvV[a4.\x83`\0\x81Q\x81\x10a4\x06Wa4\x06aZ\xF6V[` \x02` \x01\x01Q\x83`\0\x81Q\x81\x10a4!Wa4!aZ\xF6V[` \x02` \x01\x01QaE=V[\x90P`\x01[\x82Q\x81\x10\x15a4~Wa4t\x82a4o\x86\x84\x81Q\x81\x10a4UWa4UaZ\xF6V[` \x02` \x01\x01Q\x86\x85\x81Q\x81\x10a4!Wa4!aZ\xF6V[aE\xE1V[\x91P`\x01\x01a43V[P\x92\x91PPV[`\0a4\xB1\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x83a\\\x97V[a*\xF9\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01a\\\xB9V[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81Q` \x83\x01Q\x15\x90\x15\x16\x15a5\x03WP\x90V[`@Q\x80`@\x01`@R\x80\x83`\0\x01Q\x81R` \x01\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x84` \x01Qa5H\x91\x90a\\\x97V[a5r\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDGa\\\xB9V[\x90R\x92\x91PPV[a5\xA5`@Q\x80`\x80\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`@Q\x80`\x80\x01`@R\x80\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x81R` \x01\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2\x81R` \x01\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA\x81R` \x01\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[\x81RP\x90P\x90V[`\0\x80`\0`@Q\x87Q\x81R` \x88\x01Q` \x82\x01R` \x87\x01Q`@\x82\x01R\x86Q``\x82\x01R``\x87\x01Q`\x80\x82\x01R`@\x87\x01Q`\xA0\x82\x01R\x85Q`\xC0\x82\x01R` \x86\x01Q`\xE0\x82\x01R` \x85\x01Qa\x01\0\x82\x01R\x84Qa\x01 \x82\x01R``\x85\x01Qa\x01@\x82\x01R`@\x85\x01Qa\x01`\x82\x01R` `\0a\x01\x80\x83`\x08Z\xFA\x91PP`\0Q\x91P\x80a7!W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1C`$\x82\x01R\x7FBn254: Pairing check failed!\0\0\0\0`D\x82\x01R`d\x01a\nvV[P\x15\x15\x90P[\x94\x93PPPPV[``\x82a7DWa7?\x82aF\x88V[a!\x97V[\x81Q\x15\x80\x15a7[WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a7\x9DW`@Q\x7F\x99\x96\xB3\x15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\nvV[P\x80a!\x97V[\x82Q`\xFE\x90a7\xDFa7\xB5\x83a<\xBCV[`@Q` \x01a7\xC7\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R`\0`\x04aF\xCAV[a8\x19a7\xEF\x86`\0\x01Qa<\xBCV[`@Q` \x01a8\x01\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R`\0`\x08aF\xCAV[a8)a7\xEF\x87` \x01Qa<\xBCV[`@Q` \x01a8<\x94\x93\x92\x91\x90a\\\xCCV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x85Ra8Y`\x01a<\xBCV[a8\x82\x7F/\x8D\xD1\xF1\xA7X^W\x84\x93P`\0[\x82\x81\x10\x15a>RW\x83\x85\x86\t\x94P`\x01\x01a>eV[`\x01\x83\x03\x93P[PPP\x92\x91PPV[`\0\x82`\x01\x03a>\x80WP`\x01a!\x97V[\x81`\0\x03a>\x90WP`\0a!\x97V[`@\x84\x01Q\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x90`\0\x90\x82\x81\x86\t\x90P\x85\x80\x15a>\xD2W`\x01\x87\x03\x92Pa>\xD9V[`\x01\x84\x03\x92P[Pa>\xE3\x82aG\xF2V[\x91P\x82\x82\x82\t\x97\x96PPPPPPPV[\x82Q`\0\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x90\x83\x83\x03a?\x87W`\x01`\0[\x82\x81\x10\x15a?zW\x81\x87\x03a?[W\x87\x81\x81Q\x81\x10a?HWa?HaZ\xF6V[` \x02` \x01\x01Q\x94PPPPPa7'V[\x83\x80a?iWa?ia\\\x81V[\x89``\x01Q\x83\t\x91P`\x01\x01a?'V[P`\0\x93PPPPa7'V[`\0\x80`\0\x80\x8A`@\x01Q\x90P`\0\x80a?\xA1\x8D\x88aH\xAAV[\x90P`\0\x87g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a?\xBEWa?\xBEaU\xA2V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a?\xE7W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x90P\x88\x8B\x85\t\x93P`\x01\x92P`\0[\x88\x81\x10\x15a@,W` \x81\x02` \x84\x01\x01Q\x95P\x89\x8D\x87\x8C\x03\x08\x96P\x89\x87\x85\t` \x82\x81\x02\x84\x01\x01\x88\x90R\x93P`\x01\x01a?\xF7V[Pa@6\x83aG\xF2V[\x92P`\0[\x88\x81\x10\x15a@\xA9W` \x81\x02` \x84\x01\x01Q\x95P\x89\x86\x86\t\x97P\x89\x84\x89\t\x97P`\0[\x89\x81\x10\x15a@\x88W\x80\x82\x14a@\x80W` \x81\x02` \x84\x01\x01Q\x97P\x8A\x88\x8A\t\x98P[`\x01\x01a@^V[P` \x81\x02` \x8F\x01\x01Q\x95P\x89\x86\x89\t\x97P\x89\x88\x8C\x08\x9AP`\x01\x01a@;V[PPPPPPPPPP\x94\x93PPPPV[`\0\x80\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x90P`\0\x83` \x01Q\x90P`\0\x84`@\x01Q\x90P`\0`\x01\x90P``\x88\x01Q`\x80\x89\x01Qa\x01\xA0\x89\x01Qa\x02@\x8A\x01Q\x87\x88\x89\x83\x87\t\x8A\x86\x86\x08\x08\x86\t\x94PPPa\x01\xC0\x89\x01Qa\x02`\x8A\x01Q\x87\x88\x89\x83\x87\t\x8A\x86\x86\x08\x08\x86\t\x94PPPa\x01\xE0\x89\x01Qa\x02\x80\x8A\x01Q\x87\x88\x89\x83\x87\t\x8A\x86\x86\x08\x08\x86\t\x94PPPa\x02\0\x89\x01Qa\x02\xA0\x8A\x01Q\x87\x88\x89\x83\x87\t\x8A\x86\x86\x08\x08\x86\t\x94PPPa\x02 \x89\x01Q\x91Pa\x02\xC0\x89\x01Q\x86\x87\x82\x89\x85\x87\x08\t\x85\t\x93PPPP\x87Q` \x89\x01Q\x85\x86\x86\x83\t\x87\x03\x85\x08\x96PP\x84\x85\x83\x83\t\x86\x03\x87\x08\x99\x98PPPPPPPPPV[aA\xCB\x86\x86\x86\x86\x85\x87aI\x9BV[`\xC0\x85\x01Q\x82Q\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x91\x90\x81\x90\x81\x90\x86\x90`\x14\x90\x81\x10aB\x0CWaB\x0CaZ\xF6V[` \x02` \x01\x01\x81\x81RPP\x85`\0\x01Q\x84`\x14\x81Q\x81\x10aB0WaB0aZ\xF6V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x15\x81Q\x81\x10aBUWaBUaZ\xF6V[` \x02` \x01\x01\x81\x81RPP\x85` \x01Q\x84`\x15\x81Q\x81\x10aByWaByaZ\xF6V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x16\x81Q\x81\x10aB\x9EWaB\x9EaZ\xF6V[` \x02` \x01\x01\x81\x81RPP\x85`@\x01Q\x84`\x16\x81Q\x81\x10aB\xC2WaB\xC2aZ\xF6V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x17\x81Q\x81\x10aB\xE7WaB\xE7aZ\xF6V[` \x02` \x01\x01\x81\x81RPP\x85``\x01Q\x84`\x17\x81Q\x81\x10aC\x0BWaC\x0BaZ\xF6V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x18\x81Q\x81\x10aC0WaC0aZ\xF6V[` \x02` \x01\x01\x81\x81RPP\x85`\x80\x01Q\x84`\x18\x81Q\x81\x10aCTWaCTaZ\xF6V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x19\x81Q\x81\x10aCyWaCyaZ\xF6V[` \x02` \x01\x01\x81\x81RPP\x88`@\x01Q\x84`\x19\x81Q\x81\x10aC\x9DWaC\x9DaZ\xF6V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1A\x81Q\x81\x10aC\xC2WaC\xC2aZ\xF6V[` \x02` \x01\x01\x81\x81RPP\x88``\x01Q\x84`\x1A\x81Q\x81\x10aC\xE6WaC\xE6aZ\xF6V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1B\x81Q\x81\x10aD\x0BWaD\x0BaZ\xF6V[` \x02` \x01\x01\x81\x81RPP\x88`\x80\x01Q\x84`\x1B\x81Q\x81\x10aD/WaD/aZ\xF6V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1C\x81Q\x81\x10aDTWaDTaZ\xF6V[` \x02` \x01\x01\x81\x81RPP\x88`\xA0\x01Q\x84`\x1C\x81Q\x81\x10aDxWaDxaZ\xF6V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x87`\xE0\x01Q\x85`\x1D\x81Q\x81\x10aD\xA1WaD\xA1aZ\xF6V[` \x02` \x01\x01\x81\x81RPP\x85`\xA0\x01Q\x84`\x1D\x81Q\x81\x10aD\xC5WaD\xC5aZ\xF6V[` \x02` \x01\x01\x81\x90RPPPPPPPPPPV[\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x83\x81\x03\x90`\0[`\n\x81\x10\x15aE4W` `\x15\x82\x01\x02\x84\x01Q` \x82\x02a\x01\xA0\x01\x86\x01Q\x83\x84\x82\x84\t\x86\x08\x94PPP`\x01\x01aE\x03V[PP\x93\x92PPPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01RaEYaU4V[\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R`@\x81\x01\x83\x90R`\0``\x83`\x80\x84`\x07a\x07\xD0Z\x03\xFA\x90P\x80\x80aE\x8BW`\0\x80\xFD[P\x80aE\xD9W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x19`$\x82\x01R\x7FBn254: scalar mul failed!\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\nvV[PP\x92\x91PPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01RaE\xFDaURV[\x83Q\x81R` \x80\x85\x01Q\x81\x83\x01R\x83Q`@\x83\x01R\x83\x01Q``\x80\x83\x01\x91\x90\x91R`\0\x90\x83`\xC0\x84`\x06a\x07\xD0Z\x03\xFA\x90P\x80\x80aF:W`\0\x80\xFD[P\x80aE\xD9W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: group addition failed!\0\0\0`D\x82\x01R`d\x01a\nvV[\x80Q\x15aF\x98W\x80Q\x80\x82` \x01\xFD[`@Q\x7F\x14%\xEAB\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x81aF\xD8\x81`\x1Fa[%V[\x10\x15aG&W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0E`$\x82\x01R\x7Fslice_overflow\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\nvV[aG0\x82\x84a[%V[\x84Q\x10\x15aG\x80W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x11`$\x82\x01R\x7Fslice_outOfBounds\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\nvV[``\x82\x15\x80\x15aG\x9FW`@Q\x91P`\0\x82R` \x82\x01`@RaG\xE9V[`@Q\x91P`\x1F\x84\x16\x80\x15` \x02\x81\x84\x01\x01\x85\x81\x01\x87\x83\x15` \x02\x84\x8B\x01\x01\x01[\x81\x83\x10\x15aG\xD8W\x80Q\x83R` \x92\x83\x01\x92\x01aG\xC0V[PP\x85\x84R`\x1F\x01`\x1F\x19\x16`@RP[P\x94\x93PPPPV[`\0\x80`\0\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x90P`@Q` \x81R` \x80\x82\x01R` `@\x82\x01R\x84``\x82\x01R`\x02\x82\x03`\x80\x82\x01R\x81`\xA0\x82\x01R` `\0`\xC0\x83`\x05Z\xFA\x92PP`\0Q\x92P\x81aH\xA3W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: pow precompile failed!\0\0\0`D\x82\x01R`d\x01a\nvV[PP\x91\x90PV[``\x82` \x01Q\x82\x11\x15aH\xEAW`@Q\x7F\x8C^\x11\xF1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x83\x01Q`\x01\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x84g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aI+WaI+aU\xA2V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15aITW\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x93P\x84\x15\x19\x15a>eW` \x84\x01\x85` \x02\x81\x01`\x01\x82R` \x82\x01\x91P[\x80\x82\x10\x15aI\x90W\x82\x85\x85\t\x93P\x83\x82R` \x82\x01\x91PaItV[PPPPP\x92\x91PPV[`\0\x80`\0\x80`\0\x80\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x90P\x80` \x8B\x01Q` \x8D\x01Q\t\x95P\x8AQ\x93P\x80`\xA0\x8C\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xA0\x8A\x01Q\x84\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80\x7F/\x8D\xD1\xF1\xA7X#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16\x15b\0\0\xA7W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80T`\x01`\x01`@\x1B\x03\x90\x81\x16\x14b\0\x01\x07W\x80T`\x01`\x01`@\x1B\x03\x19\x16`\x01`\x01`@\x1B\x03\x90\x81\x17\x82U`@Q\x90\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PV[\x81Q`\x01`\x01`@\x1B\x03\x16\x15\x15\x80b\0\x01/WP` \x82\x01Q`\x01`\x01`@\x1B\x03\x16\x15\x15[\x80b\0\x01=WP`\x80\x82\x01Q\x15[\x80b\0\x01KWP`\xA0\x82\x01Q\x15[\x80b\0\x01YWP`\xC0\x82\x01Q\x15[\x80b\0\x01gWP`\xE0\x82\x01Q\x15[\x80b\0\x01wWPc\xFF\xFF\xFF\xFF\x81\x16\x15[\x15b\0\x01\x96W`@QcP\xDD\x03\xF7`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81`\x05`\0\x80`\x04\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP\x81`\x05`\0\x80`\x08\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP`\0\x80`\x0Ca\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP\x80`\0\x80a\x01\0\n\x81T\x81c\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83c\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\0b\0\x03\x84\x83b\0\x04r` \x1B` \x1CV[`\x01\x81\x81U`\xE0\x85\x01Q`\x02\x81\x81U`\x03\x93\x90\x93U`\x04U`\x07\x80T\x80\x83\x01\x82U`\0\x91\x82RC\x7F\xA6l\xC9(\xB5\xED\xB8*\xF9\xBDI\x92)T\x15Z\xB7\xB0\x94&\x94\xBE\xA4\xCEDf\x1D\x9A\x876\xC6\x88\x90\x91\x01U`@\x80Q\x80\x82\x01\x82R` \x80\x89\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16\x83R\x92\x90\x98\x01Q\x97\x81\x01\x97\x88R`\x08\x80T\x94\x85\x01\x81U\x90\x92R\x90Q\x7F\xF3\xF7\xA9\xFE6O\xAA\xB9;!m\xA5\n2\x14\x15O\"\xA0\xA2\xB4\x15\xB2:\x84\xC8\x16\x9E\x8Bcn\xE3\x92\x90\x93\x02\x91\x82\x01\x80T`\x01`\x01`@\x1B\x03\x19\x16\x93\x90\x91\x16\x92\x90\x92\x17\x90\x91U\x92Q\x7F\xF3\xF7\xA9\xFE6O\xAA\xB9;!m\xA5\n2\x14\x15O\"\xA0\xA2\xB4\x15\xB2:\x84\xC8\x16\x9E\x8Bcn\xE4\x90\x93\x01\x92\x90\x92UPPV[`\x80\x80\x82\x01Q`\xA0\x83\x01Q`\xC0\x84\x01Q`@\x80Q` \x81\x01\x94\x90\x94R\x83\x01\x91\x90\x91R``\x82\x01R`\0\x91\x01`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x91\x90PV[\x80Q`\x01`\x01`@\x1B\x03\x81\x16\x81\x14b\0\x04\xD2W`\0\x80\xFD[\x91\x90PV[\x80Qc\xFF\xFF\xFF\xFF\x81\x16\x81\x14b\0\x04\xD2W`\0\x80\xFD[`\0\x80\x82\x84\x03a\x01 \x81\x12\x15b\0\x05\x02W`\0\x80\xFD[a\x01\0\x80\x82\x12\x15b\0\x05\x13W`\0\x80\xFD[`@Q\x91P\x80\x82\x01`\x01`\x01`@\x1B\x03\x81\x11\x83\x82\x10\x17\x15b\0\x05EWcNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Rb\0\x05S\x85b\0\x04\xBAV[\x82Rb\0\x05c` \x86\x01b\0\x04\xBAV[` \x83\x01R`@\x85\x01Q`@\x83\x01R``\x85\x01Q``\x83\x01R`\x80\x85\x01Q`\x80\x83\x01R`\xA0\x85\x01Q`\xA0\x83\x01R`\xC0\x85\x01Q`\xC0\x83\x01R`\xE0\x85\x01Q`\xE0\x83\x01R\x81\x93Pb\0\x05\xB4\x81\x86\x01b\0\x04\xD7V[\x92PPP\x92P\x92\x90PV[`\x80Qa_!b\0\x05\xE9`\09`\0\x81\x81a\x15\xDD\x01R\x81\x81a\x16\x06\x01Ra\x17r\x01Ra_!`\0\xF3\xFE`\x80`@R`\x046\x10a\x01\x94W`\x005`\xE0\x1C\x80c\x01?\xA5\xFC\x14a\x01\x99W\x80c\r\x8En,\x14a\x01\xBBW\x80c *\n\xDB\x14a\x01\xEDW\x80c-R\xAA\xD6\x14a\x02\x96W\x80c1=\xF7\xB1\x14a\x02\xC3W\x80c8+!Z\x14a\x02\xF0W\x80c9\x194\x0F\x14a\x03\x14W\x80c9I\xD1\xE9\x14a\x034W\x80c@\x999\xB7\x14a\x03{W\x80cHG\xAE]\x14a\x03\x9BW\x80cO\x1E\xF2\x86\x14a\x04\x1DW\x80cR\xD1\x90-\x14a\x040W\x80cS\x0C\xA7\x8F\x14a\x04EW\x80cTd`\x85\x14a\x04eW\x80cb\x82w3\x14a\x04zW\x80ci\xCCj\x04\x14a\x04\x90W\x80cpS\xFCQ\x14a\x04\xA5W\x80cqP\x18\xA6\x14a\x04\xBAW\x80cvg\x18\x08\x14a\x04\xCFW\x80cv\xB6\xB7\xCB\x14a\x05\x03W\x80c\x7F\x17\xBA\xAD\x14a\x05\x19W\x80c\x82\xD0\x7F\xF3\x14a\x05\xCCW\x80c\x85\x84\xD2?\x14a\x05\xE1W\x80c\x8D\xA5\xCB[\x14a\x06%W\x80c\xA2D\xD5\x96\x14a\x06:W\x80c\xA5\x1Eo\xEA\x14a\x06ZW\x80c\xAA\x92'2\x14a\x06zW\x80c\xAD<\xB1\xCC\x14a\x06\x9AW\x80c\xBD2Q\x9A\x14a\x06\xD8W\x80c\xC8\xE5\xE4\x98\x14a\x07\tW\x80c\xCAo\xE8U\x14a\x07%W\x80c\xDB\x13\xB6\n\x14a\x07;W\x80c\xE003\x01\x14a\x07zW\x80c\xF0h T\x14a\x07\x9AW\x80c\xF2\xFD\xE3\x8B\x14a\x07\xCCW[`\0\x80\xFD[4\x80\x15a\x01\xA5W`\0\x80\xFD[Pa\x01\xB9a\x01\xB46`\x04aR\xF1V[a\x07\xECV[\0[4\x80\x15a\x01\xC7W`\0\x80\xFD[P`@\x80Q`\x01\x81R`\0` \x82\x01\x81\x90R\x91\x81\x01\x91\x90\x91R``\x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\xF9W`\0\x80\xFD[Pa\x01\xB9a\x02\x086`\x04aTQV[`\0\x80Tc\xFF\xFF\xFF\xFF`\x01`@\x1B\x91\x82\x90\x04\x16\x82R`\x05` \x81\x81R`@\x93\x84\x90 \x85Q\x81T\x92\x87\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16\x90\x95\x02`\x01`\x01`\x80\x1B\x03\x19\x90\x93\x16\x94\x16\x93\x90\x93\x17\x17\x82U\x91\x83\x01Q`\x01\x82\x01U``\x83\x01Q`\x02\x82\x01U`\x80\x83\x01Q`\x03\x82\x01U`\xA0\x83\x01Q`\x04\x82\x01U`\xC0\x83\x01Q\x91\x81\x01\x91\x90\x91U`\xE0\x90\x91\x01Q`\x06\x90\x91\x01UV[4\x80\x15a\x02\xA2W`\0\x80\xFD[Pa\x01\xB9a\x02\xB16`\x04aTnV[`\t\x80T`\xFF\x19\x16`\x01\x17\x90U`\nUV[4\x80\x15a\x02\xCFW`\0\x80\xFD[P`\x06Ta\x02\xE3\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Qa\x01\xE4\x91\x90aT\x87V[4\x80\x15a\x02\xFCW`\0\x80\xFD[Pa\x03\x06`\x03T\x81V[`@Q\x90\x81R` \x01a\x01\xE4V[4\x80\x15a\x03 W`\0\x80\xFD[Pa\x01\xB9a\x03/6`\x04aT\xBEV[a\x08\xACV[4\x80\x15a\x03@W`\0\x80\xFD[Pa\x01\xB9a\x03O6`\x04aUSV[`\0\x80T`\x01`\x01`@\x1B\x03\x90\x92\x16`\x01``\x1B\x02`\x01``\x1B`\x01`\xA0\x1B\x03\x19\x90\x92\x16\x91\x90\x91\x17\x90UV[4\x80\x15a\x03\x87W`\0\x80\xFD[Pa\x01\xB9a\x03\x966`\x04aU\x9EV[a\x08\xCFV[4\x80\x15a\x03\xA7W`\0\x80\xFD[Pa\x03\xB0a\x0B\xFAV[`@Qa\x01\xE4\x91\x90`\0a\x01\0\x82\x01\x90P`\x01\x80`@\x1B\x03\x80\x84Q\x16\x83R\x80` \x85\x01Q\x16` \x84\x01RP`@\x83\x01Q`@\x83\x01R``\x83\x01Q``\x83\x01R`\x80\x83\x01Q`\x80\x83\x01R`\xA0\x83\x01Q`\xA0\x83\x01R`\xC0\x83\x01Q`\xC0\x83\x01R`\xE0\x83\x01Q`\xE0\x83\x01R\x92\x91PPV[a\x01\xB9a\x04+6`\x04aWXV[a\x0C\x8CV[4\x80\x15a\x04F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x16\x7Fa\x12\tV[\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x81`@Qa\x08\xA1\x91\x90aT\x87V[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x17\x08WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x17\x05\x91\x81\x01\x90aZ3V[`\x01[a\x17'W\x81`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x04\x01a\n9\x91\x90aT\x87V[`\0\x80Q` a^5\x839\x81Q\x91R\x81\x14a\x17XW`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\n9V[a\x17b\x83\x83a#=V[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\r\xAEW`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\x17\xBAa\x18\x0CV[\x80T`\x01`\x01`\xA0\x1B\x03\x84\x81\x16`\x01`\x01`\xA0\x1B\x03\x19\x83\x16\x81\x17\x84U`@Q\x93\x94P\x91\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90`\0\x90\xA3PPPV[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x90V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90V[a\x18\\a#\x93V[a\x12\x06\x81a#\xB8V[a\r\xAEa#\x93V[\x81Q`\x01`\x01`@\x1B\x03\x16\x15\x15\x80a\x18\x91WP` \x82\x01Q`\x01`\x01`@\x1B\x03\x16\x15\x15[\x80a\x18\x9EWP`\x80\x82\x01Q\x15[\x80a\x18\xABWP`\xA0\x82\x01Q\x15[\x80a\x18\xB8WP`\xC0\x82\x01Q\x15[\x80a\x18\xC5WP`\xE0\x82\x01Q\x15[\x80a\x18\xD4WPc\xFF\xFF\xFF\xFF\x81\x16\x15[\x15a\x18\xF2W`@QcP\xDD\x03\xF7`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81`\x05`\0\x80`\x04\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP\x81`\x05`\0\x80`\x08\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP`\0\x80`\x0Ca\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP\x80`\0\x80a\x01\0\n\x81T\x81c\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83c\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\0a\x1A\xD8\x83a\x11\x13V[`\x01\x81\x81U`\xE0\x85\x01Q`\x02\x81\x81U`\x03\x93\x90\x93U`\x04U`\x07\x80T\x80\x83\x01\x82U`\0\x91\x82RC`\0\x80Q` a]\xF5\x839\x81Q\x91R\x90\x91\x01U`@\x80Q\x80\x82\x01\x82R` \x80\x89\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16\x83R\x92\x90\x98\x01Q\x97\x81\x01\x97\x88R`\x08\x80T\x94\x85\x01\x81U\x90\x92R\x90Q`\0\x80Q` a^u\x839\x81Q\x91R\x92\x90\x93\x02\x91\x82\x01\x80T`\x01`\x01`@\x1B\x03\x19\x16\x93\x90\x91\x16\x92\x90\x92\x17\x90\x91U\x92Q`\0\x80Q` a^\xB5\x839\x81Q\x91R\x90\x93\x01\x92\x90\x92UPPV[`\x07T`\0\x90C\x84\x11\x80a\x1B\xA4WP`\x03\x81\x10[\x15a\x1B\xC2W`@Qc\xB0\xB48w`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x80\x80a\x1B\xD1`\x01\x85aZ\0V[\x90P[\x81a\x1C!\x03<6\x8A\x93b-\xD4\x05\xB9\x05\xA0\xEB4L\x98\xB9\xD7\xCF\x08\xB0\xC5\xEB\xF7\xC89`\xA0\x82\x01QR~\x13y4*Mw\xD4p\x87C\xAF\xF0\x1F\xF2z\xA1\x19\x17G\x8F\xDC\x8E+}F0\x81sWr\xEA` `\xA0\x83\x01Q\x01R\x7F\x19M\xAF\x85\xD9\xEE\xD9\x93{(\xE2\xA6\x80\xFC\xC5\xA7i\"\xC1\\\xD3\x1D\xC4\xF6\0\xE1I9\xB8 \x0C\xE7`\xC0\x82\x01QR\x7F%(\x0B\x12F$\x91\x1C\x7F\x87\xB4\xC2\xD8\x7FY\xC6\xC0~>\xEE\xB1\raM\xA2\x16\xF6!\x9F\xFEP\xB6` `\xC0\x83\x01Q\x01R\x7F\x04\x88.\xF3\x98\x99\xEA8\xC9gzH\xB8\xF8\xCCjg(N\x17\xFF\x94\x02\x89\xFA\xAA5\x9E\xEC\x9B3\xA6`\xE0\x82\x01QR\x7F\x1B\xAE\x9F6\xE6\x19\x078\xC7\x11P\x1B\xE5?)\x9B\xF6\x13H\xE6\x1E.\xF9\xD5wv\x0Ed\xF6)6\x8D` `\xE0\x83\x01Q\x01R\x7F-\x81\r0\x12\x0C\xB9>\x1A%K\x89\xED\n\xE8lv\x1FI\xB4\xF1)E\x9C\xD54\xF9U\x18Q5\x0Fa\x01\0\x82\x01QR\x7F\x0B%9M\xA5\xA1\xD45\xDA\xCC\xC2\xEA\xDD\x03\x9E,'\t\xF5\xF4/\xAB\xD9\xAF\xBA\x81^\xD6-j\xF3k` a\x01\0\x83\x01Q\x01R\x7F\x1C,\xE7\xBEW\x0B\xEA\x9EC\xF3\xD3\xD7\xCB\xCA\x84\xBD\xB4\xFC\x89\xB5:\xE6WS\x1D\xE7&p\xA6\x10^\x08a\x01 \x82\x01QR\x7F\x1A\x02U\xEC\x8C|\x87i3[\xC9\xDCk\"*\xC6\xA0Nvm\x08\xB4\\\x8C\xC5sY,\x05\xBC\x9C\x14` a\x01 \x83\x01Q\x01R\x7F\x1C\x16AY\x13k\x8F[Gs\xE13\xF4\x83\xA8\xA1\x92\xAB\x15\xD6\xD3\xEE\x01/\x17\x1B=\x02\xFDE\x06\xE7a\x01@\x82\x01QR\x7F'.\xB7\xD63\xCE\xDBh\xCE\x01\x13\xF4B\n\xB5a\x0B\x81\xB8\xBA\x1A\xB94\x8D\xB1Wa\xD4\x0E\x8D\xF5\xBA` a\x01@\x83\x01Q\x01R\x7F\x0EDf9\xAAl\xAF%\xE9>\xF7G\x08N9\xB8\xEA\x90\xAB\xF2;\xB4\x8C(\xFD_\x9B\xA7\xBAeP\"a\x01`\x82\x01QR\x7F\x03>\x19Z\x9E\xA3\xA9\xCE@\xB7+g:\xFBEDL\xA1\xB1_\x05C\xF4M\x10\xF5\xC6@\xA7\x80go` a\x01`\x83\x01Q\x01R\x7F\x0E\x8D\xB2\xB2\x89=\xF2=\xD6\x81y\x96\xF7_\x10\0\x9D\x99\"\x07\x93\xECsa\x01\xC0\x82\x01QR\x7F\x19\xEB\x12\xA7\x82|\r\xDFc\x83\xFE\x80l9S\xBD\x06\xB0\x8A\xAE{\xF2\xA0\x1FU\xC9\x86\xA8OP\xCC(` a\x01\xC0\x83\x01Q\x01R\x7F\x01V\x910\x88F\xE6\x8E\xA8V\xA2\xCB$\xC9\x90?\x0C\x86\x05\xDE\xA1\x90\x82\x91\x80\xFFk\xDD\x1Ce\x08\x03a\x01\xE0\x82\x01QR\x7F\x1F\xFDx\x9B\x15[\x8A\xCB\x13\xE0\xF6\xA4\x8BP\xF7\xAA\x80\x92T\x08\x88\xD0\t\x14\x10W\xD4V\x90\x91X$` a\x01\xE0\x83\x01Q\x01R\x7F\x05E\xACz\xA6m\xCF7\x19\x98\x848\xC8\x06\xFCbM\xE5z\xB4?\x85\x809/\x88\xC8l\x13x\xCEJa\x02\0\x82\x01QR\x7F\x16\xB7\xF2P\x84.\xCFN6\x90pj\x1E\x15-zW\xF7\x0FUo\x92\x07m\xA7\x85\xFD\xD3c\xC1\x9F\xCF` a\x02\0\x83\x01Q\x01R\x7F \xCB\x7F\xF3Z\x83\xA7\xDC1@6\xE4p\xF1L0\xFB\x0E\x98\xD3]f;$;\",\xAAo\xC7\xDBDa\x02 \x82\x01QR\x7F\x14\x9FAWDpth\xBD\xAAN\x85E \x1A\xB4\r\x191\xA7\xD3\x1F#v\x8F\xA7\xC6Ut\xEE>\xAB` a\x02 \x83\x01Q\x01R\x7F\n%\xC1\xB7W9\x06\xDCN\x19;N\xA8/\xD1\xFE|\xCE\xBCM\x92]\xAD&\xF0\xFF\t\xC8L\x9F\x1Aua\x02@\x82\x01QR\x7F\nR\x1F\xF3\x0C\x8F6fy\x8F\x84|]L7\x96X\xFB\xA1\x01V\xE7\xA9I\x9F'\x13\xFA\xE9\xBF+\xE1` a\x02@\x83\x01Q\x01R\x7F\x03\xDBe\x10\xC3\xF16)\xFD\xED\x9AZ-AeK\xBC\xE4\xEFm\x02L\xADS\x10\0Q\xD4\xA3\xF3\xEB\xC9a\x02`\x82\x01QR\x7F\x08\xE8\n\\\x8EL\x9B\x9F&\xF3\0<\xC5\x94\x03\xA1\x8D16\xAF\xD00\x86\x8D%\xCC\x8B\x80~*\xB3p` a\x02`\x83\x01Q\x01R\x90V[`\0a\"]\x82a#\xC0V[a\"\x80\x83`\0\x81Q\x81\x10a\"sWa\"saY\xEAV[` \x02` \x01\x01Qa\x12;V[a\"\x96\x83`\x01\x81Q\x81\x10a\"sWa\"saY\xEAV[a\"\xAC\x83`\x02\x81Q\x81\x10a\"sWa\"saY\xEAV[a\"\xC2\x83`\x03\x81Q\x81\x10a\"sWa\"saY\xEAV[a\"\xD8\x83`\x04\x81Q\x81\x10a\"sWa\"saY\xEAV[a\"\xEE\x83`\x05\x81Q\x81\x10a\"sWa\"saY\xEAV[a#\x04\x83`\x06\x81Q\x81\x10a\"sWa\"saY\xEAV[a#\x1A\x83`\x07\x81Q\x81\x10a\"sWa\"saY\xEAV[`\0a#'\x85\x85\x85a$\xF8V[\x90Pa#2\x81a&BV[\x91PP[\x93\x92PPPV[a#F\x82a*\xA1V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a#\x8BWa\x17b\x82\x82a*\xFDV[a\x08\xCBa+sV[a#\x9Ba+\x92V[a\r\xAEW`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x11\xD3a#\x93V[\x80Qa#\xCB\x90a+\xACV[a#\xD8\x81` \x01Qa+\xACV[a#\xE5\x81`@\x01Qa+\xACV[a#\xF2\x81``\x01Qa+\xACV[a#\xFF\x81`\x80\x01Qa+\xACV[a$\x0C\x81`\xA0\x01Qa+\xACV[a$\x19\x81`\xC0\x01Qa+\xACV[a$&\x81`\xE0\x01Qa+\xACV[a$4\x81a\x01\0\x01Qa+\xACV[a$B\x81a\x01 \x01Qa+\xACV[a$P\x81a\x01@\x01Qa+\xACV[a$^\x81a\x01`\x01Qa+\xACV[a$l\x81a\x01\x80\x01Qa+\xACV[a$z\x81a\x01\xA0\x01Qa\x12;V[a$\x88\x81a\x01\xC0\x01Qa\x12;V[a$\x96\x81a\x01\xE0\x01Qa\x12;V[a$\xA4\x81a\x02\0\x01Qa\x12;V[a$\xB2\x81a\x02 \x01Qa\x12;V[a$\xC0\x81a\x02@\x01Qa\x12;V[a$\xCE\x81a\x02`\x01Qa\x12;V[a$\xDC\x81a\x02\x80\x01Qa\x12;V[a$\xEA\x81a\x02\xA0\x01Qa\x12;V[a\x12\x06\x81a\x02\xC0\x01Qa\x12;V[a%\0aR\x0FV[\x83` \x01Q\x83Q\x14a%%W`@Qc \xFA\x9D\x89`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a%2\x85\x85\x85a,:V[\x90P`\0a%C\x86`\0\x01Qa/YV[\x90P`\0a%V\x82\x84`\xA0\x01Q\x88a3$V[`@\x80Q`\x1E\x80\x82Ra\x03\xE0\x82\x01\x90\x92R\x91\x92P`\0\x91\x90` \x82\x01a\x03\xC0\x806\x837PP`@\x80Q`\x1E\x80\x82Ra\x03\xE0\x82\x01\x90\x92R\x92\x93P`\0\x92\x91P` \x82\x01[a%\xA1aRIV[\x81R` \x01\x90`\x01\x90\x03\x90\x81a%\x99W\x90PP\x90P`\0a%\xC6\x8A\x85\x8A\x89\x87\x87a3\x84V[`\xA0\x87\x01Q``\x87\x01Q\x91\x92P\x90`\0\x80Q` a^U\x839\x81Q\x91R`\0\x81\x83\x85\t`@\x80Qa\x01\0\x81\x01\x82R`\xE0\x9C\x8D\x01Q\x81R` \x81\x01\x96\x90\x96R\x85\x01RPPP``\x81\x01\x91\x90\x91R`\x80\x81\x01\x92\x90\x92R`\xA0\x82\x01Ra\x01`\x86\x01Q`\xC0\x82\x01Ra\x01\x80\x90\x95\x01Q\x92\x85\x01\x92\x90\x92RP\x91\x94\x93PPPPV[`\0`\0\x80Q` a^U\x839\x81Q\x91Ra&[aRIV[a&caRIV[`@\x80Q`\x02\x80\x82R``\x82\x01\x83R`\0\x92` \x83\x01\x90\x806\x837PP`@\x80Q`\x02\x80\x82R``\x82\x01\x90\x92R\x92\x93P`\0\x92\x91P` \x82\x01[a&\xA5aRIV[\x81R` \x01\x90`\x01\x90\x03\x90\x81a&\x9DW\x90PP\x90P`\0`\x01\x90P\x80\x83`\0\x81Q\x81\x10a&\xD4Wa&\xD4aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x87`\xC0\x01Q\x82`\0\x81Q\x81\x10a&\xF8Wa&\xF8aY\xEAV[` \x02` \x01\x01\x81\x90RP\x87`\0\x01Q\x83`\x01\x81Q\x81\x10a'\x1BWa'\x1BaY\xEAV[` \x02` \x01\x01\x81\x81RPP\x87`\xE0\x01Q\x82`\x01\x81Q\x81\x10a'?Wa'?aY\xEAV[` \x02` \x01\x01\x81\x90RPa'T\x82\x84a3\xB9V[`\x80\x89\x01QQ\x90\x95P``\x93P\x83\x92P\x90P`\0a's\x82`\x02aZcV[a'~\x90`\x01aZcV[\x90P\x80`\x01`\x01`@\x1B\x03\x81\x11\x15a'\x98Wa'\x98aS\x0CV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a'\xC1W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x93P\x80`\x01`\x01`@\x1B\x03\x81\x11\x15a'\xDCWa'\xDCaS\x0CV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a(\x15W\x81` \x01[a(\x02aRIV[\x81R` \x01\x90`\x01\x90\x03\x90\x81a'\xFAW\x90P[P\x92PPP`\0\x80`\0[\x89`\x80\x01QQ\x81\x10\x15a(\xB9W\x89`\x80\x01Q\x81\x81Q\x81\x10a(CWa(CaY\xEAV[` \x02` \x01\x01Q\x85\x83\x81Q\x81\x10a(]Wa(]aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x89`\xA0\x01Q\x81\x81Q\x81\x10a(\x7FWa(\x7FaY\xEAV[` \x02` \x01\x01Q\x84\x83\x81Q\x81\x10a(\x99Wa(\x99aY\xEAV[` \x90\x81\x02\x91\x90\x91\x01\x01Ra(\xAF`\x01\x83aZcV[\x91P`\x01\x01a( V[P\x88` \x01Q\x84\x82\x81Q\x81\x10a(\xD1Wa(\xD1aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x88`\xC0\x01Q\x83\x82\x81Q\x81\x10a(\xF4Wa(\xF4aY\xEAV[` \x90\x81\x02\x91\x90\x91\x01\x01Ra)\n`\x01\x82aZcV[\x89Q`@\x8B\x01Q\x91\x92P\x90`\0\x89\x82\x84\t\x90P\x80\x87\x85\x81Q\x81\x10a)0Wa)0aY\xEAV[` \x02` \x01\x01\x81\x81RPPPPP\x88`\xE0\x01Q\x83\x82\x81Q\x81\x10a)VWa)VaY\xEAV[` \x90\x81\x02\x91\x90\x91\x01\x01Ra)l`\x01\x82aZcV[``\x8A\x01Q\x90\x91P\x87\x81\x84\x08\x92PPa)\x84\x82a4\xA7V[\x84\x82\x81Q\x81\x10a)\x96Wa)\x96aY\xEAV[` \x02` \x01\x01\x81\x81RPPa)\xAAa4\xD9V[\x83\x82\x81Q\x81\x10a)\xBCWa)\xBCaY\xEAV[` \x02` \x01\x01\x81\x90RPa)\xD9a)\xD4\x84\x86a3\xB9V[a4\xFAV[\x94PPPPP`\0`@Q\x80`\x80\x01`@R\x80\x7F\x01\x18\xC4\xD5\xB87\xBC\xC2\xBC\x89\xB5\xB3\x98\xB5\x97N\x9FYD\x07;2\x07\x8B~#\x1F\xEC\x93\x88\x83\xB0\x81R` \x01\x7F&\x0E\x01\xB2Q\xF6\xF1\xC7\xE7\xFFNX\x07\x91\xDE\xE8\xEAQ\xD8z5\x8E\x03\x8BN\xFE0\xFA\xC0\x93\x83\xC1\x81R` \x01\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U\x81R` \x01\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4\x81RP\x90Pa*\x97\x83\x82\x84a*\x92a5gV[a68V[\x96\x95PPPPPPV[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a*\xCEW\x80`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x04\x01a\n9\x91\x90aT\x87V[`\0\x80Q` a^5\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa+\x1A\x91\x90aZvV[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a+UW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a+ZV[``\x91P[P\x91P\x91Pa+j\x85\x83\x83a7\x1BV[\x95\x94PPPPPV[4\x15a\r\xAEW`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a+\x9Ca\x180V[T`\x01`@\x1B\x90\x04`\xFF\x16\x91\x90PV[`\0`\0\x80Q` a]\xD5\x839\x81Q\x91Ra+\xC6\x83a7nV[\x15a+\xD0WPPPV[\x82Q` \x84\x01Q\x82`\x03\x84\x85\x85\x86\t\x85\t\x08\x83\x82\x83\t\x14\x83\x82\x10\x84\x84\x10\x16\x16\x93PPP\x81a\x17bW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x17`$\x82\x01Rv\x10\x9B\x8C\x8DM\x0E\x88\x1A[\x9D\x98[\x1AY\x08\x11\xCCH\x1C\x1B\xDA[\x9D`J\x1B`D\x82\x01R`d\x01a\n9V[a,\x82`@Q\x80a\x01\0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`@\x80Q\x80\x82\x01\x90\x91R``\x81R`\0` \x82\x01R`\0\x80Q` a^U\x839\x81Q\x91Ra,\xB1\x82\x87\x87a7}V[\x81Q\x84Qa,\xBE\x90a;\x16V[a,\xCB\x86` \x01Qa;\x16V[a,\xD8\x87`@\x01Qa;\x16V[a,\xE5\x88``\x01Qa;\x16V[a,\xF2\x89`\x80\x01Qa;\x16V[`@Q` \x01a-\x07\x96\x95\x94\x93\x92\x91\x90aZ\x92V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra-\"\x82a;\x8BV[Pa-,\x82a;\x8BV[``\x84\x01Ra-:\x82a;\x8BV[`\x80\x84\x01R\x81Q`\xA0\x85\x01Qa-O\x90a;\x16V[`@Q` \x01a-`\x92\x91\x90a[\x11V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra-{\x82a;\x8BV[\x83R\x81Q`\xC0\x85\x01Qa-\x8D\x90a;\x16V[a-\x9A\x86`\xE0\x01Qa;\x16V[a-\xA8\x87a\x01\0\x01Qa;\x16V[a-\xB6\x88a\x01 \x01Qa;\x16V[a-\xC4\x89a\x01@\x01Qa;\x16V[`@Q` \x01a-\xD9\x96\x95\x94\x93\x92\x91\x90aZ\x92V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra-\xF4\x82a;\x8BV[`\xA0\x84\x01R\x81Qa\x01\xA0\x85\x01Qa.\n\x90a;\xEDV[a.\x18\x86a\x01\xC0\x01Qa;\xEDV[a.&\x87a\x01\xE0\x01Qa;\xEDV[a.4\x88a\x02\0\x01Qa;\xEDV[a.B\x89a\x02 \x01Qa;\xEDV[`@Q` \x01a.W\x96\x95\x94\x93\x92\x91\x90a[@V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x83Ra\x02@\x85\x01Qa.y\x90a;\xEDV[a.\x87\x86a\x02`\x01Qa;\xEDV[a.\x95\x87a\x02\x80\x01Qa;\xEDV[a.\xA3\x88a\x02\xA0\x01Qa;\xEDV[a.\xB1\x89a\x02\xC0\x01Qa;\xEDV[`@Q` \x01a.\xC6\x96\x95\x94\x93\x92\x91\x90a[@V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra.\xE1\x82a;\x8BV[`\xC0\x84\x01R\x81Qa\x01`\x85\x01Qa.\xF7\x90a;\x16V[a/\x05\x86a\x01\x80\x01Qa;\x16V[`@Q` \x01a/\x17\x93\x92\x91\x90a[|V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra/2\x82a;\x8BV[`\xE0\x84\x01R\x82Q\x81\x81\x80\t\x82\x82\x82\t` \x86\x01\x91\x90\x91R`@\x85\x01RP\x91\x95\x94PPPPPV[a/\x8B`@Q\x80`\xA0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[\x81b\x01\0\0\x03a0\x1FWP`@\x80Q`\xA0\x81\x01\x82R`\x10\x81R` \x81\x01\x92\x90\x92R\x7F0d\x1E\x0E\x92\xBE\xBE\xF8\x18&\x8Df;\xCA\xD6\xDB\xCF\xD6\xC0\x14\x91p\xF6\xD7\xD3P\xB1\xB1\xFAl\x10\x01\x90\x82\x01R~\xEE\xB2\xCBY\x81\xEDEd\x9A\xBE\xBD\xE0\x81\xDC\xFF\x16\xC8`\x1D\xE44~}\xD1b\x8B\xA2\xDA\xACC\xB7``\x82\x01R\x7F\x0B]V\xB7\x7F\xE7\x04\xE8\xE9#8\xC0\x08/7\xE0\x91\x12d\x14\xC80\xE4\xC6\x92-Z\xC8\x02\xD8B\xD4`\x80\x82\x01R\x90V[\x81b\x02\0\0\x03a0\xB4WP`@\x80Q`\xA0\x81\x01\x82R`\x11\x81R` \x81\x01\x92\x90\x92R\x7F0d6@\xB9\xF8/\x90\xE8;i\x8E^\xA6\x17\x9C|\x05T.\x85\x953\xB4\x8B\x99S\xA2\xF56\x08\x01\x90\x82\x01R\x7F\x1B\xF8-\xEB\xA7\xD7I\x02\xC3p\x8C\xC6\xE7\x0Ea\xF3\x05\x12\xEC\xA9VU!\x0E'nXX\xCE\x8FX\xE5``\x82\x01R\x7F$L\xF0\x10\xC4<\xA8r7\xD8\xB0\x0B\xF9\xDDP\xC4\xC0\x1C\x7F\x08k\xD4\xE8\xC9 \xE7RQ\xD9o\r\"`\x80\x82\x01R\x90V[\x81b\x04\0\0\x03a1IWP`@\x80Q`\xA0\x81\x01\x82R`\x12\x81R` \x81\x01\x92\x90\x92R\x7F0dBY\xCD\x94\xE7\xDDPE\xD7\xA2p\x13\xB7\xFC\xD2\x1C\x9E;\x7F\xA7R\"\xE7\xBD\xA4\x9Br\x9B\x04\x01\x90\x82\x01R\x7F\x19\xDD\xBC\xAF:\x8DF\xC1\\\x01v\xFB\xB5\xB9^M\xC5p\x88\xFF\x13\xF4\xD1\xBD\x84\xC6\xBF\xA5}\xCD\xC0\xE0``\x82\x01R\x7F\x03hS\xF0\x83x\x0E\x87\xF8\xD7\xC7\x1D\x11\x11\x19\xC5}\xBE\x11\x8C\"\xD5\xADpz\x821tf\xC5\x17L`\x80\x82\x01R\x90V[\x81b\x08\0\0\x03a1\xDEWP`@\x80Q`\xA0\x81\x01\x82R`\x13\x81R` \x81\x01\x92\x90\x92R\x7F0dHfWcD\x03\x84K\x0E\xACx\xCA\x88,\xFD(CA\xFC\xB0aZ\x15\xCF\xCD\x17\xB1M\x82\x01\x90\x82\x01R\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD``\x82\x01R\x7F\x06\xE4\x02\xC0\xA3\x14\xFBg\xA1\\\xF8\x06fJ\xE1\xB7\"\xDB\xC0\xEF\xE6nl\x81\xD9\x8F\x99$\xCASS!`\x80\x82\x01R\x90V[\x81b\x10\0\0\x03a2sWP`@\x80Q`\xA0\x81\x01\x82R`\x14\x81R` \x81\x01\x92\x90\x92R\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x90\x82\x01R\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW``\x82\x01R\x7F\x10\x0C3-!\0\x89_\xABds\xBC,Q\xBF\xCAR\x1FE\xCB;\xAC\xA6&\x08R\xA8\xFD\xE2l\x91\xF3`\x80\x82\x01R\x90V[\x81` \x03a3\x06WP`@\x80Q`\xA0\x81\x01\x82R`\x05\x81R` \x81\x01\x92\x90\x92R\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x90\x82\x01R\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0``\x82\x01R\x7F'$q6\x03\xBF\xBDy\n\xEA\xF3\xE7\xDF%\xD8\xE7\xEF\x8F1\x134\x90[M\x8C\x99\x98\x0C\xF2\x10\x97\x9D`\x80\x82\x01R\x90V[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x91\x90PV[a3H`@Q\x80``\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[a3R\x84\x84a=$V[\x80\x82Ra3b\x90\x85\x90\x85\x90a=xV[` \x82\x01R\x80Qa3x\x90\x85\x90\x84\x90\x86\x90a=\xECV[`@\x82\x01R\x93\x92PPPV[`\0\x80a3\x92\x85\x87\x89a?\xA0V[\x90Pa3\xA2\x88\x86\x89\x89\x88\x88a@\x90V[a3\xAD\x81\x87\x86aC\x9CV[\x98\x97PPPPPPPPV[a3\xC1aRIV[\x82Q\x82Q\x14a4\x12W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FMSM error: length does not match`D\x82\x01R`d\x01a\n9V[a4P\x83`\0\x81Q\x81\x10a4(Wa4(aY\xEAV[` \x02` \x01\x01Q\x83`\0\x81Q\x81\x10a4CWa4CaY\xEAV[` \x02` \x01\x01QaC\xECV[\x90P`\x01[\x82Q\x81\x10\x15a4\xA0Wa4\x96\x82a4\x91\x86\x84\x81Q\x81\x10a4wWa4waY\xEAV[` \x02` \x01\x01Q\x86\x85\x81Q\x81\x10a4CWa4CaY\xEAV[aD\x80V[\x91P`\x01\x01a4UV[P\x92\x91PPV[`\0a4\xC1`\0\x80Q` a^U\x839\x81Q\x91R\x83a[\xD5V[a\x11\xC5\x90`\0\x80Q` a^U\x839\x81Q\x91RaZ\0V[a4\xE1aRIV[P`@\x80Q\x80\x82\x01\x90\x91R`\x01\x81R`\x02` \x82\x01R\x90V[a5\x02aRIV[a5\x0B\x82a7nV[\x15a5\x14WP\x90V[`@Q\x80`@\x01`@R\x80\x83`\0\x01Q\x81R` \x01`\0\x80Q` a]\xD5\x839\x81Q\x91R\x84` \x01Qa5G\x91\x90a[\xD5V[a5_\x90`\0\x80Q` a]\xD5\x839\x81Q\x91RaZ\0V[\x90R\x92\x91PPV[a5\x92`@Q\x80`\x80\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`@Q\x80`\x80\x01`@R\x80\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x81R` \x01\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2\x81R` \x01\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA\x81R` \x01\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[\x81RP\x90P\x90V[`\0\x80`\0`@Q\x87Q\x81R` \x88\x01Q` \x82\x01R` \x87\x01Q`@\x82\x01R\x86Q``\x82\x01R``\x87\x01Q`\x80\x82\x01R`@\x87\x01Q`\xA0\x82\x01R\x85Q`\xC0\x82\x01R` \x86\x01Q`\xE0\x82\x01R` \x85\x01Qa\x01\0\x82\x01R\x84Qa\x01 \x82\x01R``\x85\x01Qa\x01@\x82\x01R`@\x85\x01Qa\x01`\x82\x01R` `\0a\x01\x80\x83`\x08Z\xFA\x91PP`\0Q\x91P\x80a7\rW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1C`$\x82\x01R{Bn254: Pairing check failed!` \x1B`D\x82\x01R`d\x01a\n9V[P\x15\x15\x90P[\x94\x93PPPPV[``\x82a70Wa7+\x82aE\x1BV[a#6V[\x81Q\x15\x80\x15a7GWP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a7gW\x83`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x04\x01a\n9\x91\x90aT\x87V[P\x80a#6V[\x80Q` \x90\x91\x01Q\x15\x90\x15\x16\x90V[\x82Q`\xFE\x90a7\xB8a7\x8E\x83a;\xEDV[`@Q` \x01a7\xA0\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R`\0`\x04aEDV[a7\xF2a7\xC8\x86`\0\x01Qa;\xEDV[`@Q` \x01a7\xDA\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R`\0`\x08aEDV[a8\x02a7\xC8\x87` \x01Qa;\xEDV[`@Q` \x01a8\x15\x94\x93\x92\x91\x90a[\xF7V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x85Ra82`\x01a;\xEDV[a8I`\0\x80Q` a^\xF5\x839\x81Q\x91Ra;\xEDV[a8``\0\x80Q` a^\x95\x839\x81Q\x91Ra;\xEDV[a8w`\0\x80Q` a^\xD5\x839\x81Q\x91Ra;\xEDV[a8\x8E`\0\x80Q` a^\x15\x839\x81Q\x91Ra;\xEDV[`@Q` \x01a8\xA3\x96\x95\x94\x93\x92\x91\x90a[@V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x85R`\xE0\x84\x01Qa8\xC4\x90a;\x16V[a8\xD2\x85a\x01\0\x01Qa;\x16V[a8\xE0\x86a\x01 \x01Qa;\x16V[a8\xEE\x87a\x01@\x01Qa;\x16V[a8\xFC\x88a\x01`\x01Qa;\x16V[a9\n\x89a\x01\x80\x01Qa;\x16V[a9\x18\x8Aa\x01\xE0\x01Qa;\x16V[`@Q` \x01a9/\x98\x97\x96\x95\x94\x93\x92\x91\x90a\\NV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x85Ra\x02\0\x84\x01Qa9Q\x90a;\x16V[a9_\x85a\x02 \x01Qa;\x16V[a9m\x86a\x02@\x01Qa;\x16V[a9{\x87a\x01\xA0\x01Qa;\x16V[a9\x89\x88a\x01\xC0\x01Qa;\x16V[a9\x97\x89a\x02`\x01Qa;\x16V[`@Q` \x01a9\xAD\x97\x96\x95\x94\x93\x92\x91\x90a\\\xF3V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x81R\x81\x86R\x84\x01Qa9\xCC\x90a;\x16V[a9\xD9\x85``\x01Qa;\x16V[a9\xE6\x86`\x80\x01Qa;\x16V[a9\xF3\x87`\xA0\x01Qa;\x16V[a:\0\x88`\xC0\x01Qa;\x16V[`@Q` \x01a:\x15\x96\x95\x94\x93\x92\x91\x90aZ\x92V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x85R\x82Qa:L\x90\x84\x90`\0\x90a:?Wa:?aY\xEAV[` \x02` \x01\x01Qa;\xEDV[a:b\x84`\x01\x81Q\x81\x10a:?Wa:?aY\xEAV[a:x\x85`\x02\x81Q\x81\x10a:?Wa:?aY\xEAV[a:\x8E\x86`\x03\x81Q\x81\x10a:?Wa:?aY\xEAV[a:\xA4\x87`\x04\x81Q\x81\x10a:?Wa:?aY\xEAV[a:\xBA\x88`\x05\x81Q\x81\x10a:?Wa:?aY\xEAV[a:\xD0\x89`\x06\x81Q\x81\x10a:?Wa:?aY\xEAV[a:\xE6\x8A`\x07\x81Q\x81\x10a:?Wa:?aY\xEAV[`@Q` \x01a:\xFE\x99\x98\x97\x96\x95\x94\x93\x92\x91\x90a]\x85V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x90\x93RPPPV[```\0a;#\x83a7nV[\x15a;/W`\x01`\xFE\x1B\x17[` \x83\x01Q`\0\x80Q` a]\xD5\x839\x81Q\x91R`\x01\x91\x90\x91\x1B\x10a;UWP`\x01`\xFF\x1B[\x82Qa;b\x90\x82\x17a;\xEDV[`@Q` \x01a;t\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91PP\x91\x90PV[` \x80\x82\x01Q\x82Q\x80Q`@Q\x83\x81R`\0\x94\x85\x94\x93\x92\x91\x90\x81\x01\x85[\x83\x81\x10\x15a;\xC2W` \x81\x86\x01\x81\x01Q\x83\x83\x01R\x01a;\xA8V[PP` \x91\x82\x01\x90 \x90\x86\x01\x81\x90R\x92P`\0a*\x97`\0\x80Q` a^U\x839\x81Q\x91R\x85a[\xD5V[`\0\x81\x90P`\x08\x81~\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\x16\x90\x1B`\x08\x82\x7F\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\x16\x90\x1C\x17\x90P`\x10\x81}\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\x16\x90\x1B`\x10\x82}\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\x19\x16\x90\x1C\x17\x90P` \x81{\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\x16\x90\x1B` \x82{\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\x19\x16\x90\x1C\x17\x90P`@\x81`\x01`\x01`@\x1B\x03`\x01`\x80\x1B\x03`\x01`\xC0\x1B\x03\x16\x90\x1B`@\x82`\x01`\x01`@\x1B\x03`\x01`\x80\x1B\x03`\x01`\xC0\x1B\x03\x19\x16\x90\x1C\x17\x90P`\x80\x81\x90\x1B`\x80\x82\x90\x1C\x17\x90P\x91\x90PV[\x81Q`\0\x90`\0\x80Q` a^U\x839\x81Q\x91R\x90\x83\x80\x15a=hW\x84\x93P`\0[\x82\x81\x10\x15a=\\W\x83\x85\x86\t\x94P`\x01\x01a=FV[P`\x01\x84\x03\x93Pa=oV[`\x01\x83\x03\x93P[PPP\x92\x91PPV[`\0\x82`\x01\x03a=\x8AWP`\x01a#6V[\x81`\0\x03a=\x9AWP`\0a#6V[`@\x84\x01Q`\0\x80Q` a^U\x839\x81Q\x91R\x90`\0\x90\x82\x81\x86\t\x90P\x85\x80\x15a=\xCAW`\x01\x87\x03\x92Pa=\xD1V[`\x01\x84\x03\x92P[Pa=\xDB\x82aFQV[\x91P\x82\x82\x82\t\x97\x96PPPPPPPV[\x82Q`\0\x90`\0\x80Q` a^U\x839\x81Q\x91R\x90\x83\x83\x03a>mW`\x01`\0[\x82\x81\x10\x15a>`W\x81\x87\x03a>AW\x87\x81\x81Q\x81\x10a>.Wa>.aY\xEAV[` \x02` \x01\x01Q\x94PPPPPa7\x13V[\x83\x80a>OWa>Oa[\xBFV[\x89``\x01Q\x83\t\x91P`\x01\x01a>\rV[P`\0\x93PPPPa7\x13V[`\0\x80`\0\x80\x8A`@\x01Q\x90P`\0\x80a>\x87\x8D\x88aF\xF7V[\x90P`\0\x87`\x01`\x01`@\x1B\x03\x81\x11\x15a>\xA3Wa>\xA3aS\x0CV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a>\xCCW\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x90P\x88\x8B\x85\t\x93P`\x01\x92P`\0[\x88\x81\x10\x15a?\x11W` \x81\x02` \x84\x01\x01Q\x95P\x89\x8D\x87\x8C\x03\x08\x96P\x89\x87\x85\t` \x82\x81\x02\x84\x01\x01\x88\x90R\x93P`\x01\x01a>\xDCV[Pa?\x1B\x83aFQV[\x92P`\0[\x88\x81\x10\x15a?\x8EW` \x81\x02` \x84\x01\x01Q\x95P\x89\x86\x86\t\x97P\x89\x84\x89\t\x97P`\0[\x89\x81\x10\x15a?mW\x80\x82\x14a?eW` \x81\x02` \x84\x01\x01Q\x97P\x8A\x88\x8A\t\x98P[`\x01\x01a?CV[P` \x81\x02` \x8F\x01\x01Q\x95P\x89\x86\x89\t\x97P\x89\x88\x8C\x08\x9AP`\x01\x01a? V[PPPPPPPPPP\x94\x93PPPPV[`\0\x80`\0\x80Q` a^U\x839\x81Q\x91R\x90P`\0\x83` \x01Q\x90P`\0\x84`@\x01Q\x90P`\0`\x01\x90P``\x88\x01Q`\x80\x89\x01Qa\x01\xA0\x89\x01Qa\x02@\x8A\x01Q\x87\x88\x89\x83\x87\t\x8A\x86\x86\x08\x08\x86\t\x94PPPa\x01\xC0\x89\x01Qa\x02`\x8A\x01Q\x87\x88\x89\x83\x87\t\x8A\x86\x86\x08\x08\x86\t\x94PPPa\x01\xE0\x89\x01Qa\x02\x80\x8A\x01Q\x87\x88\x89\x83\x87\t\x8A\x86\x86\x08\x08\x86\t\x94PPPa\x02\0\x89\x01Qa\x02\xA0\x8A\x01Q\x87\x88\x89\x83\x87\t\x8A\x86\x86\x08\x08\x86\t\x94PPPa\x02 \x89\x01Q\x91Pa\x02\xC0\x89\x01Q\x86\x87\x82\x89\x85\x87\x08\t\x85\t\x93PPPP\x87Q` \x89\x01Q\x85\x86\x86\x83\t\x87\x03\x85\x08\x96PP\x84\x85\x83\x83\t\x86\x03\x87\x08\x99\x98PPPPPPPPPV[a@\x9E\x86\x86\x86\x86\x85\x87aG\xBCV[`\xC0\x85\x01Q\x82Q`\0\x80Q` a^U\x839\x81Q\x91R\x91\x90\x81\x90\x81\x90\x86\x90`\x14\x90\x81\x10a@\xCDWa@\xCDaY\xEAV[` \x02` \x01\x01\x81\x81RPP\x85`\0\x01Q\x84`\x14\x81Q\x81\x10a@\xF1Wa@\xF1aY\xEAV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x15\x81Q\x81\x10aA\x16WaA\x16aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x85` \x01Q\x84`\x15\x81Q\x81\x10aA:WaA:aY\xEAV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x16\x81Q\x81\x10aA_WaA_aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x85`@\x01Q\x84`\x16\x81Q\x81\x10aA\x83WaA\x83aY\xEAV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x17\x81Q\x81\x10aA\xA8WaA\xA8aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x85``\x01Q\x84`\x17\x81Q\x81\x10aA\xCCWaA\xCCaY\xEAV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x18\x81Q\x81\x10aA\xF1WaA\xF1aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x85`\x80\x01Q\x84`\x18\x81Q\x81\x10aB\x15WaB\x15aY\xEAV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x19\x81Q\x81\x10aB:WaB:aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x88`@\x01Q\x84`\x19\x81Q\x81\x10aB^WaB^aY\xEAV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1A\x81Q\x81\x10aB\x83WaB\x83aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x88``\x01Q\x84`\x1A\x81Q\x81\x10aB\xA7WaB\xA7aY\xEAV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1B\x81Q\x81\x10aB\xCCWaB\xCCaY\xEAV[` \x02` \x01\x01\x81\x81RPP\x88`\x80\x01Q\x84`\x1B\x81Q\x81\x10aB\xF0WaB\xF0aY\xEAV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1C\x81Q\x81\x10aC\x15WaC\x15aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x88`\xA0\x01Q\x84`\x1C\x81Q\x81\x10aC9WaC9aY\xEAV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x87`\xE0\x01Q\x85`\x1D\x81Q\x81\x10aCbWaCbaY\xEAV[` \x02` \x01\x01\x81\x81RPP\x85`\xA0\x01Q\x84`\x1D\x81Q\x81\x10aC\x86WaC\x86aY\xEAV[` \x02` \x01\x01\x81\x90RPPPPPPPPPPV[`\0\x80Q` a^U\x839\x81Q\x91R\x83\x81\x03\x90`\0[`\n\x81\x10\x15aC\xE3W` `\x15\x82\x01\x02\x84\x01Q` \x82\x02a\x01\xA0\x01\x86\x01Q\x83\x84\x82\x84\t\x86\x08\x94PPP`\x01\x01aC\xB2V[PP\x93\x92PPPV[aC\xF4aRIV[aC\xFCaRcV[\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R`@\x81\x01\x83\x90R`\0``\x83`\x80\x84`\x07a\x07\xD0Z\x03\xFA\x90P\x80\x80aD.W`\0\x80\xFD[P\x80aDxW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x19`$\x82\x01RxBn254: scalar mul failed!`8\x1B`D\x82\x01R`d\x01a\n9V[PP\x92\x91PPV[aD\x88aRIV[aD\x90aR\x81V[\x83Q\x81R` \x80\x85\x01Q\x81\x83\x01R\x83Q`@\x83\x01R\x83\x01Q``\x80\x83\x01\x91\x90\x91R`\0\x90\x83`\xC0\x84`\x06a\x07\xD0Z\x03\xFA\x90P\x80\x80aD\xCDW`\0\x80\xFD[P\x80aDxW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: group addition failed!\0\0\0`D\x82\x01R`d\x01a\n9V[\x80Q\x15aE+W\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x81aER\x81`\x1FaZcV[\x10\x15aE\x91W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0E`$\x82\x01Rmslice_overflow`\x90\x1B`D\x82\x01R`d\x01a\n9V[aE\x9B\x82\x84aZcV[\x84Q\x10\x15aE\xDFW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x11`$\x82\x01Rpslice_outOfBounds`x\x1B`D\x82\x01R`d\x01a\n9V[``\x82\x15\x80\x15aE\xFEW`@Q\x91P`\0\x82R` \x82\x01`@RaFHV[`@Q\x91P`\x1F\x84\x16\x80\x15` \x02\x81\x84\x01\x01\x85\x81\x01\x87\x83\x15` \x02\x84\x8B\x01\x01\x01[\x81\x83\x10\x15aF7W\x80Q\x83R` \x92\x83\x01\x92\x01aF\x1FV[PP\x85\x84R`\x1F\x01`\x1F\x19\x16`@RP[P\x94\x93PPPPV[`\0\x80`\0`\0\x80Q` a^U\x839\x81Q\x91R\x90P`@Q` \x81R` \x80\x82\x01R` `@\x82\x01R\x84``\x82\x01R`\x02\x82\x03`\x80\x82\x01R\x81`\xA0\x82\x01R` `\0`\xC0\x83`\x05Z\xFA\x92PP`\0Q\x92P\x81aF\xF0W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: pow precompile failed!\0\0\0`D\x82\x01R`d\x01a\n9V[PP\x91\x90PV[``\x82` \x01Q\x82\x11\x15aG\x1EW`@Qc\x8C^\x11\xF1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x83\x01Q`\x01`\0\x80Q` a^U\x839\x81Q\x91R\x84`\x01`\x01`@\x1B\x03\x81\x11\x15aGLWaGLaS\x0CV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15aGuW\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x93P\x84\x15\x19\x15a=oW` \x84\x01\x85` \x02\x81\x01`\x01\x82R` \x82\x01\x91P[\x80\x82\x10\x15aG\xB1W\x82\x85\x85\t\x93P\x83\x82R` \x82\x01\x91PaG\x95V[PPPPP\x92\x91PPV[`\0\x80`\0\x80`\0\x80`\0\x80Q` a^U\x839\x81Q\x91R\x90P\x80` \x8B\x01Q` \x8D\x01Q\t\x95P\x8AQ\x93P\x80`\xA0\x8C\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xA0\x8A\x01Q\x84\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80`\0\x80Q` a^\xF5\x839\x81Q\x91R\x84\t\x91P\x80a\x01\xC0\x8A\x01Q\x83\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80`\0\x80Q` a^\x95\x839\x81Q\x91R\x84\t\x91P\x80a\x01\xE0\x8A\x01Q\x83\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80`\0\x80Q` a^\xD5\x839\x81Q\x91R\x84\t\x91P\x80a\x02\0\x8A\x01Q\x83\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80`\0\x80Q` a^\x15\x839\x81Q\x91R\x84\t\x91P\x80a\x02 \x8A\x01Q\x83\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80\x84\x87\x08\x95P\x88`\xA0\x01Q\x88`\0\x81Q\x81\x10aH\xEBWaH\xEBaY\xEAV[` \x02` \x01\x01\x81\x90RP\x85\x87`\0\x81Q\x81\x10aI\nWaI\naY\xEAV[` \x02` \x01\x01\x81\x81RPP\x80``\x8C\x01Q\x8CQ\t\x94P\x80a\x02\xC0\x8A\x01Q\x86\t\x94P\x80a\x02@\x8A\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xA0\x8A\x01Q\x84\x08\x92P\x80`\x80\x8C\x01Q\x84\x08\x92P\x80\x83\x86\t\x94P\x80a\x02`\x8A\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xC0\x8A\x01Q\x84\x08\x92P\x80`\x80\x8C\x01Q\x84\x08\x92P\x80\x83\x86\t\x94P\x80a\x02\x80\x8A\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xE0\x8A\x01Q\x84\x08\x92P\x80`\x80\x8C\x01Q\x84\x08\x92P\x80\x83\x86\t\x94P\x80a\x02\xA0\x8A\x01Q``\x8D\x01Q\t\x92P\x80a\x02\0\x8A\x01Q\x84\x08\x92P\x80`\x80\x8C\x01Q\x84\x08\x92P\x80\x83\x86\t\x94P\x8B`\xC0\x01Q\x88`\x01\x81Q\x81\x10aI\xECWaI\xECaY\xEAV[` \x90\x81\x02\x91\x90\x91\x01\x01RaJ\x01\x85\x82aZ\0V[\x87`\x01\x81Q\x81\x10aJ\x14WaJ\x14aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x88a\x01\xA0\x01Q\x87`\x02\x81Q\x81\x10aJ9WaJ9aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x88a\x01\xC0\x01Q\x87`\x03\x81Q\x81\x10aJ^WaJ^aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x88a\x01\xE0\x01Q\x87`\x04\x81Q\x81\x10aJ\x83WaJ\x83aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x88a\x02\0\x01Q\x87`\x05\x81Q\x81\x10aJ\xA8WaJ\xA8aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x8B`\xE0\x01Q\x88`\x02\x81Q\x81\x10aJ\xCCWaJ\xCCaY\xEAV[` \x02` \x01\x01\x81\x90RP\x8Ba\x01\0\x01Q\x88`\x03\x81Q\x81\x10aJ\xF0WaJ\xF0aY\xEAV[` \x02` \x01\x01\x81\x90RP\x8Ba\x01 \x01Q\x88`\x04\x81Q\x81\x10aK\x14WaK\x14aY\xEAV[` \x02` \x01\x01\x81\x90RP\x8Ba\x01@\x01Q\x88`\x05\x81Q\x81\x10aK8WaK8aY\xEAV[` \x02` \x01\x01\x81\x90RP\x80a\x01\xC0\x8A\x01Qa\x01\xA0\x8B\x01Q\t\x92P\x82\x87`\x06\x81Q\x81\x10aKgWaKgaY\xEAV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01`\x01Q\x88`\x06\x81Q\x81\x10aK\x8CWaK\x8CaY\xEAV[` \x02` \x01\x01\x81\x90RP\x80a\x02\0\x8A\x01Qa\x01\xE0\x8B\x01Q\t\x92P\x82\x87`\x07\x81Q\x81\x10aK\xBBWaK\xBBaY\xEAV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01\x80\x01Q\x88`\x07\x81Q\x81\x10aK\xE0WaK\xE0aY\xEAV[` \x02` \x01\x01\x81\x90RPa\x01\xA0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\x08\x81Q\x81\x10aL\x19WaL\x19aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01\xE0\x01Q\x88`\x08\x81Q\x81\x10aL>WaL>aY\xEAV[` \x02` \x01\x01\x81\x90RPa\x01\xC0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\t\x81Q\x81\x10aLwWaLwaY\xEAV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x02\0\x01Q\x88`\t\x81Q\x81\x10aL\x9CWaL\x9CaY\xEAV[` \x02` \x01\x01\x81\x90RPa\x01\xE0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\n\x81Q\x81\x10aL\xD5WaL\xD5aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x02 \x01Q\x88`\n\x81Q\x81\x10aL\xFAWaL\xFAaY\xEAV[` \x02` \x01\x01\x81\x90RPa\x02\0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\x0B\x81Q\x81\x10aM3WaM3aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x02@\x01Q\x88`\x0B\x81Q\x81\x10aMXWaMXaY\xEAV[` \x02` \x01\x01\x81\x90RP\x88a\x02 \x01Q\x81aMt\x91\x90aZ\0V[\x87`\x0C\x81Q\x81\x10aM\x87WaM\x87aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01\xA0\x01Q\x88`\x0C\x81Q\x81\x10aM\xACWaM\xACaY\xEAV[` \x02` \x01\x01\x81\x90RP`\x01\x87`\r\x81Q\x81\x10aM\xCCWaM\xCCaY\xEAV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01\xC0\x01Q\x88`\r\x81Q\x81\x10aM\xF1WaM\xF1aY\xEAV[` \x02` \x01\x01\x81\x90RP\x80a\x01\xC0\x8A\x01Qa\x01\xA0\x8B\x01Q\t\x92P\x80a\x01\xE0\x8A\x01Q\x84\t\x92P\x80a\x02\0\x8A\x01Q\x84\t\x92P\x80a\x02 \x8A\x01Q\x84\t\x92P\x82\x87`\x0E\x81Q\x81\x10aNAWaNAaY\xEAV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x02`\x01Q\x88`\x0E\x81Q\x81\x10aNfWaNfaY\xEAV[` \x90\x81\x02\x91\x90\x91\x01\x01R\x89QaN}\x90\x82aZ\0V[\x87`\x0F\x81Q\x81\x10aN\x90WaN\x90aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x88`\xC0\x01Q\x88`\x0F\x81Q\x81\x10aN\xB4WaN\xB4aY\xEAV[` \x02` \x01\x01\x81\x90RP\x80`\x01\x8BQ\x08`\xA0\x8C\x01Q\x90\x93P\x81\x90\x80\t\x91P\x80\x82\x84\t\x92P\x80\x83` `\x10\x02\x89\x01Q\t\x91P\x81\x87`\x10\x81Q\x81\x10aN\xFAWaN\xFAaY\xEAV[` \x02` \x01\x01\x81\x81RPP\x88`\xE0\x01Q\x88`\x10\x81Q\x81\x10aO\x1EWaO\x1EaY\xEAV[` \x02` \x01\x01\x81\x90RP\x80\x83` `\x11\x02\x89\x01Q\t\x91P\x81\x87`\x11\x81Q\x81\x10aOJWaOJaY\xEAV[` \x02` \x01\x01\x81\x81RPP\x88a\x01\0\x01Q\x88`\x11\x81Q\x81\x10aOoWaOoaY\xEAV[` \x02` \x01\x01\x81\x90RP\x80\x83` `\x12\x02\x89\x01Q\t\x91P\x81\x87`\x12\x81Q\x81\x10aO\x9BWaO\x9BaY\xEAV[` \x02` \x01\x01\x81\x81RPP\x88a\x01 \x01Q\x88`\x12\x81Q\x81\x10aO\xC0WaO\xC0aY\xEAV[` \x02` \x01\x01\x81\x90RP\x80\x83` `\x13\x02\x89\x01Q\t\x91P\x81\x87`\x13\x81Q\x81\x10aO\xECWaO\xECaY\xEAV[` \x02` \x01\x01\x81\x81RPP\x88a\x01@\x01Q\x88`\x13\x81Q\x81\x10aP\x11WaP\x11aY\xEAV[` \x02` \x01\x01\x81\x90RPPPPPPPPPPPPPV[P\x80T`\0\x82U\x90`\0R` `\0 \x90\x81\x01\x90a\x12\x06\x91\x90aR\x9FV[\x82\x80T\x82\x82U\x90`\0R` `\0 \x90\x81\x01\x92\x82\x15aP\x83W\x91` \x02\x82\x01[\x82\x81\x11\x15aP\x83W\x82Q\x82U\x91` \x01\x91\x90`\x01\x01\x90aPhV[PaP\x8F\x92\x91PaR\x9FV[P\x90V[`@Q\x80a\x01\0\x01`@R\x80`\0`\x01`\x01`@\x1B\x03\x16\x81R` \x01`\0`\x01`\x01`@\x1B\x03\x16\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[P\x80T`\0\x82U`\x02\x02\x90`\0R` `\0 \x90\x81\x01\x90a\x12\x06\x91\x90aR\xB4V[`@Q\x80a\x02\x80\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01aQ-aRIV[\x81R` \x01aQ:aRIV[\x81R` \x01aQGaRIV[\x81R` \x01aQTaRIV[\x81R` \x01aQaaRIV[\x81R` \x01aQnaRIV[\x81R` \x01aQ{aRIV[\x81R` \x01aQ\x88aRIV[\x81R` \x01aQ\x95aRIV[\x81R` \x01aQ\xA2aRIV[\x81R` \x01aQ\xAFaRIV[\x81R` \x01aQ\xBCaRIV[\x81R` \x01aQ\xC9aRIV[\x81R` \x01aQ\xD6aRIV[\x81R` \x01aQ\xE3aRIV[\x81R` \x01aQ\xF0aRIV[\x81R` \x01aQ\xFDaRIV[\x81R` \x01aR\naRIV[\x90R\x90V[`@Q\x80a\x01\0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01``\x81R` \x01``\x81R` \x01aQ\xFD[`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[`@Q\x80``\x01`@R\x80`\x03\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[`@Q\x80`\x80\x01`@R\x80`\x04\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[[\x80\x82\x11\x15aP\x8FW`\0\x81U`\x01\x01aR\xA0V[[\x80\x82\x11\x15aP\x8FW\x80T`\x01`\x01`@\x1B\x03\x19\x16\x81U`\0`\x01\x82\x01U`\x02\x01aR\xB5V[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a3\x1FW`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15aS\x03W`\0\x80\xFD[a\x11\xC2\x82aR\xDAV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@\x80Q\x90\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15aSDWaSDaS\x0CV[`@R\x90V[`@Qa\x02\xE0\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15aSDWaSDaS\x0CV[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15aS\x95WaS\x95aS\x0CV[`@R\x91\x90PV[\x805`\x01`\x01`@\x1B\x03\x81\x16\x81\x14a3\x1FW`\0\x80\xFD[`\0a\x01\0\x80\x83\x85\x03\x12\x15aS\xC8W`\0\x80\xFD[`@Q\x90\x81\x01\x90`\x01`\x01`@\x1B\x03\x82\x11\x81\x83\x10\x17\x15aS\xEAWaS\xEAaS\x0CV[\x81`@R\x80\x92PaS\xFA\x84aS\x9DV[\x81RaT\x08` \x85\x01aS\x9DV[` \x82\x01R`@\x84\x015`@\x82\x01R``\x84\x015``\x82\x01R`\x80\x84\x015`\x80\x82\x01R`\xA0\x84\x015`\xA0\x82\x01R`\xC0\x84\x015`\xC0\x82\x01R`\xE0\x84\x015`\xE0\x82\x01RPP\x92\x91PPV[`\0a\x01\0\x82\x84\x03\x12\x15aTdW`\0\x80\xFD[a\x11\xC2\x83\x83aS\xB4V[`\0` \x82\x84\x03\x12\x15aT\x80W`\0\x80\xFD[P5\x91\x90PV[`\x01`\x01`\xA0\x1B\x03\x91\x90\x91\x16\x81R` \x01\x90V[`\0`\x01`\x01`@\x1B\x03\x82\x11\x15aT\xB4WaT\xB4aS\x0CV[P`\x05\x1B` \x01\x90V[`\0` \x80\x83\x85\x03\x12\x15aT\xD1W`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x81\x11\x15aT\xE7W`\0\x80\xFD[\x83\x01`\x1F\x81\x01\x85\x13aT\xF8W`\0\x80\xFD[\x805aU\x0BaU\x06\x82aT\x9BV[aSmV[\x81\x81R`\x05\x91\x90\x91\x1B\x82\x01\x83\x01\x90\x83\x81\x01\x90\x87\x83\x11\x15aU*W`\0\x80\xFD[\x92\x84\x01\x92[\x82\x84\x10\x15aUHW\x835\x82R\x92\x84\x01\x92\x90\x84\x01\x90aU/V[\x97\x96PPPPPPPV[`\0` \x82\x84\x03\x12\x15aUeW`\0\x80\xFD[a\x11\xC2\x82aS\x9DV[`\0`@\x82\x84\x03\x12\x15aU\x80W`\0\x80\xFD[aU\x88aS\"V[\x90P\x815\x81R` \x82\x015` \x82\x01R\x92\x91PPV[`\0\x80\x82\x84\x03a\x05\x80\x81\x12\x15aU\xB3W`\0\x80\xFD[aU\xBD\x85\x85aS\xB4V[\x92Pa\x01\0a\x04\x80\x80`\xFF\x19\x84\x01\x12\x15aU\xD6W`\0\x80\xFD[aU\xDEaSJV[\x92PaU\xEC\x87\x83\x88\x01aUnV[\x83Ra\x01@aU\xFD\x88\x82\x89\x01aUnV[` \x85\x01Ra\x01\x80aV\x11\x89\x82\x8A\x01aUnV[`@\x86\x01Ra\x01\xC0aV%\x8A\x82\x8B\x01aUnV[``\x87\x01Ra\x02\0aV9\x8B\x82\x8C\x01aUnV[`\x80\x88\x01Ra\x02@aVM\x8C\x82\x8D\x01aUnV[`\xA0\x89\x01Ra\x02\x80aVa\x8D\x82\x8E\x01aUnV[`\xC0\x8A\x01Ra\x02\xC0aVu\x8E\x82\x8F\x01aUnV[`\xE0\x8B\x01RaV\x88\x8Ea\x03\0\x8F\x01aUnV[\x89\x8B\x01RaV\x9A\x8Ea\x03@\x8F\x01aUnV[a\x01 \x8B\x01RaV\xAE\x8Ea\x03\x80\x8F\x01aUnV[\x87\x8B\x01RaV\xC0\x8Ea\x03\xC0\x8F\x01aUnV[a\x01`\x8B\x01RaV\xD4\x8Ea\x04\0\x8F\x01aUnV[\x86\x8B\x01Ra\x04@\x8D\x015a\x01\xA0\x8B\x01Ra\x04`\x8D\x015\x85\x8B\x01R\x87\x8D\x015a\x01\xE0\x8B\x01Ra\x04\xA0\x8D\x015\x84\x8B\x01Ra\x04\xC0\x8D\x015a\x02 \x8B\x01Ra\x04\xE0\x8D\x015\x83\x8B\x01Ra\x05\0\x8D\x015a\x02`\x8B\x01Ra\x05 \x8D\x015\x82\x8B\x01Ra\x05@\x8D\x015a\x02\xA0\x8B\x01Ra\x05`\x8D\x015\x81\x8B\x01RPPPPPPPPP\x80\x91PP\x92P\x92\x90PV[`\0\x80`@\x83\x85\x03\x12\x15aWkW`\0\x80\xFD[aWt\x83aR\xDAV[\x91P` \x83\x81\x015`\x01`\x01`@\x1B\x03\x80\x82\x11\x15aW\x91W`\0\x80\xFD[\x81\x86\x01\x91P\x86`\x1F\x83\x01\x12aW\xA5W`\0\x80\xFD[\x815\x81\x81\x11\x15aW\xB7WaW\xB7aS\x0CV[aW\xC9`\x1F\x82\x01`\x1F\x19\x16\x85\x01aSmV[\x91P\x80\x82R\x87\x84\x82\x85\x01\x01\x11\x15aW\xDFW`\0\x80\xFD[\x80\x84\x84\x01\x85\x84\x017`\0\x84\x82\x84\x01\x01RP\x80\x93PPPP\x92P\x92\x90PV[`\0` \x80\x83\x85\x03\x12\x15aX\x10W`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x81\x11\x15aX&W`\0\x80\xFD[\x83\x01`\x1F\x81\x01\x85\x13aX7W`\0\x80\xFD[\x805aXEaU\x06\x82aT\x9BV[\x81\x81R`\x06\x91\x90\x91\x1B\x82\x01\x83\x01\x90\x83\x81\x01\x90\x87\x83\x11\x15aXdW`\0\x80\xFD[\x92\x84\x01\x92[\x82\x84\x10\x15aUHW`@\x84\x89\x03\x12\x15aX\x82W`\0\x80\x81\xFD[aX\x8AaS\"V[aX\x93\x85aS\x9DV[\x81R\x84\x86\x015\x86\x82\x01R\x82R`@\x90\x93\x01\x92\x90\x84\x01\x90aXiV[`\x01`\x01`@\x1B\x03\x91\x90\x91\x16\x81R` \x01\x90V[\x805c\xFF\xFF\xFF\xFF\x81\x16\x81\x14a3\x1FW`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15aX\xE8W`\0\x80\xFD[a\x11\xC2\x82aX\xC2V[`\0\x80`\0a\x01@\x84\x86\x03\x12\x15aY\x07W`\0\x80\xFD[aY\x11\x85\x85aS\xB4V[\x92PaY a\x01\0\x85\x01aX\xC2V[\x91PaY/a\x01 \x85\x01aR\xDAV[\x90P\x92P\x92P\x92V[`\0[\x83\x81\x10\x15aYSW\x81\x81\x01Q\x83\x82\x01R` \x01aY;V[PP`\0\x91\x01RV[` \x81R`\0\x82Q\x80` \x84\x01RaY{\x81`@\x85\x01` \x87\x01aY8V[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[`\0\x80`@\x83\x85\x03\x12\x15aY\xA2W`\0\x80\xFD[PP\x805\x92` \x90\x91\x015\x91PV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\x01`\x01`@\x1B\x03\x81\x81\x16\x83\x82\x16\x02\x80\x82\x16\x91\x90\x82\x81\x14aDxWaDxaY\xB1V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[\x81\x81\x03\x81\x81\x11\x15a\x11\xC5Wa\x11\xC5aY\xB1V[`\x01`\x01`@\x1B\x03\x81\x81\x16\x83\x82\x16\x01\x90\x80\x82\x11\x15a4\xA0Wa4\xA0aY\xB1V[`\0` \x82\x84\x03\x12\x15aZEW`\0\x80\xFD[PQ\x91\x90PV[`\0\x81aZ[WaZ[aY\xB1V[P`\0\x19\x01\x90V[\x80\x82\x01\x80\x82\x11\x15a\x11\xC5Wa\x11\xC5aY\xB1V[`\0\x82QaZ\x88\x81\x84` \x87\x01aY8V[\x91\x90\x91\x01\x92\x91PPV[`\0\x87Q` aZ\xA5\x82\x85\x83\x8D\x01aY8V[\x88Q\x91\x84\x01\x91aZ\xB8\x81\x84\x84\x8D\x01aY8V[\x88Q\x92\x01\x91aZ\xCA\x81\x84\x84\x8C\x01aY8V[\x87Q\x92\x01\x91aZ\xDC\x81\x84\x84\x8B\x01aY8V[\x86Q\x92\x01\x91aZ\xEE\x81\x84\x84\x8A\x01aY8V[\x85Q\x92\x01\x91a[\0\x81\x84\x84\x89\x01aY8V[\x91\x90\x91\x01\x99\x98PPPPPPPPPV[`\0\x83Qa[#\x81\x84` \x88\x01aY8V[\x83Q\x90\x83\x01\x90a[7\x81\x83` \x88\x01aY8V[\x01\x94\x93PPPPV[`\0\x87Qa[R\x81\x84` \x8C\x01aY8V[\x91\x90\x91\x01\x95\x86RP` \x85\x01\x93\x90\x93R`@\x84\x01\x91\x90\x91R``\x83\x01R`\x80\x82\x01R`\xA0\x01\x91\x90PV[`\0\x84Qa[\x8E\x81\x84` \x89\x01aY8V[\x84Q\x90\x83\x01\x90a[\xA2\x81\x83` \x89\x01aY8V[\x84Q\x91\x01\x90a[\xB5\x81\x83` \x88\x01aY8V[\x01\x95\x94PPPPPV[cNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[`\0\x82a[\xF2WcNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[P\x06\x90V[`\0\x85Qa\\\t\x81\x84` \x8A\x01aY8V[\x85Q\x90\x83\x01\x90a\\\x1D\x81\x83` \x8A\x01aY8V[\x85Q\x91\x01\x90a\\0\x81\x83` \x89\x01aY8V[\x84Q\x91\x01\x90a\\C\x81\x83` \x88\x01aY8V[\x01\x96\x95PPPPPPV[`\0\x89Q` a\\a\x82\x85\x83\x8F\x01aY8V[\x8AQ\x91\x84\x01\x91a\\t\x81\x84\x84\x8F\x01aY8V[\x8AQ\x92\x01\x91a\\\x86\x81\x84\x84\x8E\x01aY8V[\x89Q\x92\x01\x91a\\\x98\x81\x84\x84\x8D\x01aY8V[\x88Q\x92\x01\x91a\\\xAA\x81\x84\x84\x8C\x01aY8V[\x87Q\x92\x01\x91a\\\xBC\x81\x84\x84\x8B\x01aY8V[\x86Q\x92\x01\x91a\\\xCE\x81\x84\x84\x8A\x01aY8V[\x85Q\x92\x01\x91a\\\xE0\x81\x84\x84\x89\x01aY8V[\x91\x90\x91\x01\x9B\x9APPPPPPPPPPPV[`\0\x88Q` a]\x06\x82\x85\x83\x8E\x01aY8V[\x89Q\x91\x84\x01\x91a]\x19\x81\x84\x84\x8E\x01aY8V[\x89Q\x92\x01\x91a]+\x81\x84\x84\x8D\x01aY8V[\x88Q\x92\x01\x91a]=\x81\x84\x84\x8C\x01aY8V[\x87Q\x92\x01\x91a]O\x81\x84\x84\x8B\x01aY8V[\x86Q\x92\x01\x91a]a\x81\x84\x84\x8A\x01aY8V[\x85Q\x92\x01\x91a]s\x81\x84\x84\x89\x01aY8V[\x91\x90\x91\x01\x9A\x99PPPPPPPPPPV[`\0\x8AQa]\x97\x81\x84` \x8F\x01aY8V[\x91\x90\x91\x01\x98\x89RP` \x88\x01\x96\x90\x96R`@\x87\x01\x94\x90\x94R``\x86\x01\x92\x90\x92R`\x80\x85\x01R`\xA0\x84\x01R`\xC0\x83\x01R`\xE0\x82\x01Ra\x01\0\x01\x91\x90PV\xFE0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\xA6l\xC9(\xB5\xED\xB8*\xF9\xBDI\x92)T\x15Z\xB7\xB0\x94&\x94\xBE\xA4\xCEDf\x1D\x9A\x876\xC6\x88.+\x91Ea\x03i\x8A\xDFW\xB7\x99\x96\x9D\xEA\x1C\x8Fs\x9D\xA5\xD8\xD4\r\xD3\xEB\x92\"\xDB|\x81\xE8\x816\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\xF3\xF7\xA9\xFE6O\xAA\xB9;!m\xA5\n2\x14\x15O\"\xA0\xA2\xB4\x15\xB2:\x84\xC8\x16\x9E\x8Bcn\xE3\x1E\xE6x\xA0G\nu\xA6\xEA\xA8\xFE\x83p`I\x8B\xA8(\xA3p;1\x1D\x0Fw\xF0\x10BJ\xFE\xB0%\xF3\xF7\xA9\xFE6O\xAA\xB9;!m\xA5\n2\x14\x15O\"\xA0\xA2\xB4\x15\xB2:\x84\xC8\x16\x9E\x8Bcn\xE4 B\xA5\x87\xA9\x0C\x18{\n\x08|\x03\xE2\x9C\x96\x8B\x95\x0B\x1D\xB2m\\\x82\xD6f\x90Zh\x95y\x0C\n/\x8D\xD1\xF1\xA7X v\xCC75\xA9 \xA3\xCAP]8+\xBC\x90V[a\x0C\xF7a\x10{V[`\x06Tt\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16\x15a\rmW`\x06\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x90U`@Q\x7F\x9A_W\xDE\x85m\xD6h\xC5M\xD9^\\U\xDF\x93C!q\xCB\xCAI\xA8wmV \xEAY\xC0$P\x90`\0\x90\xA1V[`@Q\x7F\xA8c\xAE\xC9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[a\r\xA9a\x10{V[a\r\x9F`\0a\x17@V[a\x0E\x0F`@Q\x80a\x01\0\x01`@R\x80`\0g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\0g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[P`\0\x80Tc\xFF\xFF\xFF\xFF`\x01`@\x1B\x91\x82\x90\x04\x16\x82R`\x05` \x81\x81R`@\x93\x84\x90 \x84Qa\x01\0\x81\x01\x86R\x81Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x16\x83R\x95\x90\x04\x90\x94\x16\x91\x84\x01\x91\x90\x91R`\x01\x81\x01T\x93\x83\x01\x93\x90\x93R`\x02\x83\x01T``\x83\x01R`\x03\x83\x01T`\x80\x83\x01R`\x04\x83\x01T`\xA0\x83\x01R\x82\x01T`\xC0\x82\x01R`\x06\x90\x91\x01T`\xE0\x82\x01R\x90V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\0\x81\x15\x80\x15a\x0E\xDEWP\x82[\x90P`\0\x82g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\x01\x14\x80\x15a\x0E\xFBWP0;\x15[\x90P\x81\x15\x80\x15a\x0F\tWP\x80\x15[\x15a\x0F@W`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\x16`\x01\x17\x85U\x83\x15a\x0F\x86W\x84Th\xFF\0\0\0\0\0\0\0\0\x19\x16`\x01`@\x1B\x17\x85U[a\x0F\x8F\x86a\x17\xC9V[a\x0F\x97a\x17\xDAV[`\0\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\xFF\xFF\xFF\xFF\x16`\x01`@\x1B\x17\x90Ua\x0F\xCF\x88\x88a\x17\xE2V[\x83\x15a\x10\x1AW\x84Th\xFF\0\0\0\0\0\0\0\0\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPPPV[a\x10,a\x10{V[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x10oW`@Q\x7F\x1EO\xBD\xF7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\0`\x04\x82\x01R`$\x01a\nvV[a\x10x\x81a\x17@V[PV[3a\x10\xAD\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\r\x9FW`@Q\x7F\x11\x8C\xDA\xA7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R3`\x04\x82\x01R`$\x01a\nvV[\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x81\x10\x80a\x0C\xBCW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1B`$\x82\x01R\x7FBn254: invalid scalar field\0\0\0\0\0`D\x82\x01R`d\x01a\nvV[`\0\x80T`\x01`@\x1B\x80\x82\x04c\xFF\xFF\xFF\xFF\x16\x80\x84R`\x05` \x81\x81R`@\x80\x87 \x81Qa\x01\0\x81\x01\x83R\x81Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x16\x83R\x97\x90\x04\x87\x16\x81\x85\x01R`\x01\x80\x83\x01T\x82\x85\x01R`\x02\x80\x84\x01T``\x80\x85\x01\x91\x90\x91R`\x03\x80\x86\x01T`\x80\x80\x87\x01\x82\x90R`\x04\x80\x89\x01T`\xA0\x89\x01\x81\x90R\x89\x8D\x01T`\xC0\x8A\x01\x81\x90R`\x06\x90\x9A\x01\x80T`\xE0\x90\x9A\x01\x99\x90\x99R\x8AQ\x80\x8D\x01\x94\x90\x94R\x83\x8B\x01R\x82\x85\x01\x98\x90\x98R\x88Q\x80\x83\x03\x90\x94\x01\x84R\x01\x90\x96R\x80Q\x90\x87\x01 \x85T\x83U\x94\x85\x90U\x83T\x90U\x95\x89R\x93\x90\x92R\x91T\x90U\x93\x90\x92\x90\x91`\x0C\x91a\x12T\x91\x85\x91l\x01\0\0\0\0\0\0\0\0\0\0\0\0\x90\x04\x16aZ\xD5V[\x82Ta\x01\0\x92\x90\x92\ng\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x81\x02\x19\x90\x93\x16\x91\x83\x16\x02\x17\x90\x91U`\0T`@Ql\x01\0\0\0\0\0\0\0\0\0\0\0\0\x90\x91\x04\x90\x91\x16\x81R\x7F\xDB5X%\x9E\x03\x9D~P\xE8\x16\xB9\xDC\xCE0\xFB\x11M\x8A\x9C\x86\xEC\xA5\xAB\x14\xB6\x01\x94\xD6\x94]?\x91P` \x01a\x08vV[`\0a\x12\xC6a\x1A\xD2V[`@\x80Q`\x08\x80\x82Ra\x01 \x82\x01\x90\x92R\x91\x92P`\0\x91\x90` \x82\x01a\x01\0\x806\x837\x01\x90PP\x90P`\x02T\x81`\0\x81Q\x81\x10a\x13\x05Wa\x13\x05aZ\xF6V[` \x02` \x01\x01\x81\x81RPP\x83`\0\x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81`\x01\x81Q\x81\x10a\x133Wa\x133aZ\xF6V[` \x02` \x01\x01\x81\x81RPP\x83` \x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81`\x02\x81Q\x81\x10a\x13aWa\x13aaZ\xF6V[` \x02` \x01\x01\x81\x81RPP\x83`@\x01Q\x81`\x03\x81Q\x81\x10a\x13\x85Wa\x13\x85aZ\xF6V[` \x02` \x01\x01\x81\x81RPP\x83``\x01Q\x81`\x04\x81Q\x81\x10a\x13\xA9Wa\x13\xA9aZ\xF6V[` \x90\x81\x02\x91\x90\x91\x01\x81\x01\x91\x90\x91R`\0\x80T`\x01`@\x1B\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05\x91\x82\x90R`@\x90 `\x03\x01T\x82Q\x90\x91\x83\x91\x81\x10a\x13\xEDWa\x13\xEDaZ\xF6V[` \x90\x81\x02\x91\x90\x91\x01\x81\x01\x91\x90\x91R`\0\x80T`\x01`@\x1B\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05\x90\x91R`@\x90 `\x04\x01T\x81Q\x82\x90`\x06\x90\x81\x10a\x141Wa\x141aZ\xF6V[` \x90\x81\x02\x91\x90\x91\x01\x81\x01\x91\x90\x91R`\0\x80T`\x01`@\x1B\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05\x91\x82\x90R`@\x90 \x01T\x81Q\x82\x90`\x07\x90\x81\x10a\x14tWa\x14taZ\xF6V[` \x02` \x01\x01\x81\x81RPPa\x14\x8B\x82\x82\x85a \xB3V[a\x14\xC1W`@Q\x7F\t\xBD\xE39\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[PPPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14\x80a\x15`WP\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\x01`\x01`\xA0\x1B\x03\x16a\x15T\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBCT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\r\x9FW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x15\x9Fa\x10{V[`@Q`\x01`\x01`\xA0\x1B\x03\x82\x16\x81R\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x90` \x01a\x08vV[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x162WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x16/\x91\x81\x01\x90a[\x0CV[`\x01[a\x16sW`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\nvV[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x81\x14a\x16\xCFW`@Q\x7F\xAA\x1DI\xA4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x81\x01\x82\x90R`$\x01a\nvV[a\x16\xD9\x83\x83a!\x9EV[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\r\x9FW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81\x16`\x01`\x01`\xA0\x1B\x03\x84\x81\x16\x91\x82\x17\x84U`@Q\x92\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90`\0\x90\xA3PPPV[a\x17\xD1a!\xF4V[a\x10x\x81a\"VV[a\r\x9Fa!\xF4V[\x81Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x15\x15\x80a\x18\x08WP` \x82\x01Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x15\x15[\x80a\x18\x15WP`\x80\x82\x01Q\x15[\x80a\x18\"WP`\xA0\x82\x01Q\x15[\x80a\x18/WP`\xC0\x82\x01Q\x15[\x80a\x18!\x03<6\x8A\x93b-\xD4\x05\xB9\x05\xA0\xEB4L\x98\xB9\xD7\xCF\x08\xB0\xC5\xEB\xF7\xC89`\xA0\x82\x01QR~\x13y4*Mw\xD4p\x87C\xAF\xF0\x1F\xF2z\xA1\x19\x17G\x8F\xDC\x8E+}F0\x81sWr\xEA` `\xA0\x83\x01Q\x01R\x7F\x19M\xAF\x85\xD9\xEE\xD9\x93{(\xE2\xA6\x80\xFC\xC5\xA7i\"\xC1\\\xD3\x1D\xC4\xF6\0\xE1I9\xB8 \x0C\xE7`\xC0\x82\x01QR\x7F%(\x0B\x12F$\x91\x1C\x7F\x87\xB4\xC2\xD8\x7FY\xC6\xC0~>\xEE\xB1\raM\xA2\x16\xF6!\x9F\xFEP\xB6` `\xC0\x83\x01Q\x01R\x7F\x04\x88.\xF3\x98\x99\xEA8\xC9gzH\xB8\xF8\xCCjg(N\x17\xFF\x94\x02\x89\xFA\xAA5\x9E\xEC\x9B3\xA6`\xE0\x82\x01QR\x7F\x1B\xAE\x9F6\xE6\x19\x078\xC7\x11P\x1B\xE5?)\x9B\xF6\x13H\xE6\x1E.\xF9\xD5wv\x0Ed\xF6)6\x8D` `\xE0\x83\x01Q\x01R\x7F-\x81\r0\x12\x0C\xB9>\x1A%K\x89\xED\n\xE8lv\x1FI\xB4\xF1)E\x9C\xD54\xF9U\x18Q5\x0Fa\x01\0\x82\x01QR\x7F\x0B%9M\xA5\xA1\xD45\xDA\xCC\xC2\xEA\xDD\x03\x9E,'\t\xF5\xF4/\xAB\xD9\xAF\xBA\x81^\xD6-j\xF3k` a\x01\0\x83\x01Q\x01R\x7F\x1C,\xE7\xBEW\x0B\xEA\x9EC\xF3\xD3\xD7\xCB\xCA\x84\xBD\xB4\xFC\x89\xB5:\xE6WS\x1D\xE7&p\xA6\x10^\x08a\x01 \x82\x01QR\x7F\x1A\x02U\xEC\x8C|\x87i3[\xC9\xDCk\"*\xC6\xA0Nvm\x08\xB4\\\x8C\xC5sY,\x05\xBC\x9C\x14` a\x01 \x83\x01Q\x01R\x7F\x1C\x16AY\x13k\x8F[Gs\xE13\xF4\x83\xA8\xA1\x92\xAB\x15\xD6\xD3\xEE\x01/\x17\x1B=\x02\xFDE\x06\xE7a\x01@\x82\x01QR\x7F'.\xB7\xD63\xCE\xDBh\xCE\x01\x13\xF4B\n\xB5a\x0B\x81\xB8\xBA\x1A\xB94\x8D\xB1Wa\xD4\x0E\x8D\xF5\xBA` a\x01@\x83\x01Q\x01R\x7F\x0EDf9\xAAl\xAF%\xE9>\xF7G\x08N9\xB8\xEA\x90\xAB\xF2;\xB4\x8C(\xFD_\x9B\xA7\xBAeP\"a\x01`\x82\x01QR\x7F\x03>\x19Z\x9E\xA3\xA9\xCE@\xB7+g:\xFBEDL\xA1\xB1_\x05C\xF4M\x10\xF5\xC6@\xA7\x80go` a\x01`\x83\x01Q\x01R\x7F\x0E\x8D\xB2\xB2\x89=\xF2=\xD6\x81y\x96\xF7_\x10\0\x9D\x99\"\x07\x93\xECsa\x01\xC0\x82\x01QR\x7F\x19\xEB\x12\xA7\x82|\r\xDFc\x83\xFE\x80l9S\xBD\x06\xB0\x8A\xAE{\xF2\xA0\x1FU\xC9\x86\xA8OP\xCC(` a\x01\xC0\x83\x01Q\x01R\x7F\x01V\x910\x88F\xE6\x8E\xA8V\xA2\xCB$\xC9\x90?\x0C\x86\x05\xDE\xA1\x90\x82\x91\x80\xFFk\xDD\x1Ce\x08\x03a\x01\xE0\x82\x01QR\x7F\x1F\xFDx\x9B\x15[\x8A\xCB\x13\xE0\xF6\xA4\x8BP\xF7\xAA\x80\x92T\x08\x88\xD0\t\x14\x10W\xD4V\x90\x91X$` a\x01\xE0\x83\x01Q\x01R\x7F\x05E\xACz\xA6m\xCF7\x19\x98\x848\xC8\x06\xFCbM\xE5z\xB4?\x85\x809/\x88\xC8l\x13x\xCEJa\x02\0\x82\x01QR\x7F\x16\xB7\xF2P\x84.\xCFN6\x90pj\x1E\x15-zW\xF7\x0FUo\x92\x07m\xA7\x85\xFD\xD3c\xC1\x9F\xCF` a\x02\0\x83\x01Q\x01R\x7F \xCB\x7F\xF3Z\x83\xA7\xDC1@6\xE4p\xF1L0\xFB\x0E\x98\xD3]f;$;\",\xAAo\xC7\xDBDa\x02 \x82\x01QR\x7F\x14\x9FAWDpth\xBD\xAAN\x85E \x1A\xB4\r\x191\xA7\xD3\x1F#v\x8F\xA7\xC6Ut\xEE>\xAB` a\x02 \x83\x01Q\x01R\x7F\n%\xC1\xB7W9\x06\xDCN\x19;N\xA8/\xD1\xFE|\xCE\xBCM\x92]\xAD&\xF0\xFF\t\xC8L\x9F\x1Aua\x02@\x82\x01QR\x7F\nR\x1F\xF3\x0C\x8F6fy\x8F\x84|]L7\x96X\xFB\xA1\x01V\xE7\xA9I\x9F'\x13\xFA\xE9\xBF+\xE1` a\x02@\x83\x01Q\x01R\x7F\x03\xDBe\x10\xC3\xF16)\xFD\xED\x9AZ-AeK\xBC\xE4\xEFm\x02L\xADS\x10\0Q\xD4\xA3\xF3\xEB\xC9a\x02`\x82\x01QR\x7F\x08\xE8\n\\\x8EL\x9B\x9F&\xF3\0<\xC5\x94\x03\xA1\x8D16\xAF\xD00\x86\x8D%\xCC\x8B\x80~*\xB3p` a\x02`\x83\x01Q\x01R\x90V[`\0a \xBE\x82a\"^V[a \xE1\x83`\0\x81Q\x81\x10a \xD4Wa \xD4aZ\xF6V[` \x02` \x01\x01Qa\x10\xEFV[a \xF7\x83`\x01\x81Q\x81\x10a \xD4Wa \xD4aZ\xF6V[a!\r\x83`\x02\x81Q\x81\x10a \xD4Wa \xD4aZ\xF6V[a!#\x83`\x03\x81Q\x81\x10a \xD4Wa \xD4aZ\xF6V[a!9\x83`\x04\x81Q\x81\x10a \xD4Wa \xD4aZ\xF6V[a!O\x83`\x05\x81Q\x81\x10a \xD4Wa \xD4aZ\xF6V[a!e\x83`\x06\x81Q\x81\x10a \xD4Wa \xD4aZ\xF6V[a!{\x83`\x07\x81Q\x81\x10a \xD4Wa \xD4aZ\xF6V[`\0a!\x88\x85\x85\x85a#\x96V[\x90Pa!\x93\x81a%\x17V[\x91PP[\x93\x92PPPV[a!\xA7\x82a)\xDFV[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a!\xECWa\x16\xD9\x82\x82a*\x87V[a\x0C\xBCa*\xFFV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0T`\x01`@\x1B\x90\x04`\xFF\x16a\r\x9FW`@Q\x7F\xD7\xE6\xBC\xF8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x10,a!\xF4V[\x80Qa\"i\x90a+7V[a\"v\x81` \x01Qa+7V[a\"\x83\x81`@\x01Qa+7V[a\"\x90\x81``\x01Qa+7V[a\"\x9D\x81`\x80\x01Qa+7V[a\"\xAA\x81`\xA0\x01Qa+7V[a\"\xB7\x81`\xC0\x01Qa+7V[a\"\xC4\x81`\xE0\x01Qa+7V[a\"\xD2\x81a\x01\0\x01Qa+7V[a\"\xE0\x81a\x01 \x01Qa+7V[a\"\xEE\x81a\x01@\x01Qa+7V[a\"\xFC\x81a\x01`\x01Qa+7V[a#\n\x81a\x01\x80\x01Qa+7V[a#\x18\x81a\x01\xA0\x01Qa\x10\xEFV[a#&\x81a\x01\xC0\x01Qa\x10\xEFV[a#4\x81a\x01\xE0\x01Qa\x10\xEFV[a#B\x81a\x02\0\x01Qa\x10\xEFV[a#P\x81a\x02 \x01Qa\x10\xEFV[a#^\x81a\x02@\x01Qa\x10\xEFV[a#l\x81a\x02`\x01Qa\x10\xEFV[a#z\x81a\x02\x80\x01Qa\x10\xEFV[a#\x88\x81a\x02\xA0\x01Qa\x10\xEFV[a\x10x\x81a\x02\xC0\x01Qa\x10\xEFV[a#\x9EaT\xE1V[\x83` \x01Q\x83Q\x14a#\xDCW`@Q\x7FA\xF5;\x12\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a#\xE9\x85\x85\x85a+\xE1V[\x90P`\0a#\xFA\x86`\0\x01Qa/\x12V[\x90P`\0a$\r\x82\x84`\xA0\x01Q\x88a2\xF6V[`@\x80Q`\x1E\x80\x82Ra\x03\xE0\x82\x01\x90\x92R\x91\x92P`\0\x91\x90` \x82\x01a\x03\xC0\x806\x837PP`@\x80Q`\x1E\x80\x82Ra\x03\xE0\x82\x01\x90\x92R\x92\x93P`\0\x92\x91P` \x82\x01[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81R` \x01\x90`\x01\x90\x03\x90\x81a$PW\x90PP\x90P`\0a$\x89\x8A\x85\x8A\x89\x87\x87a3VV[`\xA0\x87\x01Q``\x87\x01Q\x91\x92P\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01`\0\x81\x83\x85\t`@\x80Qa\x01\0\x81\x01\x82R`\xE0\x9C\x8D\x01Q\x81R` \x81\x01\x96\x90\x96R\x85\x01RPPP``\x81\x01\x91\x90\x91R`\x80\x81\x01\x92\x90\x92R`\xA0\x82\x01Ra\x01`\x86\x01Q`\xC0\x82\x01Ra\x01\x80\x90\x95\x01Q\x92\x85\x01\x92\x90\x92RP\x91\x94\x93PPPPV[`@\x80Q\x80\x82\x01\x82R`\0\x80\x82R` \x80\x83\x01\x82\x90R\x83Q\x80\x85\x01\x85R\x82\x81R\x90\x81\x01\x82\x90R\x83Q`\x02\x80\x82R``\x82\x01\x90\x95R\x91\x93\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x93\x92\x85\x91\x81` \x01` \x82\x02\x806\x837PP`@\x80Q`\x02\x80\x82R``\x82\x01\x90\x92R\x92\x93P`\0\x92\x91P` \x82\x01[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81R` \x01\x90`\x01\x90\x03\x90\x81a%\x9DW\x90PP\x90P`\0`\x01\x90P\x80\x83`\0\x81Q\x81\x10a%\xE0Wa%\xE0aZ\xF6V[` \x02` \x01\x01\x81\x81RPP\x87`\xC0\x01Q\x82`\0\x81Q\x81\x10a&\x04Wa&\x04aZ\xF6V[` \x02` \x01\x01\x81\x90RP\x87`\0\x01Q\x83`\x01\x81Q\x81\x10a&'Wa&'aZ\xF6V[` \x02` \x01\x01\x81\x81RPP\x87`\xE0\x01Q\x82`\x01\x81Q\x81\x10a&KWa&KaZ\xF6V[` \x02` \x01\x01\x81\x90RPa&`\x82\x84a3\x8BV[`\x80\x89\x01QQ\x90\x95P``\x93P\x83\x92P\x90P`\0a&\x7F\x82`\x02a[%V[a&\x8A\x90`\x01a[%V[\x90P\x80g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a&\xA5Wa&\xA5aU\xA2V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a&\xCEW\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x93P\x80g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a&\xEAWa&\xEAaU\xA2V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a'/W\x81` \x01[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81R` \x01\x90`\x01\x90\x03\x90\x81a'\x08W\x90P[P\x92PPP`\0\x80`\0[\x89`\x80\x01QQ\x81\x10\x15a'\xD3W\x89`\x80\x01Q\x81\x81Q\x81\x10a']Wa']aZ\xF6V[` \x02` \x01\x01Q\x85\x83\x81Q\x81\x10a'wWa'waZ\xF6V[` \x02` \x01\x01\x81\x81RPP\x89`\xA0\x01Q\x81\x81Q\x81\x10a'\x99Wa'\x99aZ\xF6V[` \x02` \x01\x01Q\x84\x83\x81Q\x81\x10a'\xB3Wa'\xB3aZ\xF6V[` \x90\x81\x02\x91\x90\x91\x01\x01Ra'\xC9`\x01\x83a[%V[\x91P`\x01\x01a':V[P\x88` \x01Q\x84\x82\x81Q\x81\x10a'\xEBWa'\xEBaZ\xF6V[` \x02` \x01\x01\x81\x81RPP\x88`\xC0\x01Q\x83\x82\x81Q\x81\x10a(\x0EWa(\x0EaZ\xF6V[` \x90\x81\x02\x91\x90\x91\x01\x01Ra($`\x01\x82a[%V[\x89Q`@\x8B\x01Q\x91\x92P\x90`\0\x89\x82\x84\t\x90P\x80\x87\x85\x81Q\x81\x10a(JWa(JaZ\xF6V[` \x02` \x01\x01\x81\x81RPPPPP\x88`\xE0\x01Q\x83\x82\x81Q\x81\x10a(pWa(paZ\xF6V[` \x90\x81\x02\x91\x90\x91\x01\x01Ra(\x86`\x01\x82a[%V[``\x8A\x01Q\x90\x91P\x87\x81\x84\x08\x92PPa(\x9E\x82a4\x85V[\x84\x82\x81Q\x81\x10a(\xB0Wa(\xB0aZ\xF6V[` \x02` \x01\x01\x81\x81RPPa(\xE8`@\x80Q\x80\x82\x01\x82R`\0\x80\x82R` \x91\x82\x01R\x81Q\x80\x83\x01\x90\x92R`\x01\x82R`\x02\x90\x82\x01R\x90V[\x83\x82\x81Q\x81\x10a(\xFAWa(\xFAaZ\xF6V[` \x02` \x01\x01\x81\x90RPa)\x17a)\x12\x84\x86a3\x8BV[a4\xDBV[\x94PPPPP`\0`@Q\x80`\x80\x01`@R\x80\x7F\x01\x18\xC4\xD5\xB87\xBC\xC2\xBC\x89\xB5\xB3\x98\xB5\x97N\x9FYD\x07;2\x07\x8B~#\x1F\xEC\x93\x88\x83\xB0\x81R` \x01\x7F&\x0E\x01\xB2Q\xF6\xF1\xC7\xE7\xFFNX\x07\x91\xDE\xE8\xEAQ\xD8z5\x8E\x03\x8BN\xFE0\xFA\xC0\x93\x83\xC1\x81R` \x01\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U\x81R` \x01\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4\x81RP\x90Pa)\xD5\x83\x82\x84a)\xD0a5zV[a6KV[\x96\x95PPPPPPV[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a*.W`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\nvV[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa*\xA4\x91\x90a[8V[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a*\xDFW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a*\xE4V[``\x91P[P\x91P\x91Pa*\xF4\x85\x83\x83a7/V[\x92PPP[\x92\x91PPV[4\x15a\r\x9FW`@Q\x7F\xB3\x98\x97\x9F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80Q` \x82\x01Q`\0\x91\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x91\x15\x90\x15\x16\x15a+qWPPPV[\x82Q` \x84\x01Q\x82`\x03\x84\x85\x85\x86\t\x85\t\x08\x83\x82\x83\t\x14\x83\x82\x10\x84\x84\x10\x16\x16\x93PPP\x81a\x16\xD9W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x17`$\x82\x01R\x7FBn254: invalid G1 point\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\nvV[a,)`@Q\x80a\x01\0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`@\x80Q\x80\x82\x01\x90\x91R``\x81R`\0` \x82\x01R\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01a,j\x82\x87\x87a7\xA4V[\x81Q\x84Qa,w\x90a;\x85V[a,\x84\x86` \x01Qa;\x85V[a,\x91\x87`@\x01Qa;\x85V[a,\x9E\x88``\x01Qa;\x85V[a,\xAB\x89`\x80\x01Qa;\x85V[`@Q` \x01a,\xC0\x96\x95\x94\x93\x92\x91\x90a[TV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra,\xDB\x82aV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra.\xEB\x82a\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x90\x82\x01R\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0``\x82\x01R\x7F'$q6\x03\xBF\xBDy\n\xEA\xF3\xE7\xDF%\xD8\xE7\xEF\x8F1\x134\x90[M\x8C\x99\x98\x0C\xF2\x10\x97\x9D`\x80\x82\x01R\x90V[`@Q\x7F\xE2\xEF\t\xE5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x91\x90PV[a3\x1A`@Q\x80``\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[a3$\x84\x84a>\x08V[\x80\x82Ra34\x90\x85\x90\x85\x90a>nV[` \x82\x01R\x80Qa3J\x90\x85\x90\x84\x90\x86\x90a>\xF4V[`@\x82\x01R\x93\x92PPPV[`\0\x80a3d\x85\x87\x89a@\xBBV[\x90Pa3t\x88\x86\x89\x89\x88\x88aA\xBDV[a3\x7F\x81\x87\x86aD\xDBV[\x98\x97PPPPPPPPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x82Q\x82Q\x14a3\xF0W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FMSM error: length does not match`D\x82\x01R`d\x01a\nvV[a4.\x83`\0\x81Q\x81\x10a4\x06Wa4\x06aZ\xF6V[` \x02` \x01\x01Q\x83`\0\x81Q\x81\x10a4!Wa4!aZ\xF6V[` \x02` \x01\x01QaE=V[\x90P`\x01[\x82Q\x81\x10\x15a4~Wa4t\x82a4o\x86\x84\x81Q\x81\x10a4UWa4UaZ\xF6V[` \x02` \x01\x01Q\x86\x85\x81Q\x81\x10a4!Wa4!aZ\xF6V[aE\xE1V[\x91P`\x01\x01a43V[P\x92\x91PPV[`\0a4\xB1\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x83a\\\x97V[a*\xF9\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01a\\\xB9V[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81Q` \x83\x01Q\x15\x90\x15\x16\x15a5\x03WP\x90V[`@Q\x80`@\x01`@R\x80\x83`\0\x01Q\x81R` \x01\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x84` \x01Qa5H\x91\x90a\\\x97V[a5r\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDGa\\\xB9V[\x90R\x92\x91PPV[a5\xA5`@Q\x80`\x80\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`@Q\x80`\x80\x01`@R\x80\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x81R` \x01\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2\x81R` \x01\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA\x81R` \x01\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[\x81RP\x90P\x90V[`\0\x80`\0`@Q\x87Q\x81R` \x88\x01Q` \x82\x01R` \x87\x01Q`@\x82\x01R\x86Q``\x82\x01R``\x87\x01Q`\x80\x82\x01R`@\x87\x01Q`\xA0\x82\x01R\x85Q`\xC0\x82\x01R` \x86\x01Q`\xE0\x82\x01R` \x85\x01Qa\x01\0\x82\x01R\x84Qa\x01 \x82\x01R``\x85\x01Qa\x01@\x82\x01R`@\x85\x01Qa\x01`\x82\x01R` `\0a\x01\x80\x83`\x08Z\xFA\x91PP`\0Q\x91P\x80a7!W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1C`$\x82\x01R\x7FBn254: Pairing check failed!\0\0\0\0`D\x82\x01R`d\x01a\nvV[P\x15\x15\x90P[\x94\x93PPPPV[``\x82a7DWa7?\x82aF\x88V[a!\x97V[\x81Q\x15\x80\x15a7[WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a7\x9DW`@Q\x7F\x99\x96\xB3\x15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\nvV[P\x80a!\x97V[\x82Q`\xFE\x90a7\xDFa7\xB5\x83a<\xBCV[`@Q` \x01a7\xC7\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R`\0`\x04aF\xCAV[a8\x19a7\xEF\x86`\0\x01Qa<\xBCV[`@Q` \x01a8\x01\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R`\0`\x08aF\xCAV[a8)a7\xEF\x87` \x01Qa<\xBCV[`@Q` \x01a8<\x94\x93\x92\x91\x90a\\\xCCV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x85Ra8Y`\x01a<\xBCV[a8\x82\x7F/\x8D\xD1\xF1\xA7X^W\x84\x93P`\0[\x82\x81\x10\x15a>RW\x83\x85\x86\t\x94P`\x01\x01a>eV[`\x01\x83\x03\x93P[PPP\x92\x91PPV[`\0\x82`\x01\x03a>\x80WP`\x01a!\x97V[\x81`\0\x03a>\x90WP`\0a!\x97V[`@\x84\x01Q\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x90`\0\x90\x82\x81\x86\t\x90P\x85\x80\x15a>\xD2W`\x01\x87\x03\x92Pa>\xD9V[`\x01\x84\x03\x92P[Pa>\xE3\x82aG\xF2V[\x91P\x82\x82\x82\t\x97\x96PPPPPPPV[\x82Q`\0\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x90\x83\x83\x03a?\x87W`\x01`\0[\x82\x81\x10\x15a?zW\x81\x87\x03a?[W\x87\x81\x81Q\x81\x10a?HWa?HaZ\xF6V[` \x02` \x01\x01Q\x94PPPPPa7'V[\x83\x80a?iWa?ia\\\x81V[\x89``\x01Q\x83\t\x91P`\x01\x01a?'V[P`\0\x93PPPPa7'V[`\0\x80`\0\x80\x8A`@\x01Q\x90P`\0\x80a?\xA1\x8D\x88aH\xAAV[\x90P`\0\x87g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a?\xBEWa?\xBEaU\xA2V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a?\xE7W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x90P\x88\x8B\x85\t\x93P`\x01\x92P`\0[\x88\x81\x10\x15a@,W` \x81\x02` \x84\x01\x01Q\x95P\x89\x8D\x87\x8C\x03\x08\x96P\x89\x87\x85\t` \x82\x81\x02\x84\x01\x01\x88\x90R\x93P`\x01\x01a?\xF7V[Pa@6\x83aG\xF2V[\x92P`\0[\x88\x81\x10\x15a@\xA9W` \x81\x02` \x84\x01\x01Q\x95P\x89\x86\x86\t\x97P\x89\x84\x89\t\x97P`\0[\x89\x81\x10\x15a@\x88W\x80\x82\x14a@\x80W` \x81\x02` \x84\x01\x01Q\x97P\x8A\x88\x8A\t\x98P[`\x01\x01a@^V[P` \x81\x02` \x8F\x01\x01Q\x95P\x89\x86\x89\t\x97P\x89\x88\x8C\x08\x9AP`\x01\x01a@;V[PPPPPPPPPP\x94\x93PPPPV[`\0\x80\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x90P`\0\x83` \x01Q\x90P`\0\x84`@\x01Q\x90P`\0`\x01\x90P``\x88\x01Q`\x80\x89\x01Qa\x01\xA0\x89\x01Qa\x02@\x8A\x01Q\x87\x88\x89\x83\x87\t\x8A\x86\x86\x08\x08\x86\t\x94PPPa\x01\xC0\x89\x01Qa\x02`\x8A\x01Q\x87\x88\x89\x83\x87\t\x8A\x86\x86\x08\x08\x86\t\x94PPPa\x01\xE0\x89\x01Qa\x02\x80\x8A\x01Q\x87\x88\x89\x83\x87\t\x8A\x86\x86\x08\x08\x86\t\x94PPPa\x02\0\x89\x01Qa\x02\xA0\x8A\x01Q\x87\x88\x89\x83\x87\t\x8A\x86\x86\x08\x08\x86\t\x94PPPa\x02 \x89\x01Q\x91Pa\x02\xC0\x89\x01Q\x86\x87\x82\x89\x85\x87\x08\t\x85\t\x93PPPP\x87Q` \x89\x01Q\x85\x86\x86\x83\t\x87\x03\x85\x08\x96PP\x84\x85\x83\x83\t\x86\x03\x87\x08\x99\x98PPPPPPPPPV[aA\xCB\x86\x86\x86\x86\x85\x87aI\x9BV[`\xC0\x85\x01Q\x82Q\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x91\x90\x81\x90\x81\x90\x86\x90`\x14\x90\x81\x10aB\x0CWaB\x0CaZ\xF6V[` \x02` \x01\x01\x81\x81RPP\x85`\0\x01Q\x84`\x14\x81Q\x81\x10aB0WaB0aZ\xF6V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x15\x81Q\x81\x10aBUWaBUaZ\xF6V[` \x02` \x01\x01\x81\x81RPP\x85` \x01Q\x84`\x15\x81Q\x81\x10aByWaByaZ\xF6V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x16\x81Q\x81\x10aB\x9EWaB\x9EaZ\xF6V[` \x02` \x01\x01\x81\x81RPP\x85`@\x01Q\x84`\x16\x81Q\x81\x10aB\xC2WaB\xC2aZ\xF6V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x17\x81Q\x81\x10aB\xE7WaB\xE7aZ\xF6V[` \x02` \x01\x01\x81\x81RPP\x85``\x01Q\x84`\x17\x81Q\x81\x10aC\x0BWaC\x0BaZ\xF6V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x18\x81Q\x81\x10aC0WaC0aZ\xF6V[` \x02` \x01\x01\x81\x81RPP\x85`\x80\x01Q\x84`\x18\x81Q\x81\x10aCTWaCTaZ\xF6V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x19\x81Q\x81\x10aCyWaCyaZ\xF6V[` \x02` \x01\x01\x81\x81RPP\x88`@\x01Q\x84`\x19\x81Q\x81\x10aC\x9DWaC\x9DaZ\xF6V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1A\x81Q\x81\x10aC\xC2WaC\xC2aZ\xF6V[` \x02` \x01\x01\x81\x81RPP\x88``\x01Q\x84`\x1A\x81Q\x81\x10aC\xE6WaC\xE6aZ\xF6V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1B\x81Q\x81\x10aD\x0BWaD\x0BaZ\xF6V[` \x02` \x01\x01\x81\x81RPP\x88`\x80\x01Q\x84`\x1B\x81Q\x81\x10aD/WaD/aZ\xF6V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1C\x81Q\x81\x10aDTWaDTaZ\xF6V[` \x02` \x01\x01\x81\x81RPP\x88`\xA0\x01Q\x84`\x1C\x81Q\x81\x10aDxWaDxaZ\xF6V[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x87`\xE0\x01Q\x85`\x1D\x81Q\x81\x10aD\xA1WaD\xA1aZ\xF6V[` \x02` \x01\x01\x81\x81RPP\x85`\xA0\x01Q\x84`\x1D\x81Q\x81\x10aD\xC5WaD\xC5aZ\xF6V[` \x02` \x01\x01\x81\x90RPPPPPPPPPPV[\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x83\x81\x03\x90`\0[`\n\x81\x10\x15aE4W` `\x15\x82\x01\x02\x84\x01Q` \x82\x02a\x01\xA0\x01\x86\x01Q\x83\x84\x82\x84\t\x86\x08\x94PPP`\x01\x01aE\x03V[PP\x93\x92PPPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01RaEYaU4V[\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R`@\x81\x01\x83\x90R`\0``\x83`\x80\x84`\x07a\x07\xD0Z\x03\xFA\x90P\x80\x80aE\x8BW`\0\x80\xFD[P\x80aE\xD9W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x19`$\x82\x01R\x7FBn254: scalar mul failed!\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\nvV[PP\x92\x91PPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01RaE\xFDaURV[\x83Q\x81R` \x80\x85\x01Q\x81\x83\x01R\x83Q`@\x83\x01R\x83\x01Q``\x80\x83\x01\x91\x90\x91R`\0\x90\x83`\xC0\x84`\x06a\x07\xD0Z\x03\xFA\x90P\x80\x80aF:W`\0\x80\xFD[P\x80aE\xD9W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: group addition failed!\0\0\0`D\x82\x01R`d\x01a\nvV[\x80Q\x15aF\x98W\x80Q\x80\x82` \x01\xFD[`@Q\x7F\x14%\xEAB\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x81aF\xD8\x81`\x1Fa[%V[\x10\x15aG&W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0E`$\x82\x01R\x7Fslice_overflow\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\nvV[aG0\x82\x84a[%V[\x84Q\x10\x15aG\x80W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x11`$\x82\x01R\x7Fslice_outOfBounds\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\nvV[``\x82\x15\x80\x15aG\x9FW`@Q\x91P`\0\x82R` \x82\x01`@RaG\xE9V[`@Q\x91P`\x1F\x84\x16\x80\x15` \x02\x81\x84\x01\x01\x85\x81\x01\x87\x83\x15` \x02\x84\x8B\x01\x01\x01[\x81\x83\x10\x15aG\xD8W\x80Q\x83R` \x92\x83\x01\x92\x01aG\xC0V[PP\x85\x84R`\x1F\x01`\x1F\x19\x16`@RP[P\x94\x93PPPPV[`\0\x80`\0\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x90P`@Q` \x81R` \x80\x82\x01R` `@\x82\x01R\x84``\x82\x01R`\x02\x82\x03`\x80\x82\x01R\x81`\xA0\x82\x01R` `\0`\xC0\x83`\x05Z\xFA\x92PP`\0Q\x92P\x81aH\xA3W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: pow precompile failed!\0\0\0`D\x82\x01R`d\x01a\nvV[PP\x91\x90PV[``\x82` \x01Q\x82\x11\x15aH\xEAW`@Q\x7F\x8C^\x11\xF1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x83\x01Q`\x01\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x84g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15aI+WaI+aU\xA2V[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15aITW\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x93P\x84\x15\x19\x15a>eW` \x84\x01\x85` \x02\x81\x01`\x01\x82R` \x82\x01\x91P[\x80\x82\x10\x15aI\x90W\x82\x85\x85\t\x93P\x83\x82R` \x82\x01\x91PaItV[PPPPP\x92\x91PPV[`\0\x80`\0\x80`\0\x80\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x90P\x80` \x8B\x01Q` \x8D\x01Q\t\x95P\x8AQ\x93P\x80`\xA0\x8C\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xA0\x8A\x01Q\x84\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80\x7F/\x8D\xD1\xF1\xA7XF\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x16\x7Fa\x12\tV[\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x81`@Qa\x08\xA1\x91\x90aT\x87V[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x17\x08WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x17\x05\x91\x81\x01\x90aZ3V[`\x01[a\x17'W\x81`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x04\x01a\n9\x91\x90aT\x87V[`\0\x80Q` a^5\x839\x81Q\x91R\x81\x14a\x17XW`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\n9V[a\x17b\x83\x83a#=V[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\r\xAEW`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\x17\xBAa\x18\x0CV[\x80T`\x01`\x01`\xA0\x1B\x03\x84\x81\x16`\x01`\x01`\xA0\x1B\x03\x19\x83\x16\x81\x17\x84U`@Q\x93\x94P\x91\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90`\0\x90\xA3PPPV[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x90V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90V[a\x18\\a#\x93V[a\x12\x06\x81a#\xB8V[a\r\xAEa#\x93V[\x81Q`\x01`\x01`@\x1B\x03\x16\x15\x15\x80a\x18\x91WP` \x82\x01Q`\x01`\x01`@\x1B\x03\x16\x15\x15[\x80a\x18\x9EWP`\x80\x82\x01Q\x15[\x80a\x18\xABWP`\xA0\x82\x01Q\x15[\x80a\x18\xB8WP`\xC0\x82\x01Q\x15[\x80a\x18\xC5WP`\xE0\x82\x01Q\x15[\x80a\x18\xD4WPc\xFF\xFF\xFF\xFF\x81\x16\x15[\x15a\x18\xF2W`@QcP\xDD\x03\xF7`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81`\x05`\0\x80`\x04\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP\x81`\x05`\0\x80`\x08\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP`\0\x80`\x0Ca\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP\x80`\0\x80a\x01\0\n\x81T\x81c\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83c\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\0a\x1A\xD8\x83a\x11\x13V[`\x01\x81\x81U`\xE0\x85\x01Q`\x02\x81\x81U`\x03\x93\x90\x93U`\x04U`\x07\x80T\x80\x83\x01\x82U`\0\x91\x82RC`\0\x80Q` a]\xF5\x839\x81Q\x91R\x90\x91\x01U`@\x80Q\x80\x82\x01\x82R` \x80\x89\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16\x83R\x92\x90\x98\x01Q\x97\x81\x01\x97\x88R`\x08\x80T\x94\x85\x01\x81U\x90\x92R\x90Q`\0\x80Q` a^u\x839\x81Q\x91R\x92\x90\x93\x02\x91\x82\x01\x80T`\x01`\x01`@\x1B\x03\x19\x16\x93\x90\x91\x16\x92\x90\x92\x17\x90\x91U\x92Q`\0\x80Q` a^\xB5\x839\x81Q\x91R\x90\x93\x01\x92\x90\x92UPPV[`\x07T`\0\x90C\x84\x11\x80a\x1B\xA4WP`\x03\x81\x10[\x15a\x1B\xC2W`@Qc\xB0\xB48w`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x80\x80a\x1B\xD1`\x01\x85aZ\0V[\x90P[\x81a\x1C!\x03<6\x8A\x93b-\xD4\x05\xB9\x05\xA0\xEB4L\x98\xB9\xD7\xCF\x08\xB0\xC5\xEB\xF7\xC89`\xA0\x82\x01QR~\x13y4*Mw\xD4p\x87C\xAF\xF0\x1F\xF2z\xA1\x19\x17G\x8F\xDC\x8E+}F0\x81sWr\xEA` `\xA0\x83\x01Q\x01R\x7F\x19M\xAF\x85\xD9\xEE\xD9\x93{(\xE2\xA6\x80\xFC\xC5\xA7i\"\xC1\\\xD3\x1D\xC4\xF6\0\xE1I9\xB8 \x0C\xE7`\xC0\x82\x01QR\x7F%(\x0B\x12F$\x91\x1C\x7F\x87\xB4\xC2\xD8\x7FY\xC6\xC0~>\xEE\xB1\raM\xA2\x16\xF6!\x9F\xFEP\xB6` `\xC0\x83\x01Q\x01R\x7F\x04\x88.\xF3\x98\x99\xEA8\xC9gzH\xB8\xF8\xCCjg(N\x17\xFF\x94\x02\x89\xFA\xAA5\x9E\xEC\x9B3\xA6`\xE0\x82\x01QR\x7F\x1B\xAE\x9F6\xE6\x19\x078\xC7\x11P\x1B\xE5?)\x9B\xF6\x13H\xE6\x1E.\xF9\xD5wv\x0Ed\xF6)6\x8D` `\xE0\x83\x01Q\x01R\x7F-\x81\r0\x12\x0C\xB9>\x1A%K\x89\xED\n\xE8lv\x1FI\xB4\xF1)E\x9C\xD54\xF9U\x18Q5\x0Fa\x01\0\x82\x01QR\x7F\x0B%9M\xA5\xA1\xD45\xDA\xCC\xC2\xEA\xDD\x03\x9E,'\t\xF5\xF4/\xAB\xD9\xAF\xBA\x81^\xD6-j\xF3k` a\x01\0\x83\x01Q\x01R\x7F\x1C,\xE7\xBEW\x0B\xEA\x9EC\xF3\xD3\xD7\xCB\xCA\x84\xBD\xB4\xFC\x89\xB5:\xE6WS\x1D\xE7&p\xA6\x10^\x08a\x01 \x82\x01QR\x7F\x1A\x02U\xEC\x8C|\x87i3[\xC9\xDCk\"*\xC6\xA0Nvm\x08\xB4\\\x8C\xC5sY,\x05\xBC\x9C\x14` a\x01 \x83\x01Q\x01R\x7F\x1C\x16AY\x13k\x8F[Gs\xE13\xF4\x83\xA8\xA1\x92\xAB\x15\xD6\xD3\xEE\x01/\x17\x1B=\x02\xFDE\x06\xE7a\x01@\x82\x01QR\x7F'.\xB7\xD63\xCE\xDBh\xCE\x01\x13\xF4B\n\xB5a\x0B\x81\xB8\xBA\x1A\xB94\x8D\xB1Wa\xD4\x0E\x8D\xF5\xBA` a\x01@\x83\x01Q\x01R\x7F\x0EDf9\xAAl\xAF%\xE9>\xF7G\x08N9\xB8\xEA\x90\xAB\xF2;\xB4\x8C(\xFD_\x9B\xA7\xBAeP\"a\x01`\x82\x01QR\x7F\x03>\x19Z\x9E\xA3\xA9\xCE@\xB7+g:\xFBEDL\xA1\xB1_\x05C\xF4M\x10\xF5\xC6@\xA7\x80go` a\x01`\x83\x01Q\x01R\x7F\x0E\x8D\xB2\xB2\x89=\xF2=\xD6\x81y\x96\xF7_\x10\0\x9D\x99\"\x07\x93\xECsa\x01\xC0\x82\x01QR\x7F\x19\xEB\x12\xA7\x82|\r\xDFc\x83\xFE\x80l9S\xBD\x06\xB0\x8A\xAE{\xF2\xA0\x1FU\xC9\x86\xA8OP\xCC(` a\x01\xC0\x83\x01Q\x01R\x7F\x01V\x910\x88F\xE6\x8E\xA8V\xA2\xCB$\xC9\x90?\x0C\x86\x05\xDE\xA1\x90\x82\x91\x80\xFFk\xDD\x1Ce\x08\x03a\x01\xE0\x82\x01QR\x7F\x1F\xFDx\x9B\x15[\x8A\xCB\x13\xE0\xF6\xA4\x8BP\xF7\xAA\x80\x92T\x08\x88\xD0\t\x14\x10W\xD4V\x90\x91X$` a\x01\xE0\x83\x01Q\x01R\x7F\x05E\xACz\xA6m\xCF7\x19\x98\x848\xC8\x06\xFCbM\xE5z\xB4?\x85\x809/\x88\xC8l\x13x\xCEJa\x02\0\x82\x01QR\x7F\x16\xB7\xF2P\x84.\xCFN6\x90pj\x1E\x15-zW\xF7\x0FUo\x92\x07m\xA7\x85\xFD\xD3c\xC1\x9F\xCF` a\x02\0\x83\x01Q\x01R\x7F \xCB\x7F\xF3Z\x83\xA7\xDC1@6\xE4p\xF1L0\xFB\x0E\x98\xD3]f;$;\",\xAAo\xC7\xDBDa\x02 \x82\x01QR\x7F\x14\x9FAWDpth\xBD\xAAN\x85E \x1A\xB4\r\x191\xA7\xD3\x1F#v\x8F\xA7\xC6Ut\xEE>\xAB` a\x02 \x83\x01Q\x01R\x7F\n%\xC1\xB7W9\x06\xDCN\x19;N\xA8/\xD1\xFE|\xCE\xBCM\x92]\xAD&\xF0\xFF\t\xC8L\x9F\x1Aua\x02@\x82\x01QR\x7F\nR\x1F\xF3\x0C\x8F6fy\x8F\x84|]L7\x96X\xFB\xA1\x01V\xE7\xA9I\x9F'\x13\xFA\xE9\xBF+\xE1` a\x02@\x83\x01Q\x01R\x7F\x03\xDBe\x10\xC3\xF16)\xFD\xED\x9AZ-AeK\xBC\xE4\xEFm\x02L\xADS\x10\0Q\xD4\xA3\xF3\xEB\xC9a\x02`\x82\x01QR\x7F\x08\xE8\n\\\x8EL\x9B\x9F&\xF3\0<\xC5\x94\x03\xA1\x8D16\xAF\xD00\x86\x8D%\xCC\x8B\x80~*\xB3p` a\x02`\x83\x01Q\x01R\x90V[`\0a\"]\x82a#\xC0V[a\"\x80\x83`\0\x81Q\x81\x10a\"sWa\"saY\xEAV[` \x02` \x01\x01Qa\x12;V[a\"\x96\x83`\x01\x81Q\x81\x10a\"sWa\"saY\xEAV[a\"\xAC\x83`\x02\x81Q\x81\x10a\"sWa\"saY\xEAV[a\"\xC2\x83`\x03\x81Q\x81\x10a\"sWa\"saY\xEAV[a\"\xD8\x83`\x04\x81Q\x81\x10a\"sWa\"saY\xEAV[a\"\xEE\x83`\x05\x81Q\x81\x10a\"sWa\"saY\xEAV[a#\x04\x83`\x06\x81Q\x81\x10a\"sWa\"saY\xEAV[a#\x1A\x83`\x07\x81Q\x81\x10a\"sWa\"saY\xEAV[`\0a#'\x85\x85\x85a$\xF8V[\x90Pa#2\x81a&BV[\x91PP[\x93\x92PPPV[a#F\x82a*\xA1V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a#\x8BWa\x17b\x82\x82a*\xFDV[a\x08\xCBa+sV[a#\x9Ba+\x92V[a\r\xAEW`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x11\xD3a#\x93V[\x80Qa#\xCB\x90a+\xACV[a#\xD8\x81` \x01Qa+\xACV[a#\xE5\x81`@\x01Qa+\xACV[a#\xF2\x81``\x01Qa+\xACV[a#\xFF\x81`\x80\x01Qa+\xACV[a$\x0C\x81`\xA0\x01Qa+\xACV[a$\x19\x81`\xC0\x01Qa+\xACV[a$&\x81`\xE0\x01Qa+\xACV[a$4\x81a\x01\0\x01Qa+\xACV[a$B\x81a\x01 \x01Qa+\xACV[a$P\x81a\x01@\x01Qa+\xACV[a$^\x81a\x01`\x01Qa+\xACV[a$l\x81a\x01\x80\x01Qa+\xACV[a$z\x81a\x01\xA0\x01Qa\x12;V[a$\x88\x81a\x01\xC0\x01Qa\x12;V[a$\x96\x81a\x01\xE0\x01Qa\x12;V[a$\xA4\x81a\x02\0\x01Qa\x12;V[a$\xB2\x81a\x02 \x01Qa\x12;V[a$\xC0\x81a\x02@\x01Qa\x12;V[a$\xCE\x81a\x02`\x01Qa\x12;V[a$\xDC\x81a\x02\x80\x01Qa\x12;V[a$\xEA\x81a\x02\xA0\x01Qa\x12;V[a\x12\x06\x81a\x02\xC0\x01Qa\x12;V[a%\0aR\x0FV[\x83` \x01Q\x83Q\x14a%%W`@Qc \xFA\x9D\x89`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a%2\x85\x85\x85a,:V[\x90P`\0a%C\x86`\0\x01Qa/YV[\x90P`\0a%V\x82\x84`\xA0\x01Q\x88a3$V[`@\x80Q`\x1E\x80\x82Ra\x03\xE0\x82\x01\x90\x92R\x91\x92P`\0\x91\x90` \x82\x01a\x03\xC0\x806\x837PP`@\x80Q`\x1E\x80\x82Ra\x03\xE0\x82\x01\x90\x92R\x92\x93P`\0\x92\x91P` \x82\x01[a%\xA1aRIV[\x81R` \x01\x90`\x01\x90\x03\x90\x81a%\x99W\x90PP\x90P`\0a%\xC6\x8A\x85\x8A\x89\x87\x87a3\x84V[`\xA0\x87\x01Q``\x87\x01Q\x91\x92P\x90`\0\x80Q` a^U\x839\x81Q\x91R`\0\x81\x83\x85\t`@\x80Qa\x01\0\x81\x01\x82R`\xE0\x9C\x8D\x01Q\x81R` \x81\x01\x96\x90\x96R\x85\x01RPPP``\x81\x01\x91\x90\x91R`\x80\x81\x01\x92\x90\x92R`\xA0\x82\x01Ra\x01`\x86\x01Q`\xC0\x82\x01Ra\x01\x80\x90\x95\x01Q\x92\x85\x01\x92\x90\x92RP\x91\x94\x93PPPPV[`\0`\0\x80Q` a^U\x839\x81Q\x91Ra&[aRIV[a&caRIV[`@\x80Q`\x02\x80\x82R``\x82\x01\x83R`\0\x92` \x83\x01\x90\x806\x837PP`@\x80Q`\x02\x80\x82R``\x82\x01\x90\x92R\x92\x93P`\0\x92\x91P` \x82\x01[a&\xA5aRIV[\x81R` \x01\x90`\x01\x90\x03\x90\x81a&\x9DW\x90PP\x90P`\0`\x01\x90P\x80\x83`\0\x81Q\x81\x10a&\xD4Wa&\xD4aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x87`\xC0\x01Q\x82`\0\x81Q\x81\x10a&\xF8Wa&\xF8aY\xEAV[` \x02` \x01\x01\x81\x90RP\x87`\0\x01Q\x83`\x01\x81Q\x81\x10a'\x1BWa'\x1BaY\xEAV[` \x02` \x01\x01\x81\x81RPP\x87`\xE0\x01Q\x82`\x01\x81Q\x81\x10a'?Wa'?aY\xEAV[` \x02` \x01\x01\x81\x90RPa'T\x82\x84a3\xB9V[`\x80\x89\x01QQ\x90\x95P``\x93P\x83\x92P\x90P`\0a's\x82`\x02aZcV[a'~\x90`\x01aZcV[\x90P\x80`\x01`\x01`@\x1B\x03\x81\x11\x15a'\x98Wa'\x98aS\x0CV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a'\xC1W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x93P\x80`\x01`\x01`@\x1B\x03\x81\x11\x15a'\xDCWa'\xDCaS\x0CV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a(\x15W\x81` \x01[a(\x02aRIV[\x81R` \x01\x90`\x01\x90\x03\x90\x81a'\xFAW\x90P[P\x92PPP`\0\x80`\0[\x89`\x80\x01QQ\x81\x10\x15a(\xB9W\x89`\x80\x01Q\x81\x81Q\x81\x10a(CWa(CaY\xEAV[` \x02` \x01\x01Q\x85\x83\x81Q\x81\x10a(]Wa(]aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x89`\xA0\x01Q\x81\x81Q\x81\x10a(\x7FWa(\x7FaY\xEAV[` \x02` \x01\x01Q\x84\x83\x81Q\x81\x10a(\x99Wa(\x99aY\xEAV[` \x90\x81\x02\x91\x90\x91\x01\x01Ra(\xAF`\x01\x83aZcV[\x91P`\x01\x01a( V[P\x88` \x01Q\x84\x82\x81Q\x81\x10a(\xD1Wa(\xD1aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x88`\xC0\x01Q\x83\x82\x81Q\x81\x10a(\xF4Wa(\xF4aY\xEAV[` \x90\x81\x02\x91\x90\x91\x01\x01Ra)\n`\x01\x82aZcV[\x89Q`@\x8B\x01Q\x91\x92P\x90`\0\x89\x82\x84\t\x90P\x80\x87\x85\x81Q\x81\x10a)0Wa)0aY\xEAV[` \x02` \x01\x01\x81\x81RPPPPP\x88`\xE0\x01Q\x83\x82\x81Q\x81\x10a)VWa)VaY\xEAV[` \x90\x81\x02\x91\x90\x91\x01\x01Ra)l`\x01\x82aZcV[``\x8A\x01Q\x90\x91P\x87\x81\x84\x08\x92PPa)\x84\x82a4\xA7V[\x84\x82\x81Q\x81\x10a)\x96Wa)\x96aY\xEAV[` \x02` \x01\x01\x81\x81RPPa)\xAAa4\xD9V[\x83\x82\x81Q\x81\x10a)\xBCWa)\xBCaY\xEAV[` \x02` \x01\x01\x81\x90RPa)\xD9a)\xD4\x84\x86a3\xB9V[a4\xFAV[\x94PPPPP`\0`@Q\x80`\x80\x01`@R\x80\x7F\x01\x18\xC4\xD5\xB87\xBC\xC2\xBC\x89\xB5\xB3\x98\xB5\x97N\x9FYD\x07;2\x07\x8B~#\x1F\xEC\x93\x88\x83\xB0\x81R` \x01\x7F&\x0E\x01\xB2Q\xF6\xF1\xC7\xE7\xFFNX\x07\x91\xDE\xE8\xEAQ\xD8z5\x8E\x03\x8BN\xFE0\xFA\xC0\x93\x83\xC1\x81R` \x01\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U\x81R` \x01\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4\x81RP\x90Pa*\x97\x83\x82\x84a*\x92a5gV[a68V[\x96\x95PPPPPPV[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a*\xCEW\x80`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x04\x01a\n9\x91\x90aT\x87V[`\0\x80Q` a^5\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa+\x1A\x91\x90aZvV[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a+UW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a+ZV[``\x91P[P\x91P\x91Pa+j\x85\x83\x83a7\x1BV[\x95\x94PPPPPV[4\x15a\r\xAEW`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a+\x9Ca\x180V[T`\x01`@\x1B\x90\x04`\xFF\x16\x91\x90PV[`\0`\0\x80Q` a]\xD5\x839\x81Q\x91Ra+\xC6\x83a7nV[\x15a+\xD0WPPPV[\x82Q` \x84\x01Q\x82`\x03\x84\x85\x85\x86\t\x85\t\x08\x83\x82\x83\t\x14\x83\x82\x10\x84\x84\x10\x16\x16\x93PPP\x81a\x17bW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x17`$\x82\x01Rv\x10\x9B\x8C\x8DM\x0E\x88\x1A[\x9D\x98[\x1AY\x08\x11\xCCH\x1C\x1B\xDA[\x9D`J\x1B`D\x82\x01R`d\x01a\n9V[a,\x82`@Q\x80a\x01\0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`@\x80Q\x80\x82\x01\x90\x91R``\x81R`\0` \x82\x01R`\0\x80Q` a^U\x839\x81Q\x91Ra,\xB1\x82\x87\x87a7}V[\x81Q\x84Qa,\xBE\x90a;\x16V[a,\xCB\x86` \x01Qa;\x16V[a,\xD8\x87`@\x01Qa;\x16V[a,\xE5\x88``\x01Qa;\x16V[a,\xF2\x89`\x80\x01Qa;\x16V[`@Q` \x01a-\x07\x96\x95\x94\x93\x92\x91\x90aZ\x92V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra-\"\x82a;\x8BV[Pa-,\x82a;\x8BV[``\x84\x01Ra-:\x82a;\x8BV[`\x80\x84\x01R\x81Q`\xA0\x85\x01Qa-O\x90a;\x16V[`@Q` \x01a-`\x92\x91\x90a[\x11V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra-{\x82a;\x8BV[\x83R\x81Q`\xC0\x85\x01Qa-\x8D\x90a;\x16V[a-\x9A\x86`\xE0\x01Qa;\x16V[a-\xA8\x87a\x01\0\x01Qa;\x16V[a-\xB6\x88a\x01 \x01Qa;\x16V[a-\xC4\x89a\x01@\x01Qa;\x16V[`@Q` \x01a-\xD9\x96\x95\x94\x93\x92\x91\x90aZ\x92V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra-\xF4\x82a;\x8BV[`\xA0\x84\x01R\x81Qa\x01\xA0\x85\x01Qa.\n\x90a;\xEDV[a.\x18\x86a\x01\xC0\x01Qa;\xEDV[a.&\x87a\x01\xE0\x01Qa;\xEDV[a.4\x88a\x02\0\x01Qa;\xEDV[a.B\x89a\x02 \x01Qa;\xEDV[`@Q` \x01a.W\x96\x95\x94\x93\x92\x91\x90a[@V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x83Ra\x02@\x85\x01Qa.y\x90a;\xEDV[a.\x87\x86a\x02`\x01Qa;\xEDV[a.\x95\x87a\x02\x80\x01Qa;\xEDV[a.\xA3\x88a\x02\xA0\x01Qa;\xEDV[a.\xB1\x89a\x02\xC0\x01Qa;\xEDV[`@Q` \x01a.\xC6\x96\x95\x94\x93\x92\x91\x90a[@V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra.\xE1\x82a;\x8BV[`\xC0\x84\x01R\x81Qa\x01`\x85\x01Qa.\xF7\x90a;\x16V[a/\x05\x86a\x01\x80\x01Qa;\x16V[`@Q` \x01a/\x17\x93\x92\x91\x90a[|V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x82Ra/2\x82a;\x8BV[`\xE0\x84\x01R\x82Q\x81\x81\x80\t\x82\x82\x82\t` \x86\x01\x91\x90\x91R`@\x85\x01RP\x91\x95\x94PPPPPV[a/\x8B`@Q\x80`\xA0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[\x81b\x01\0\0\x03a0\x1FWP`@\x80Q`\xA0\x81\x01\x82R`\x10\x81R` \x81\x01\x92\x90\x92R\x7F0d\x1E\x0E\x92\xBE\xBE\xF8\x18&\x8Df;\xCA\xD6\xDB\xCF\xD6\xC0\x14\x91p\xF6\xD7\xD3P\xB1\xB1\xFAl\x10\x01\x90\x82\x01R~\xEE\xB2\xCBY\x81\xEDEd\x9A\xBE\xBD\xE0\x81\xDC\xFF\x16\xC8`\x1D\xE44~}\xD1b\x8B\xA2\xDA\xACC\xB7``\x82\x01R\x7F\x0B]V\xB7\x7F\xE7\x04\xE8\xE9#8\xC0\x08/7\xE0\x91\x12d\x14\xC80\xE4\xC6\x92-Z\xC8\x02\xD8B\xD4`\x80\x82\x01R\x90V[\x81b\x02\0\0\x03a0\xB4WP`@\x80Q`\xA0\x81\x01\x82R`\x11\x81R` \x81\x01\x92\x90\x92R\x7F0d6@\xB9\xF8/\x90\xE8;i\x8E^\xA6\x17\x9C|\x05T.\x85\x953\xB4\x8B\x99S\xA2\xF56\x08\x01\x90\x82\x01R\x7F\x1B\xF8-\xEB\xA7\xD7I\x02\xC3p\x8C\xC6\xE7\x0Ea\xF3\x05\x12\xEC\xA9VU!\x0E'nXX\xCE\x8FX\xE5``\x82\x01R\x7F$L\xF0\x10\xC4<\xA8r7\xD8\xB0\x0B\xF9\xDDP\xC4\xC0\x1C\x7F\x08k\xD4\xE8\xC9 \xE7RQ\xD9o\r\"`\x80\x82\x01R\x90V[\x81b\x04\0\0\x03a1IWP`@\x80Q`\xA0\x81\x01\x82R`\x12\x81R` \x81\x01\x92\x90\x92R\x7F0dBY\xCD\x94\xE7\xDDPE\xD7\xA2p\x13\xB7\xFC\xD2\x1C\x9E;\x7F\xA7R\"\xE7\xBD\xA4\x9Br\x9B\x04\x01\x90\x82\x01R\x7F\x19\xDD\xBC\xAF:\x8DF\xC1\\\x01v\xFB\xB5\xB9^M\xC5p\x88\xFF\x13\xF4\xD1\xBD\x84\xC6\xBF\xA5}\xCD\xC0\xE0``\x82\x01R\x7F\x03hS\xF0\x83x\x0E\x87\xF8\xD7\xC7\x1D\x11\x11\x19\xC5}\xBE\x11\x8C\"\xD5\xADpz\x821tf\xC5\x17L`\x80\x82\x01R\x90V[\x81b\x08\0\0\x03a1\xDEWP`@\x80Q`\xA0\x81\x01\x82R`\x13\x81R` \x81\x01\x92\x90\x92R\x7F0dHfWcD\x03\x84K\x0E\xACx\xCA\x88,\xFD(CA\xFC\xB0aZ\x15\xCF\xCD\x17\xB1M\x82\x01\x90\x82\x01R\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD``\x82\x01R\x7F\x06\xE4\x02\xC0\xA3\x14\xFBg\xA1\\\xF8\x06fJ\xE1\xB7\"\xDB\xC0\xEF\xE6nl\x81\xD9\x8F\x99$\xCASS!`\x80\x82\x01R\x90V[\x81b\x10\0\0\x03a2sWP`@\x80Q`\xA0\x81\x01\x82R`\x14\x81R` \x81\x01\x92\x90\x92R\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x90\x82\x01R\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW``\x82\x01R\x7F\x10\x0C3-!\0\x89_\xABds\xBC,Q\xBF\xCAR\x1FE\xCB;\xAC\xA6&\x08R\xA8\xFD\xE2l\x91\xF3`\x80\x82\x01R\x90V[\x81` \x03a3\x06WP`@\x80Q`\xA0\x81\x01\x82R`\x05\x81R` \x81\x01\x92\x90\x92R\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x90\x82\x01R\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0``\x82\x01R\x7F'$q6\x03\xBF\xBDy\n\xEA\xF3\xE7\xDF%\xD8\xE7\xEF\x8F1\x134\x90[M\x8C\x99\x98\x0C\xF2\x10\x97\x9D`\x80\x82\x01R\x90V[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x91\x90PV[a3H`@Q\x80``\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[a3R\x84\x84a=$V[\x80\x82Ra3b\x90\x85\x90\x85\x90a=xV[` \x82\x01R\x80Qa3x\x90\x85\x90\x84\x90\x86\x90a=\xECV[`@\x82\x01R\x93\x92PPPV[`\0\x80a3\x92\x85\x87\x89a?\xA0V[\x90Pa3\xA2\x88\x86\x89\x89\x88\x88a@\x90V[a3\xAD\x81\x87\x86aC\x9CV[\x98\x97PPPPPPPPV[a3\xC1aRIV[\x82Q\x82Q\x14a4\x12W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FMSM error: length does not match`D\x82\x01R`d\x01a\n9V[a4P\x83`\0\x81Q\x81\x10a4(Wa4(aY\xEAV[` \x02` \x01\x01Q\x83`\0\x81Q\x81\x10a4CWa4CaY\xEAV[` \x02` \x01\x01QaC\xECV[\x90P`\x01[\x82Q\x81\x10\x15a4\xA0Wa4\x96\x82a4\x91\x86\x84\x81Q\x81\x10a4wWa4waY\xEAV[` \x02` \x01\x01Q\x86\x85\x81Q\x81\x10a4CWa4CaY\xEAV[aD\x80V[\x91P`\x01\x01a4UV[P\x92\x91PPV[`\0a4\xC1`\0\x80Q` a^U\x839\x81Q\x91R\x83a[\xD5V[a\x11\xC5\x90`\0\x80Q` a^U\x839\x81Q\x91RaZ\0V[a4\xE1aRIV[P`@\x80Q\x80\x82\x01\x90\x91R`\x01\x81R`\x02` \x82\x01R\x90V[a5\x02aRIV[a5\x0B\x82a7nV[\x15a5\x14WP\x90V[`@Q\x80`@\x01`@R\x80\x83`\0\x01Q\x81R` \x01`\0\x80Q` a]\xD5\x839\x81Q\x91R\x84` \x01Qa5G\x91\x90a[\xD5V[a5_\x90`\0\x80Q` a]\xD5\x839\x81Q\x91RaZ\0V[\x90R\x92\x91PPV[a5\x92`@Q\x80`\x80\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`@Q\x80`\x80\x01`@R\x80\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x81R` \x01\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2\x81R` \x01\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA\x81R` \x01\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[\x81RP\x90P\x90V[`\0\x80`\0`@Q\x87Q\x81R` \x88\x01Q` \x82\x01R` \x87\x01Q`@\x82\x01R\x86Q``\x82\x01R``\x87\x01Q`\x80\x82\x01R`@\x87\x01Q`\xA0\x82\x01R\x85Q`\xC0\x82\x01R` \x86\x01Q`\xE0\x82\x01R` \x85\x01Qa\x01\0\x82\x01R\x84Qa\x01 \x82\x01R``\x85\x01Qa\x01@\x82\x01R`@\x85\x01Qa\x01`\x82\x01R` `\0a\x01\x80\x83`\x08Z\xFA\x91PP`\0Q\x91P\x80a7\rW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1C`$\x82\x01R{Bn254: Pairing check failed!` \x1B`D\x82\x01R`d\x01a\n9V[P\x15\x15\x90P[\x94\x93PPPPV[``\x82a70Wa7+\x82aE\x1BV[a#6V[\x81Q\x15\x80\x15a7GWP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a7gW\x83`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x04\x01a\n9\x91\x90aT\x87V[P\x80a#6V[\x80Q` \x90\x91\x01Q\x15\x90\x15\x16\x90V[\x82Q`\xFE\x90a7\xB8a7\x8E\x83a;\xEDV[`@Q` \x01a7\xA0\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R`\0`\x04aEDV[a7\xF2a7\xC8\x86`\0\x01Qa;\xEDV[`@Q` \x01a7\xDA\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R`\0`\x08aEDV[a8\x02a7\xC8\x87` \x01Qa;\xEDV[`@Q` \x01a8\x15\x94\x93\x92\x91\x90a[\xF7V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x85Ra82`\x01a;\xEDV[a8I`\0\x80Q` a^\xF5\x839\x81Q\x91Ra;\xEDV[a8``\0\x80Q` a^\x95\x839\x81Q\x91Ra;\xEDV[a8w`\0\x80Q` a^\xD5\x839\x81Q\x91Ra;\xEDV[a8\x8E`\0\x80Q` a^\x15\x839\x81Q\x91Ra;\xEDV[`@Q` \x01a8\xA3\x96\x95\x94\x93\x92\x91\x90a[@V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x85R`\xE0\x84\x01Qa8\xC4\x90a;\x16V[a8\xD2\x85a\x01\0\x01Qa;\x16V[a8\xE0\x86a\x01 \x01Qa;\x16V[a8\xEE\x87a\x01@\x01Qa;\x16V[a8\xFC\x88a\x01`\x01Qa;\x16V[a9\n\x89a\x01\x80\x01Qa;\x16V[a9\x18\x8Aa\x01\xE0\x01Qa;\x16V[`@Q` \x01a9/\x98\x97\x96\x95\x94\x93\x92\x91\x90a\\NV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x85Ra\x02\0\x84\x01Qa9Q\x90a;\x16V[a9_\x85a\x02 \x01Qa;\x16V[a9m\x86a\x02@\x01Qa;\x16V[a9{\x87a\x01\xA0\x01Qa;\x16V[a9\x89\x88a\x01\xC0\x01Qa;\x16V[a9\x97\x89a\x02`\x01Qa;\x16V[`@Q` \x01a9\xAD\x97\x96\x95\x94\x93\x92\x91\x90a\\\xF3V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x81R\x81\x86R\x84\x01Qa9\xCC\x90a;\x16V[a9\xD9\x85``\x01Qa;\x16V[a9\xE6\x86`\x80\x01Qa;\x16V[a9\xF3\x87`\xA0\x01Qa;\x16V[a:\0\x88`\xC0\x01Qa;\x16V[`@Q` \x01a:\x15\x96\x95\x94\x93\x92\x91\x90aZ\x92V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x80\x85R\x82Qa:L\x90\x84\x90`\0\x90a:?Wa:?aY\xEAV[` \x02` \x01\x01Qa;\xEDV[a:b\x84`\x01\x81Q\x81\x10a:?Wa:?aY\xEAV[a:x\x85`\x02\x81Q\x81\x10a:?Wa:?aY\xEAV[a:\x8E\x86`\x03\x81Q\x81\x10a:?Wa:?aY\xEAV[a:\xA4\x87`\x04\x81Q\x81\x10a:?Wa:?aY\xEAV[a:\xBA\x88`\x05\x81Q\x81\x10a:?Wa:?aY\xEAV[a:\xD0\x89`\x06\x81Q\x81\x10a:?Wa:?aY\xEAV[a:\xE6\x8A`\x07\x81Q\x81\x10a:?Wa:?aY\xEAV[`@Q` \x01a:\xFE\x99\x98\x97\x96\x95\x94\x93\x92\x91\x90a]\x85V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x90\x93RPPPV[```\0a;#\x83a7nV[\x15a;/W`\x01`\xFE\x1B\x17[` \x83\x01Q`\0\x80Q` a]\xD5\x839\x81Q\x91R`\x01\x91\x90\x91\x1B\x10a;UWP`\x01`\xFF\x1B[\x82Qa;b\x90\x82\x17a;\xEDV[`@Q` \x01a;t\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91PP\x91\x90PV[` \x80\x82\x01Q\x82Q\x80Q`@Q\x83\x81R`\0\x94\x85\x94\x93\x92\x91\x90\x81\x01\x85[\x83\x81\x10\x15a;\xC2W` \x81\x86\x01\x81\x01Q\x83\x83\x01R\x01a;\xA8V[PP` \x91\x82\x01\x90 \x90\x86\x01\x81\x90R\x92P`\0a*\x97`\0\x80Q` a^U\x839\x81Q\x91R\x85a[\xD5V[`\0\x81\x90P`\x08\x81~\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\x16\x90\x1B`\x08\x82\x7F\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\x16\x90\x1C\x17\x90P`\x10\x81}\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\x16\x90\x1B`\x10\x82}\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\x19\x16\x90\x1C\x17\x90P` \x81{\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\x16\x90\x1B` \x82{\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\x19\x16\x90\x1C\x17\x90P`@\x81`\x01`\x01`@\x1B\x03`\x01`\x80\x1B\x03`\x01`\xC0\x1B\x03\x16\x90\x1B`@\x82`\x01`\x01`@\x1B\x03`\x01`\x80\x1B\x03`\x01`\xC0\x1B\x03\x19\x16\x90\x1C\x17\x90P`\x80\x81\x90\x1B`\x80\x82\x90\x1C\x17\x90P\x91\x90PV[\x81Q`\0\x90`\0\x80Q` a^U\x839\x81Q\x91R\x90\x83\x80\x15a=hW\x84\x93P`\0[\x82\x81\x10\x15a=\\W\x83\x85\x86\t\x94P`\x01\x01a=FV[P`\x01\x84\x03\x93Pa=oV[`\x01\x83\x03\x93P[PPP\x92\x91PPV[`\0\x82`\x01\x03a=\x8AWP`\x01a#6V[\x81`\0\x03a=\x9AWP`\0a#6V[`@\x84\x01Q`\0\x80Q` a^U\x839\x81Q\x91R\x90`\0\x90\x82\x81\x86\t\x90P\x85\x80\x15a=\xCAW`\x01\x87\x03\x92Pa=\xD1V[`\x01\x84\x03\x92P[Pa=\xDB\x82aFQV[\x91P\x82\x82\x82\t\x97\x96PPPPPPPV[\x82Q`\0\x90`\0\x80Q` a^U\x839\x81Q\x91R\x90\x83\x83\x03a>mW`\x01`\0[\x82\x81\x10\x15a>`W\x81\x87\x03a>AW\x87\x81\x81Q\x81\x10a>.Wa>.aY\xEAV[` \x02` \x01\x01Q\x94PPPPPa7\x13V[\x83\x80a>OWa>Oa[\xBFV[\x89``\x01Q\x83\t\x91P`\x01\x01a>\rV[P`\0\x93PPPPa7\x13V[`\0\x80`\0\x80\x8A`@\x01Q\x90P`\0\x80a>\x87\x8D\x88aF\xF7V[\x90P`\0\x87`\x01`\x01`@\x1B\x03\x81\x11\x15a>\xA3Wa>\xA3aS\x0CV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a>\xCCW\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x90P\x88\x8B\x85\t\x93P`\x01\x92P`\0[\x88\x81\x10\x15a?\x11W` \x81\x02` \x84\x01\x01Q\x95P\x89\x8D\x87\x8C\x03\x08\x96P\x89\x87\x85\t` \x82\x81\x02\x84\x01\x01\x88\x90R\x93P`\x01\x01a>\xDCV[Pa?\x1B\x83aFQV[\x92P`\0[\x88\x81\x10\x15a?\x8EW` \x81\x02` \x84\x01\x01Q\x95P\x89\x86\x86\t\x97P\x89\x84\x89\t\x97P`\0[\x89\x81\x10\x15a?mW\x80\x82\x14a?eW` \x81\x02` \x84\x01\x01Q\x97P\x8A\x88\x8A\t\x98P[`\x01\x01a?CV[P` \x81\x02` \x8F\x01\x01Q\x95P\x89\x86\x89\t\x97P\x89\x88\x8C\x08\x9AP`\x01\x01a? V[PPPPPPPPPP\x94\x93PPPPV[`\0\x80`\0\x80Q` a^U\x839\x81Q\x91R\x90P`\0\x83` \x01Q\x90P`\0\x84`@\x01Q\x90P`\0`\x01\x90P``\x88\x01Q`\x80\x89\x01Qa\x01\xA0\x89\x01Qa\x02@\x8A\x01Q\x87\x88\x89\x83\x87\t\x8A\x86\x86\x08\x08\x86\t\x94PPPa\x01\xC0\x89\x01Qa\x02`\x8A\x01Q\x87\x88\x89\x83\x87\t\x8A\x86\x86\x08\x08\x86\t\x94PPPa\x01\xE0\x89\x01Qa\x02\x80\x8A\x01Q\x87\x88\x89\x83\x87\t\x8A\x86\x86\x08\x08\x86\t\x94PPPa\x02\0\x89\x01Qa\x02\xA0\x8A\x01Q\x87\x88\x89\x83\x87\t\x8A\x86\x86\x08\x08\x86\t\x94PPPa\x02 \x89\x01Q\x91Pa\x02\xC0\x89\x01Q\x86\x87\x82\x89\x85\x87\x08\t\x85\t\x93PPPP\x87Q` \x89\x01Q\x85\x86\x86\x83\t\x87\x03\x85\x08\x96PP\x84\x85\x83\x83\t\x86\x03\x87\x08\x99\x98PPPPPPPPPV[a@\x9E\x86\x86\x86\x86\x85\x87aG\xBCV[`\xC0\x85\x01Q\x82Q`\0\x80Q` a^U\x839\x81Q\x91R\x91\x90\x81\x90\x81\x90\x86\x90`\x14\x90\x81\x10a@\xCDWa@\xCDaY\xEAV[` \x02` \x01\x01\x81\x81RPP\x85`\0\x01Q\x84`\x14\x81Q\x81\x10a@\xF1Wa@\xF1aY\xEAV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x15\x81Q\x81\x10aA\x16WaA\x16aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x85` \x01Q\x84`\x15\x81Q\x81\x10aA:WaA:aY\xEAV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x16\x81Q\x81\x10aA_WaA_aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x85`@\x01Q\x84`\x16\x81Q\x81\x10aA\x83WaA\x83aY\xEAV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x17\x81Q\x81\x10aA\xA8WaA\xA8aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x85``\x01Q\x84`\x17\x81Q\x81\x10aA\xCCWaA\xCCaY\xEAV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x18\x81Q\x81\x10aA\xF1WaA\xF1aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x85`\x80\x01Q\x84`\x18\x81Q\x81\x10aB\x15WaB\x15aY\xEAV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x19\x81Q\x81\x10aB:WaB:aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x88`@\x01Q\x84`\x19\x81Q\x81\x10aB^WaB^aY\xEAV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1A\x81Q\x81\x10aB\x83WaB\x83aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x88``\x01Q\x84`\x1A\x81Q\x81\x10aB\xA7WaB\xA7aY\xEAV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1B\x81Q\x81\x10aB\xCCWaB\xCCaY\xEAV[` \x02` \x01\x01\x81\x81RPP\x88`\x80\x01Q\x84`\x1B\x81Q\x81\x10aB\xF0WaB\xF0aY\xEAV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x80\x85`\x1C\x81Q\x81\x10aC\x15WaC\x15aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x88`\xA0\x01Q\x84`\x1C\x81Q\x81\x10aC9WaC9aY\xEAV[` \x02` \x01\x01\x81\x90RP\x82\x82\x82\t\x90P\x87`\xE0\x01Q\x85`\x1D\x81Q\x81\x10aCbWaCbaY\xEAV[` \x02` \x01\x01\x81\x81RPP\x85`\xA0\x01Q\x84`\x1D\x81Q\x81\x10aC\x86WaC\x86aY\xEAV[` \x02` \x01\x01\x81\x90RPPPPPPPPPPV[`\0\x80Q` a^U\x839\x81Q\x91R\x83\x81\x03\x90`\0[`\n\x81\x10\x15aC\xE3W` `\x15\x82\x01\x02\x84\x01Q` \x82\x02a\x01\xA0\x01\x86\x01Q\x83\x84\x82\x84\t\x86\x08\x94PPP`\x01\x01aC\xB2V[PP\x93\x92PPPV[aC\xF4aRIV[aC\xFCaRcV[\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R`@\x81\x01\x83\x90R`\0``\x83`\x80\x84`\x07a\x07\xD0Z\x03\xFA\x90P\x80\x80aD.W`\0\x80\xFD[P\x80aDxW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x19`$\x82\x01RxBn254: scalar mul failed!`8\x1B`D\x82\x01R`d\x01a\n9V[PP\x92\x91PPV[aD\x88aRIV[aD\x90aR\x81V[\x83Q\x81R` \x80\x85\x01Q\x81\x83\x01R\x83Q`@\x83\x01R\x83\x01Q``\x80\x83\x01\x91\x90\x91R`\0\x90\x83`\xC0\x84`\x06a\x07\xD0Z\x03\xFA\x90P\x80\x80aD\xCDW`\0\x80\xFD[P\x80aDxW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: group addition failed!\0\0\0`D\x82\x01R`d\x01a\n9V[\x80Q\x15aE+W\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x81aER\x81`\x1FaZcV[\x10\x15aE\x91W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0E`$\x82\x01Rmslice_overflow`\x90\x1B`D\x82\x01R`d\x01a\n9V[aE\x9B\x82\x84aZcV[\x84Q\x10\x15aE\xDFW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x11`$\x82\x01Rpslice_outOfBounds`x\x1B`D\x82\x01R`d\x01a\n9V[``\x82\x15\x80\x15aE\xFEW`@Q\x91P`\0\x82R` \x82\x01`@RaFHV[`@Q\x91P`\x1F\x84\x16\x80\x15` \x02\x81\x84\x01\x01\x85\x81\x01\x87\x83\x15` \x02\x84\x8B\x01\x01\x01[\x81\x83\x10\x15aF7W\x80Q\x83R` \x92\x83\x01\x92\x01aF\x1FV[PP\x85\x84R`\x1F\x01`\x1F\x19\x16`@RP[P\x94\x93PPPPV[`\0\x80`\0`\0\x80Q` a^U\x839\x81Q\x91R\x90P`@Q` \x81R` \x80\x82\x01R` `@\x82\x01R\x84``\x82\x01R`\x02\x82\x03`\x80\x82\x01R\x81`\xA0\x82\x01R` `\0`\xC0\x83`\x05Z\xFA\x92PP`\0Q\x92P\x81aF\xF0W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: pow precompile failed!\0\0\0`D\x82\x01R`d\x01a\n9V[PP\x91\x90PV[``\x82` \x01Q\x82\x11\x15aG\x1EW`@Qc\x8C^\x11\xF1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x83\x01Q`\x01`\0\x80Q` a^U\x839\x81Q\x91R\x84`\x01`\x01`@\x1B\x03\x81\x11\x15aGLWaGLaS\x0CV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15aGuW\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x93P\x84\x15\x19\x15a=oW` \x84\x01\x85` \x02\x81\x01`\x01\x82R` \x82\x01\x91P[\x80\x82\x10\x15aG\xB1W\x82\x85\x85\t\x93P\x83\x82R` \x82\x01\x91PaG\x95V[PPPPP\x92\x91PPV[`\0\x80`\0\x80`\0\x80`\0\x80Q` a^U\x839\x81Q\x91R\x90P\x80` \x8B\x01Q` \x8D\x01Q\t\x95P\x8AQ\x93P\x80`\xA0\x8C\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xA0\x8A\x01Q\x84\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80`\0\x80Q` a^\xF5\x839\x81Q\x91R\x84\t\x91P\x80a\x01\xC0\x8A\x01Q\x83\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80`\0\x80Q` a^\x95\x839\x81Q\x91R\x84\t\x91P\x80a\x01\xE0\x8A\x01Q\x83\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80`\0\x80Q` a^\xD5\x839\x81Q\x91R\x84\t\x91P\x80a\x02\0\x8A\x01Q\x83\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80`\0\x80Q` a^\x15\x839\x81Q\x91R\x84\t\x91P\x80a\x02 \x8A\x01Q\x83\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80\x84\x87\x08\x95P\x88`\xA0\x01Q\x88`\0\x81Q\x81\x10aH\xEBWaH\xEBaY\xEAV[` \x02` \x01\x01\x81\x90RP\x85\x87`\0\x81Q\x81\x10aI\nWaI\naY\xEAV[` \x02` \x01\x01\x81\x81RPP\x80``\x8C\x01Q\x8CQ\t\x94P\x80a\x02\xC0\x8A\x01Q\x86\t\x94P\x80a\x02@\x8A\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xA0\x8A\x01Q\x84\x08\x92P\x80`\x80\x8C\x01Q\x84\x08\x92P\x80\x83\x86\t\x94P\x80a\x02`\x8A\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xC0\x8A\x01Q\x84\x08\x92P\x80`\x80\x8C\x01Q\x84\x08\x92P\x80\x83\x86\t\x94P\x80a\x02\x80\x8A\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xE0\x8A\x01Q\x84\x08\x92P\x80`\x80\x8C\x01Q\x84\x08\x92P\x80\x83\x86\t\x94P\x80a\x02\xA0\x8A\x01Q``\x8D\x01Q\t\x92P\x80a\x02\0\x8A\x01Q\x84\x08\x92P\x80`\x80\x8C\x01Q\x84\x08\x92P\x80\x83\x86\t\x94P\x8B`\xC0\x01Q\x88`\x01\x81Q\x81\x10aI\xECWaI\xECaY\xEAV[` \x90\x81\x02\x91\x90\x91\x01\x01RaJ\x01\x85\x82aZ\0V[\x87`\x01\x81Q\x81\x10aJ\x14WaJ\x14aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x88a\x01\xA0\x01Q\x87`\x02\x81Q\x81\x10aJ9WaJ9aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x88a\x01\xC0\x01Q\x87`\x03\x81Q\x81\x10aJ^WaJ^aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x88a\x01\xE0\x01Q\x87`\x04\x81Q\x81\x10aJ\x83WaJ\x83aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x88a\x02\0\x01Q\x87`\x05\x81Q\x81\x10aJ\xA8WaJ\xA8aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x8B`\xE0\x01Q\x88`\x02\x81Q\x81\x10aJ\xCCWaJ\xCCaY\xEAV[` \x02` \x01\x01\x81\x90RP\x8Ba\x01\0\x01Q\x88`\x03\x81Q\x81\x10aJ\xF0WaJ\xF0aY\xEAV[` \x02` \x01\x01\x81\x90RP\x8Ba\x01 \x01Q\x88`\x04\x81Q\x81\x10aK\x14WaK\x14aY\xEAV[` \x02` \x01\x01\x81\x90RP\x8Ba\x01@\x01Q\x88`\x05\x81Q\x81\x10aK8WaK8aY\xEAV[` \x02` \x01\x01\x81\x90RP\x80a\x01\xC0\x8A\x01Qa\x01\xA0\x8B\x01Q\t\x92P\x82\x87`\x06\x81Q\x81\x10aKgWaKgaY\xEAV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01`\x01Q\x88`\x06\x81Q\x81\x10aK\x8CWaK\x8CaY\xEAV[` \x02` \x01\x01\x81\x90RP\x80a\x02\0\x8A\x01Qa\x01\xE0\x8B\x01Q\t\x92P\x82\x87`\x07\x81Q\x81\x10aK\xBBWaK\xBBaY\xEAV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01\x80\x01Q\x88`\x07\x81Q\x81\x10aK\xE0WaK\xE0aY\xEAV[` \x02` \x01\x01\x81\x90RPa\x01\xA0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\x08\x81Q\x81\x10aL\x19WaL\x19aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01\xE0\x01Q\x88`\x08\x81Q\x81\x10aL>WaL>aY\xEAV[` \x02` \x01\x01\x81\x90RPa\x01\xC0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\t\x81Q\x81\x10aLwWaLwaY\xEAV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x02\0\x01Q\x88`\t\x81Q\x81\x10aL\x9CWaL\x9CaY\xEAV[` \x02` \x01\x01\x81\x90RPa\x01\xE0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\n\x81Q\x81\x10aL\xD5WaL\xD5aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x02 \x01Q\x88`\n\x81Q\x81\x10aL\xFAWaL\xFAaY\xEAV[` \x02` \x01\x01\x81\x90RPa\x02\0\x89\x01Q\x92P\x80\x83\x84\t\x91P\x80\x82\x83\t\x91P\x80\x82\x84\t\x92P\x82\x87`\x0B\x81Q\x81\x10aM3WaM3aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x02@\x01Q\x88`\x0B\x81Q\x81\x10aMXWaMXaY\xEAV[` \x02` \x01\x01\x81\x90RP\x88a\x02 \x01Q\x81aMt\x91\x90aZ\0V[\x87`\x0C\x81Q\x81\x10aM\x87WaM\x87aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01\xA0\x01Q\x88`\x0C\x81Q\x81\x10aM\xACWaM\xACaY\xEAV[` \x02` \x01\x01\x81\x90RP`\x01\x87`\r\x81Q\x81\x10aM\xCCWaM\xCCaY\xEAV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x01\xC0\x01Q\x88`\r\x81Q\x81\x10aM\xF1WaM\xF1aY\xEAV[` \x02` \x01\x01\x81\x90RP\x80a\x01\xC0\x8A\x01Qa\x01\xA0\x8B\x01Q\t\x92P\x80a\x01\xE0\x8A\x01Q\x84\t\x92P\x80a\x02\0\x8A\x01Q\x84\t\x92P\x80a\x02 \x8A\x01Q\x84\t\x92P\x82\x87`\x0E\x81Q\x81\x10aNAWaNAaY\xEAV[` \x02` \x01\x01\x81\x81RPP\x8Ba\x02`\x01Q\x88`\x0E\x81Q\x81\x10aNfWaNfaY\xEAV[` \x90\x81\x02\x91\x90\x91\x01\x01R\x89QaN}\x90\x82aZ\0V[\x87`\x0F\x81Q\x81\x10aN\x90WaN\x90aY\xEAV[` \x02` \x01\x01\x81\x81RPP\x88`\xC0\x01Q\x88`\x0F\x81Q\x81\x10aN\xB4WaN\xB4aY\xEAV[` \x02` \x01\x01\x81\x90RP\x80`\x01\x8BQ\x08`\xA0\x8C\x01Q\x90\x93P\x81\x90\x80\t\x91P\x80\x82\x84\t\x92P\x80\x83` `\x10\x02\x89\x01Q\t\x91P\x81\x87`\x10\x81Q\x81\x10aN\xFAWaN\xFAaY\xEAV[` \x02` \x01\x01\x81\x81RPP\x88`\xE0\x01Q\x88`\x10\x81Q\x81\x10aO\x1EWaO\x1EaY\xEAV[` \x02` \x01\x01\x81\x90RP\x80\x83` `\x11\x02\x89\x01Q\t\x91P\x81\x87`\x11\x81Q\x81\x10aOJWaOJaY\xEAV[` \x02` \x01\x01\x81\x81RPP\x88a\x01\0\x01Q\x88`\x11\x81Q\x81\x10aOoWaOoaY\xEAV[` \x02` \x01\x01\x81\x90RP\x80\x83` `\x12\x02\x89\x01Q\t\x91P\x81\x87`\x12\x81Q\x81\x10aO\x9BWaO\x9BaY\xEAV[` \x02` \x01\x01\x81\x81RPP\x88a\x01 \x01Q\x88`\x12\x81Q\x81\x10aO\xC0WaO\xC0aY\xEAV[` \x02` \x01\x01\x81\x90RP\x80\x83` `\x13\x02\x89\x01Q\t\x91P\x81\x87`\x13\x81Q\x81\x10aO\xECWaO\xECaY\xEAV[` \x02` \x01\x01\x81\x81RPP\x88a\x01@\x01Q\x88`\x13\x81Q\x81\x10aP\x11WaP\x11aY\xEAV[` \x02` \x01\x01\x81\x90RPPPPPPPPPPPPPV[P\x80T`\0\x82U\x90`\0R` `\0 \x90\x81\x01\x90a\x12\x06\x91\x90aR\x9FV[\x82\x80T\x82\x82U\x90`\0R` `\0 \x90\x81\x01\x92\x82\x15aP\x83W\x91` \x02\x82\x01[\x82\x81\x11\x15aP\x83W\x82Q\x82U\x91` \x01\x91\x90`\x01\x01\x90aPhV[PaP\x8F\x92\x91PaR\x9FV[P\x90V[`@Q\x80a\x01\0\x01`@R\x80`\0`\x01`\x01`@\x1B\x03\x16\x81R` \x01`\0`\x01`\x01`@\x1B\x03\x16\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[P\x80T`\0\x82U`\x02\x02\x90`\0R` `\0 \x90\x81\x01\x90a\x12\x06\x91\x90aR\xB4V[`@Q\x80a\x02\x80\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01aQ-aRIV[\x81R` \x01aQ:aRIV[\x81R` \x01aQGaRIV[\x81R` \x01aQTaRIV[\x81R` \x01aQaaRIV[\x81R` \x01aQnaRIV[\x81R` \x01aQ{aRIV[\x81R` \x01aQ\x88aRIV[\x81R` \x01aQ\x95aRIV[\x81R` \x01aQ\xA2aRIV[\x81R` \x01aQ\xAFaRIV[\x81R` \x01aQ\xBCaRIV[\x81R` \x01aQ\xC9aRIV[\x81R` \x01aQ\xD6aRIV[\x81R` \x01aQ\xE3aRIV[\x81R` \x01aQ\xF0aRIV[\x81R` \x01aQ\xFDaRIV[\x81R` \x01aR\naRIV[\x90R\x90V[`@Q\x80a\x01\0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01``\x81R` \x01``\x81R` \x01aQ\xFD[`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[`@Q\x80``\x01`@R\x80`\x03\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[`@Q\x80`\x80\x01`@R\x80`\x04\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[[\x80\x82\x11\x15aP\x8FW`\0\x81U`\x01\x01aR\xA0V[[\x80\x82\x11\x15aP\x8FW\x80T`\x01`\x01`@\x1B\x03\x19\x16\x81U`\0`\x01\x82\x01U`\x02\x01aR\xB5V[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a3\x1FW`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15aS\x03W`\0\x80\xFD[a\x11\xC2\x82aR\xDAV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@\x80Q\x90\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15aSDWaSDaS\x0CV[`@R\x90V[`@Qa\x02\xE0\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15aSDWaSDaS\x0CV[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15aS\x95WaS\x95aS\x0CV[`@R\x91\x90PV[\x805`\x01`\x01`@\x1B\x03\x81\x16\x81\x14a3\x1FW`\0\x80\xFD[`\0a\x01\0\x80\x83\x85\x03\x12\x15aS\xC8W`\0\x80\xFD[`@Q\x90\x81\x01\x90`\x01`\x01`@\x1B\x03\x82\x11\x81\x83\x10\x17\x15aS\xEAWaS\xEAaS\x0CV[\x81`@R\x80\x92PaS\xFA\x84aS\x9DV[\x81RaT\x08` \x85\x01aS\x9DV[` \x82\x01R`@\x84\x015`@\x82\x01R``\x84\x015``\x82\x01R`\x80\x84\x015`\x80\x82\x01R`\xA0\x84\x015`\xA0\x82\x01R`\xC0\x84\x015`\xC0\x82\x01R`\xE0\x84\x015`\xE0\x82\x01RPP\x92\x91PPV[`\0a\x01\0\x82\x84\x03\x12\x15aTdW`\0\x80\xFD[a\x11\xC2\x83\x83aS\xB4V[`\0` \x82\x84\x03\x12\x15aT\x80W`\0\x80\xFD[P5\x91\x90PV[`\x01`\x01`\xA0\x1B\x03\x91\x90\x91\x16\x81R` \x01\x90V[`\0`\x01`\x01`@\x1B\x03\x82\x11\x15aT\xB4WaT\xB4aS\x0CV[P`\x05\x1B` \x01\x90V[`\0` \x80\x83\x85\x03\x12\x15aT\xD1W`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x81\x11\x15aT\xE7W`\0\x80\xFD[\x83\x01`\x1F\x81\x01\x85\x13aT\xF8W`\0\x80\xFD[\x805aU\x0BaU\x06\x82aT\x9BV[aSmV[\x81\x81R`\x05\x91\x90\x91\x1B\x82\x01\x83\x01\x90\x83\x81\x01\x90\x87\x83\x11\x15aU*W`\0\x80\xFD[\x92\x84\x01\x92[\x82\x84\x10\x15aUHW\x835\x82R\x92\x84\x01\x92\x90\x84\x01\x90aU/V[\x97\x96PPPPPPPV[`\0` \x82\x84\x03\x12\x15aUeW`\0\x80\xFD[a\x11\xC2\x82aS\x9DV[`\0`@\x82\x84\x03\x12\x15aU\x80W`\0\x80\xFD[aU\x88aS\"V[\x90P\x815\x81R` \x82\x015` \x82\x01R\x92\x91PPV[`\0\x80\x82\x84\x03a\x05\x80\x81\x12\x15aU\xB3W`\0\x80\xFD[aU\xBD\x85\x85aS\xB4V[\x92Pa\x01\0a\x04\x80\x80`\xFF\x19\x84\x01\x12\x15aU\xD6W`\0\x80\xFD[aU\xDEaSJV[\x92PaU\xEC\x87\x83\x88\x01aUnV[\x83Ra\x01@aU\xFD\x88\x82\x89\x01aUnV[` \x85\x01Ra\x01\x80aV\x11\x89\x82\x8A\x01aUnV[`@\x86\x01Ra\x01\xC0aV%\x8A\x82\x8B\x01aUnV[``\x87\x01Ra\x02\0aV9\x8B\x82\x8C\x01aUnV[`\x80\x88\x01Ra\x02@aVM\x8C\x82\x8D\x01aUnV[`\xA0\x89\x01Ra\x02\x80aVa\x8D\x82\x8E\x01aUnV[`\xC0\x8A\x01Ra\x02\xC0aVu\x8E\x82\x8F\x01aUnV[`\xE0\x8B\x01RaV\x88\x8Ea\x03\0\x8F\x01aUnV[\x89\x8B\x01RaV\x9A\x8Ea\x03@\x8F\x01aUnV[a\x01 \x8B\x01RaV\xAE\x8Ea\x03\x80\x8F\x01aUnV[\x87\x8B\x01RaV\xC0\x8Ea\x03\xC0\x8F\x01aUnV[a\x01`\x8B\x01RaV\xD4\x8Ea\x04\0\x8F\x01aUnV[\x86\x8B\x01Ra\x04@\x8D\x015a\x01\xA0\x8B\x01Ra\x04`\x8D\x015\x85\x8B\x01R\x87\x8D\x015a\x01\xE0\x8B\x01Ra\x04\xA0\x8D\x015\x84\x8B\x01Ra\x04\xC0\x8D\x015a\x02 \x8B\x01Ra\x04\xE0\x8D\x015\x83\x8B\x01Ra\x05\0\x8D\x015a\x02`\x8B\x01Ra\x05 \x8D\x015\x82\x8B\x01Ra\x05@\x8D\x015a\x02\xA0\x8B\x01Ra\x05`\x8D\x015\x81\x8B\x01RPPPPPPPPP\x80\x91PP\x92P\x92\x90PV[`\0\x80`@\x83\x85\x03\x12\x15aWkW`\0\x80\xFD[aWt\x83aR\xDAV[\x91P` \x83\x81\x015`\x01`\x01`@\x1B\x03\x80\x82\x11\x15aW\x91W`\0\x80\xFD[\x81\x86\x01\x91P\x86`\x1F\x83\x01\x12aW\xA5W`\0\x80\xFD[\x815\x81\x81\x11\x15aW\xB7WaW\xB7aS\x0CV[aW\xC9`\x1F\x82\x01`\x1F\x19\x16\x85\x01aSmV[\x91P\x80\x82R\x87\x84\x82\x85\x01\x01\x11\x15aW\xDFW`\0\x80\xFD[\x80\x84\x84\x01\x85\x84\x017`\0\x84\x82\x84\x01\x01RP\x80\x93PPPP\x92P\x92\x90PV[`\0` \x80\x83\x85\x03\x12\x15aX\x10W`\0\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x81\x11\x15aX&W`\0\x80\xFD[\x83\x01`\x1F\x81\x01\x85\x13aX7W`\0\x80\xFD[\x805aXEaU\x06\x82aT\x9BV[\x81\x81R`\x06\x91\x90\x91\x1B\x82\x01\x83\x01\x90\x83\x81\x01\x90\x87\x83\x11\x15aXdW`\0\x80\xFD[\x92\x84\x01\x92[\x82\x84\x10\x15aUHW`@\x84\x89\x03\x12\x15aX\x82W`\0\x80\x81\xFD[aX\x8AaS\"V[aX\x93\x85aS\x9DV[\x81R\x84\x86\x015\x86\x82\x01R\x82R`@\x90\x93\x01\x92\x90\x84\x01\x90aXiV[`\x01`\x01`@\x1B\x03\x91\x90\x91\x16\x81R` \x01\x90V[\x805c\xFF\xFF\xFF\xFF\x81\x16\x81\x14a3\x1FW`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15aX\xE8W`\0\x80\xFD[a\x11\xC2\x82aX\xC2V[`\0\x80`\0a\x01@\x84\x86\x03\x12\x15aY\x07W`\0\x80\xFD[aY\x11\x85\x85aS\xB4V[\x92PaY a\x01\0\x85\x01aX\xC2V[\x91PaY/a\x01 \x85\x01aR\xDAV[\x90P\x92P\x92P\x92V[`\0[\x83\x81\x10\x15aYSW\x81\x81\x01Q\x83\x82\x01R` \x01aY;V[PP`\0\x91\x01RV[` \x81R`\0\x82Q\x80` \x84\x01RaY{\x81`@\x85\x01` \x87\x01aY8V[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[`\0\x80`@\x83\x85\x03\x12\x15aY\xA2W`\0\x80\xFD[PP\x805\x92` \x90\x91\x015\x91PV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\x01`\x01`@\x1B\x03\x81\x81\x16\x83\x82\x16\x02\x80\x82\x16\x91\x90\x82\x81\x14aDxWaDxaY\xB1V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[\x81\x81\x03\x81\x81\x11\x15a\x11\xC5Wa\x11\xC5aY\xB1V[`\x01`\x01`@\x1B\x03\x81\x81\x16\x83\x82\x16\x01\x90\x80\x82\x11\x15a4\xA0Wa4\xA0aY\xB1V[`\0` \x82\x84\x03\x12\x15aZEW`\0\x80\xFD[PQ\x91\x90PV[`\0\x81aZ[WaZ[aY\xB1V[P`\0\x19\x01\x90V[\x80\x82\x01\x80\x82\x11\x15a\x11\xC5Wa\x11\xC5aY\xB1V[`\0\x82QaZ\x88\x81\x84` \x87\x01aY8V[\x91\x90\x91\x01\x92\x91PPV[`\0\x87Q` aZ\xA5\x82\x85\x83\x8D\x01aY8V[\x88Q\x91\x84\x01\x91aZ\xB8\x81\x84\x84\x8D\x01aY8V[\x88Q\x92\x01\x91aZ\xCA\x81\x84\x84\x8C\x01aY8V[\x87Q\x92\x01\x91aZ\xDC\x81\x84\x84\x8B\x01aY8V[\x86Q\x92\x01\x91aZ\xEE\x81\x84\x84\x8A\x01aY8V[\x85Q\x92\x01\x91a[\0\x81\x84\x84\x89\x01aY8V[\x91\x90\x91\x01\x99\x98PPPPPPPPPV[`\0\x83Qa[#\x81\x84` \x88\x01aY8V[\x83Q\x90\x83\x01\x90a[7\x81\x83` \x88\x01aY8V[\x01\x94\x93PPPPV[`\0\x87Qa[R\x81\x84` \x8C\x01aY8V[\x91\x90\x91\x01\x95\x86RP` \x85\x01\x93\x90\x93R`@\x84\x01\x91\x90\x91R``\x83\x01R`\x80\x82\x01R`\xA0\x01\x91\x90PV[`\0\x84Qa[\x8E\x81\x84` \x89\x01aY8V[\x84Q\x90\x83\x01\x90a[\xA2\x81\x83` \x89\x01aY8V[\x84Q\x91\x01\x90a[\xB5\x81\x83` \x88\x01aY8V[\x01\x95\x94PPPPPV[cNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[`\0\x82a[\xF2WcNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[P\x06\x90V[`\0\x85Qa\\\t\x81\x84` \x8A\x01aY8V[\x85Q\x90\x83\x01\x90a\\\x1D\x81\x83` \x8A\x01aY8V[\x85Q\x91\x01\x90a\\0\x81\x83` \x89\x01aY8V[\x84Q\x91\x01\x90a\\C\x81\x83` \x88\x01aY8V[\x01\x96\x95PPPPPPV[`\0\x89Q` a\\a\x82\x85\x83\x8F\x01aY8V[\x8AQ\x91\x84\x01\x91a\\t\x81\x84\x84\x8F\x01aY8V[\x8AQ\x92\x01\x91a\\\x86\x81\x84\x84\x8E\x01aY8V[\x89Q\x92\x01\x91a\\\x98\x81\x84\x84\x8D\x01aY8V[\x88Q\x92\x01\x91a\\\xAA\x81\x84\x84\x8C\x01aY8V[\x87Q\x92\x01\x91a\\\xBC\x81\x84\x84\x8B\x01aY8V[\x86Q\x92\x01\x91a\\\xCE\x81\x84\x84\x8A\x01aY8V[\x85Q\x92\x01\x91a\\\xE0\x81\x84\x84\x89\x01aY8V[\x91\x90\x91\x01\x9B\x9APPPPPPPPPPPV[`\0\x88Q` a]\x06\x82\x85\x83\x8E\x01aY8V[\x89Q\x91\x84\x01\x91a]\x19\x81\x84\x84\x8E\x01aY8V[\x89Q\x92\x01\x91a]+\x81\x84\x84\x8D\x01aY8V[\x88Q\x92\x01\x91a]=\x81\x84\x84\x8C\x01aY8V[\x87Q\x92\x01\x91a]O\x81\x84\x84\x8B\x01aY8V[\x86Q\x92\x01\x91a]a\x81\x84\x84\x8A\x01aY8V[\x85Q\x92\x01\x91a]s\x81\x84\x84\x89\x01aY8V[\x91\x90\x91\x01\x9A\x99PPPPPPPPPPV[`\0\x8AQa]\x97\x81\x84` \x8F\x01aY8V[\x91\x90\x91\x01\x98\x89RP` \x88\x01\x96\x90\x96R`@\x87\x01\x94\x90\x94R``\x86\x01\x92\x90\x92R`\x80\x85\x01R`\xA0\x84\x01R`\xC0\x83\x01R`\xE0\x82\x01Ra\x01\0\x01\x91\x90PV\xFE0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\xA6l\xC9(\xB5\xED\xB8*\xF9\xBDI\x92)T\x15Z\xB7\xB0\x94&\x94\xBE\xA4\xCEDf\x1D\x9A\x876\xC6\x88.+\x91Ea\x03i\x8A\xDFW\xB7\x99\x96\x9D\xEA\x1C\x8Fs\x9D\xA5\xD8\xD4\r\xD3\xEB\x92\"\xDB|\x81\xE8\x816\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\xF3\xF7\xA9\xFE6O\xAA\xB9;!m\xA5\n2\x14\x15O\"\xA0\xA2\xB4\x15\xB2:\x84\xC8\x16\x9E\x8Bcn\xE3\x1E\xE6x\xA0G\nu\xA6\xEA\xA8\xFE\x83p`I\x8B\xA8(\xA3p;1\x1D\x0Fw\xF0\x10BJ\xFE\xB0%\xF3\xF7\xA9\xFE6O\xAA\xB9;!m\xA5\n2\x14\x15O\"\xA0\xA2\xB4\x15\xB2:\x84\xC8\x16\x9E\x8Bcn\xE4 B\xA5\x87\xA9\x0C\x18{\n\x08|\x03\xE2\x9C\x96\x8B\x95\x0B\x1D\xB2m\\\x82\xD6f\x90Zh\x95y\x0C\n/\x8D\xD1\xF1\xA7X ::ethers::contract::builders::ContractCall {
+ self.0
+ .method_hash([84, 100, 96, 133], ())
+ .expect("method not found (this should never happen)")
+ }
+ ///Calls the contract's `getHotShotCommitment` (0x8584d23f) function
+ pub fn get_hot_shot_commitment(
+ &self,
+ hot_shot_block_height: ::ethers::core::types::U256,
+ ) -> ::ethers::contract::builders::ContractCall {
+ self.0
+ .method_hash([133, 132, 210, 63], hot_shot_block_height)
+ .expect("method not found (this should never happen)")
+ }
+ ///Calls the contract's `getStateUpdateBlockNumbersCount` (0x7053fc51) function
+ pub fn get_state_update_block_numbers_count(
+ &self,
+ ) -> ::ethers::contract::builders::ContractCall {
+ self.0
+ .method_hash([112, 83, 252, 81], ())
+ .expect("method not found (this should never happen)")
+ }
///Calls the contract's `getVersion` (0x0d8e6e2c) function
pub fn get_version(&self) -> ::ethers::contract::builders::ContractCall {
self.0
.method_hash([13, 142, 110, 44], ())
.expect("method not found (this should never happen)")
}
+ ///Calls the contract's `hotShotCommitments` (0xdb13b60a) function
+ pub fn hot_shot_commitments(
+ &self,
+ p0: ::ethers::core::types::U256,
+ ) -> ::ethers::contract::builders::ContractCall
+ {
+ self.0
+ .method_hash([219, 19, 182, 10], p0)
+ .expect("method not found (this should never happen)")
+ }
///Calls the contract's `initialize` (0xa244d596) function
pub fn initialize(
&self,
@@ -1159,6 +1424,16 @@ pub mod light_client_mock {
.method_hash([162, 68, 213, 150], (genesis, num_blocks_per_epoch, owner))
.expect("method not found (this should never happen)")
}
+ ///Calls the contract's `lagOverEscapeHatchThreshold` (0xe0303301) function
+ pub fn lag_over_escape_hatch_threshold(
+ &self,
+ block_number: ::ethers::core::types::U256,
+ threshold: ::ethers::core::types::U256,
+ ) -> ::ethers::contract::builders::ContractCall {
+ self.0
+ .method_hash([224, 48, 51, 1], (block_number, threshold))
+ .expect("method not found (this should never happen)")
+ }
///Calls the contract's `newFinalizedState` (0x409939b7) function
pub fn new_finalized_state(
&self,
@@ -1223,6 +1498,30 @@ pub mod light_client_mock {
.method_hash([32, 42, 10, 219], (state,))
.expect("method not found (this should never happen)")
}
+ ///Calls the contract's `setHotShotCommitments` (0x530ca78f) function
+ pub fn set_hot_shot_commitments(
+ &self,
+ values: ::std::vec::Vec,
+ ) -> ::ethers::contract::builders::ContractCall {
+ self.0
+ .method_hash([83, 12, 167, 143], values)
+ .expect("method not found (this should never happen)")
+ }
+ ///Calls the contract's `setHotShotDownSince` (0x2d52aad6) function
+ pub fn set_hot_shot_down_since(
+ &self,
+ l_1_height: ::ethers::core::types::U256,
+ ) -> ::ethers::contract::builders::ContractCall {
+ self.0
+ .method_hash([45, 82, 170, 214], l_1_height)
+ .expect("method not found (this should never happen)")
+ }
+ ///Calls the contract's `setHotShotUp` (0xc8e5e498) function
+ pub fn set_hot_shot_up(&self) -> ::ethers::contract::builders::ContractCall {
+ self.0
+ .method_hash([200, 229, 228, 152], ())
+ .expect("method not found (this should never happen)")
+ }
///Calls the contract's `setPermissionedProver` (0x013fa5fc) function
pub fn set_permissioned_prover(
&self,
@@ -1232,6 +1531,24 @@ pub mod light_client_mock {
.method_hash([1, 63, 165, 252], prover)
.expect("method not found (this should never happen)")
}
+ ///Calls the contract's `setStateUpdateBlockNumbers` (0x3919340f) function
+ pub fn set_state_update_block_numbers(
+ &self,
+ values: ::std::vec::Vec<::ethers::core::types::U256>,
+ ) -> ::ethers::contract::builders::ContractCall {
+ self.0
+ .method_hash([57, 25, 52, 15], values)
+ .expect("method not found (this should never happen)")
+ }
+ ///Calls the contract's `stateUpdateBlockNumbers` (0xa51e6fea) function
+ pub fn state_update_block_numbers(
+ &self,
+ p0: ::ethers::core::types::U256,
+ ) -> ::ethers::contract::builders::ContractCall {
+ self.0
+ .method_hash([165, 30, 111, 234], p0)
+ .expect("method not found (this should never happen)")
+ }
///Calls the contract's `states` (0x7f17baad) function
pub fn states(
&self,
@@ -1430,6 +1747,24 @@ pub mod light_client_mock {
)]
#[etherror(name = "FailedInnerCall", abi = "FailedInnerCall()")]
pub struct FailedInnerCall;
+ ///Custom Error type `InsufficientSnapshotHistory` with signature `InsufficientSnapshotHistory()` and selector `0xb0b43877`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthError,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[etherror(
+ name = "InsufficientSnapshotHistory",
+ abi = "InsufficientSnapshotHistory()"
+ )]
+ pub struct InsufficientSnapshotHistory;
///Custom Error type `InvalidAddress` with signature `InvalidAddress()` and selector `0xe6c4247b`
#[derive(
Clone,
@@ -1460,7 +1795,7 @@ pub mod light_client_mock {
)]
#[etherror(name = "InvalidArgs", abi = "InvalidArgs()")]
pub struct InvalidArgs;
- ///Custom Error type `InvalidInitialization` with signature `InvalidInitialization()` and selector `0xf92ee8a9`
+ ///Custom Error type `InvalidHotShotBlockForCommitmentCheck` with signature `InvalidHotShotBlockForCommitmentCheck()` and selector `0x615a9264`
#[derive(
Clone,
::ethers::contract::EthError,
@@ -1473,8 +1808,26 @@ pub mod light_client_mock {
Eq,
Hash,
)]
- #[etherror(name = "InvalidInitialization", abi = "InvalidInitialization()")]
- pub struct InvalidInitialization;
+ #[etherror(
+ name = "InvalidHotShotBlockForCommitmentCheck",
+ abi = "InvalidHotShotBlockForCommitmentCheck()"
+ )]
+ pub struct InvalidHotShotBlockForCommitmentCheck;
+ ///Custom Error type `InvalidInitialization` with signature `InvalidInitialization()` and selector `0xf92ee8a9`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthError,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[etherror(name = "InvalidInitialization", abi = "InvalidInitialization()")]
+ pub struct InvalidInitialization;
///Custom Error type `InvalidPolyEvalArgs` with signature `InvalidPolyEvalArgs()` and selector `0x8c5e11f1`
#[derive(
Clone,
@@ -1736,8 +2089,10 @@ pub mod light_client_mock {
ERC1967InvalidImplementation(ERC1967InvalidImplementation),
ERC1967NonPayable(ERC1967NonPayable),
FailedInnerCall(FailedInnerCall),
+ InsufficientSnapshotHistory(InsufficientSnapshotHistory),
InvalidAddress(InvalidAddress),
InvalidArgs(InvalidArgs),
+ InvalidHotShotBlockForCommitmentCheck(InvalidHotShotBlockForCommitmentCheck),
InvalidInitialization(InvalidInitialization),
InvalidPolyEvalArgs(InvalidPolyEvalArgs),
InvalidProof(InvalidProof),
@@ -1784,12 +2139,24 @@ pub mod light_client_mock {
if let Ok(decoded) = ::decode(data) {
return Ok(Self::FailedInnerCall(decoded));
}
+ if let Ok(decoded) =
+ ::decode(data)
+ {
+ return Ok(Self::InsufficientSnapshotHistory(decoded));
+ }
if let Ok(decoded) = ::decode(data) {
return Ok(Self::InvalidAddress(decoded));
}
if let Ok(decoded) = ::decode(data) {
return Ok(Self::InvalidArgs(decoded));
}
+ if let Ok(decoded) =
+ ::decode(
+ data,
+ )
+ {
+ return Ok(Self::InvalidHotShotBlockForCommitmentCheck(decoded));
+ }
if let Ok(decoded) =
::decode(data)
{
@@ -1872,8 +2239,14 @@ pub mod light_client_mock {
}
Self::ERC1967NonPayable(element) => ::ethers::core::abi::AbiEncode::encode(element),
Self::FailedInnerCall(element) => ::ethers::core::abi::AbiEncode::encode(element),
+ Self::InsufficientSnapshotHistory(element) => {
+ ::ethers::core::abi::AbiEncode::encode(element)
+ }
Self::InvalidAddress(element) => ::ethers::core::abi::AbiEncode::encode(element),
Self::InvalidArgs(element) => ::ethers::core::abi::AbiEncode::encode(element),
+ Self::InvalidHotShotBlockForCommitmentCheck(element) => {
+ ::ethers::core::abi::AbiEncode::encode(element)
+ }
Self::InvalidInitialization(element) => {
::ethers::core::abi::AbiEncode::encode(element)
}
@@ -1934,12 +2307,20 @@ pub mod light_client_mock {
== ::selector() => {
true
}
+ _ if selector
+ == ::selector() => {
+ true
+ }
_ if selector
== ::selector() => {
true
}
_ if selector
== ::selector() => true,
+ _ if selector
+ == ::selector() => {
+ true
+ }
_ if selector
== ::selector() => {
true
@@ -2013,8 +2394,12 @@ pub mod light_client_mock {
}
Self::ERC1967NonPayable(element) => ::core::fmt::Display::fmt(element, f),
Self::FailedInnerCall(element) => ::core::fmt::Display::fmt(element, f),
+ Self::InsufficientSnapshotHistory(element) => ::core::fmt::Display::fmt(element, f),
Self::InvalidAddress(element) => ::core::fmt::Display::fmt(element, f),
Self::InvalidArgs(element) => ::core::fmt::Display::fmt(element, f),
+ Self::InvalidHotShotBlockForCommitmentCheck(element) => {
+ ::core::fmt::Display::fmt(element, f)
+ }
Self::InvalidInitialization(element) => ::core::fmt::Display::fmt(element, f),
Self::InvalidPolyEvalArgs(element) => ::core::fmt::Display::fmt(element, f),
Self::InvalidProof(element) => ::core::fmt::Display::fmt(element, f),
@@ -2064,6 +2449,11 @@ pub mod light_client_mock {
Self::FailedInnerCall(value)
}
}
+ impl ::core::convert::From for LightClientMockErrors {
+ fn from(value: InsufficientSnapshotHistory) -> Self {
+ Self::InsufficientSnapshotHistory(value)
+ }
+ }
impl ::core::convert::From for LightClientMockErrors {
fn from(value: InvalidAddress) -> Self {
Self::InvalidAddress(value)
@@ -2074,6 +2464,11 @@ pub mod light_client_mock {
Self::InvalidArgs(value)
}
}
+ impl ::core::convert::From for LightClientMockErrors {
+ fn from(value: InvalidHotShotBlockForCommitmentCheck) -> Self {
+ Self::InvalidHotShotBlockForCommitmentCheck(value)
+ }
+ }
impl ::core::convert::From for LightClientMockErrors {
fn from(value: InvalidInitialization) -> Self {
Self::InvalidInitialization(value)
@@ -2558,6 +2953,59 @@ pub mod light_client_mock {
)]
#[ethcall(name = "getGenesisState", abi = "getGenesisState()")]
pub struct GetGenesisStateCall;
+ ///Container type for all input parameters for the `getHotShotBlockCommitmentsCount` function with signature `getHotShotBlockCommitmentsCount()` and selector `0x54646085`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthCall,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[ethcall(
+ name = "getHotShotBlockCommitmentsCount",
+ abi = "getHotShotBlockCommitmentsCount()"
+ )]
+ pub struct GetHotShotBlockCommitmentsCountCall;
+ ///Container type for all input parameters for the `getHotShotCommitment` function with signature `getHotShotCommitment(uint256)` and selector `0x8584d23f`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthCall,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[ethcall(name = "getHotShotCommitment", abi = "getHotShotCommitment(uint256)")]
+ pub struct GetHotShotCommitmentCall {
+ pub hot_shot_block_height: ::ethers::core::types::U256,
+ }
+ ///Container type for all input parameters for the `getStateUpdateBlockNumbersCount` function with signature `getStateUpdateBlockNumbersCount()` and selector `0x7053fc51`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthCall,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[ethcall(
+ name = "getStateUpdateBlockNumbersCount",
+ abi = "getStateUpdateBlockNumbersCount()"
+ )]
+ pub struct GetStateUpdateBlockNumbersCountCall;
///Container type for all input parameters for the `getVersion` function with signature `getVersion()` and selector `0x0d8e6e2c`
#[derive(
Clone,
@@ -2573,6 +3021,21 @@ pub mod light_client_mock {
)]
#[ethcall(name = "getVersion", abi = "getVersion()")]
pub struct GetVersionCall;
+ ///Container type for all input parameters for the `hotShotCommitments` function with signature `hotShotCommitments(uint256)` and selector `0xdb13b60a`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthCall,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[ethcall(name = "hotShotCommitments", abi = "hotShotCommitments(uint256)")]
+ pub struct HotShotCommitmentsCall(pub ::ethers::core::types::U256);
///Container type for all input parameters for the `initialize` function with signature `initialize((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256),uint32,address)` and selector `0xa244d596`
#[derive(
Clone,
@@ -2595,6 +3058,27 @@ pub mod light_client_mock {
pub num_blocks_per_epoch: u32,
pub owner: ::ethers::core::types::Address,
}
+ ///Container type for all input parameters for the `lagOverEscapeHatchThreshold` function with signature `lagOverEscapeHatchThreshold(uint256,uint256)` and selector `0xe0303301`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthCall,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[ethcall(
+ name = "lagOverEscapeHatchThreshold",
+ abi = "lagOverEscapeHatchThreshold(uint256,uint256)"
+ )]
+ pub struct LagOverEscapeHatchThresholdCall {
+ pub block_number: ::ethers::core::types::U256,
+ pub threshold: ::ethers::core::types::U256,
+ }
///Container type for all input parameters for the `newFinalizedState` function with signature `newFinalizedState((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256),((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))` and selector `0x409939b7`
#[derive(
Clone,
@@ -2726,6 +3210,58 @@ pub mod light_client_mock {
pub struct SetFinalizedStateCall {
pub state: LightClientState,
}
+ ///Container type for all input parameters for the `setHotShotCommitments` function with signature `setHotShotCommitments((uint64,uint256)[])` and selector `0x530ca78f`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthCall,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[ethcall(
+ name = "setHotShotCommitments",
+ abi = "setHotShotCommitments((uint64,uint256)[])"
+ )]
+ pub struct SetHotShotCommitmentsCall {
+ pub values: ::std::vec::Vec,
+ }
+ ///Container type for all input parameters for the `setHotShotDownSince` function with signature `setHotShotDownSince(uint256)` and selector `0x2d52aad6`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthCall,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[ethcall(name = "setHotShotDownSince", abi = "setHotShotDownSince(uint256)")]
+ pub struct SetHotShotDownSinceCall {
+ pub l_1_height: ::ethers::core::types::U256,
+ }
+ ///Container type for all input parameters for the `setHotShotUp` function with signature `setHotShotUp()` and selector `0xc8e5e498`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthCall,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[ethcall(name = "setHotShotUp", abi = "setHotShotUp()")]
+ pub struct SetHotShotUpCall;
///Container type for all input parameters for the `setPermissionedProver` function with signature `setPermissionedProver(address)` and selector `0x013fa5fc`
#[derive(
Clone,
@@ -2743,6 +3279,44 @@ pub mod light_client_mock {
pub struct SetPermissionedProverCall {
pub prover: ::ethers::core::types::Address,
}
+ ///Container type for all input parameters for the `setStateUpdateBlockNumbers` function with signature `setStateUpdateBlockNumbers(uint256[])` and selector `0x3919340f`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthCall,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[ethcall(
+ name = "setStateUpdateBlockNumbers",
+ abi = "setStateUpdateBlockNumbers(uint256[])"
+ )]
+ pub struct SetStateUpdateBlockNumbersCall {
+ pub values: ::std::vec::Vec<::ethers::core::types::U256>,
+ }
+ ///Container type for all input parameters for the `stateUpdateBlockNumbers` function with signature `stateUpdateBlockNumbers(uint256)` and selector `0xa51e6fea`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthCall,
+ ::ethers::contract::EthDisplay,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ #[ethcall(
+ name = "stateUpdateBlockNumbers",
+ abi = "stateUpdateBlockNumbers(uint256)"
+ )]
+ pub struct StateUpdateBlockNumbersCall(pub ::ethers::core::types::U256);
///Container type for all input parameters for the `states` function with signature `states(uint32)` and selector `0x7f17baad`
#[derive(
Clone,
@@ -2840,8 +3414,13 @@ pub mod light_client_mock {
FrozenThreshold(FrozenThresholdCall),
GetFinalizedState(GetFinalizedStateCall),
GetGenesisState(GetGenesisStateCall),
+ GetHotShotBlockCommitmentsCount(GetHotShotBlockCommitmentsCountCall),
+ GetHotShotCommitment(GetHotShotCommitmentCall),
+ GetStateUpdateBlockNumbersCount(GetStateUpdateBlockNumbersCountCall),
GetVersion(GetVersionCall),
+ HotShotCommitments(HotShotCommitmentsCall),
Initialize(InitializeCall),
+ LagOverEscapeHatchThreshold(LagOverEscapeHatchThresholdCall),
NewFinalizedState(NewFinalizedStateCall),
Owner(OwnerCall),
PermissionedProver(PermissionedProverCall),
@@ -2850,7 +3429,12 @@ pub mod light_client_mock {
RenounceOwnership(RenounceOwnershipCall),
SetCurrentEpoch(SetCurrentEpochCall),
SetFinalizedState(SetFinalizedStateCall),
+ SetHotShotCommitments(SetHotShotCommitmentsCall),
+ SetHotShotDownSince(SetHotShotDownSinceCall),
+ SetHotShotUp(SetHotShotUpCall),
SetPermissionedProver(SetPermissionedProverCall),
+ SetStateUpdateBlockNumbers(SetStateUpdateBlockNumbersCall),
+ StateUpdateBlockNumbers(StateUpdateBlockNumbersCall),
States(StatesCall),
TransferOwnership(TransferOwnershipCall),
UpgradeToAndCall(UpgradeToAndCallCall),
@@ -2906,12 +3490,41 @@ pub mod light_client_mock {
{
return Ok(Self::GetGenesisState(decoded));
}
+ if let Ok(decoded) =
+ ::decode(
+ data,
+ )
+ {
+ return Ok(Self::GetHotShotBlockCommitmentsCount(decoded));
+ }
+ if let Ok(decoded) =
+ ::decode(data)
+ {
+ return Ok(Self::GetHotShotCommitment(decoded));
+ }
+ if let Ok(decoded) =
+ ::decode(
+ data,
+ )
+ {
+ return Ok(Self::GetStateUpdateBlockNumbersCount(decoded));
+ }
if let Ok(decoded) = ::decode(data) {
return Ok(Self::GetVersion(decoded));
}
+ if let Ok(decoded) =
+ ::decode(data)
+ {
+ return Ok(Self::HotShotCommitments(decoded));
+ }
if let Ok(decoded) = ::decode(data) {
return Ok(Self::Initialize(decoded));
}
+ if let Ok(decoded) =
+ ::decode(data)
+ {
+ return Ok(Self::LagOverEscapeHatchThreshold(decoded));
+ }
if let Ok(decoded) =
::decode(data)
{
@@ -2949,11 +3562,35 @@ pub mod light_client_mock {
{
return Ok(Self::SetFinalizedState(decoded));
}
+ if let Ok(decoded) =
+ ::decode(data)
+ {
+ return Ok(Self::SetHotShotCommitments(decoded));
+ }
+ if let Ok(decoded) =
+ ::decode(data)
+ {
+ return Ok(Self::SetHotShotDownSince(decoded));
+ }
+ if let Ok(decoded) = ::decode(data)
+ {
+ return Ok(Self::SetHotShotUp(decoded));
+ }
if let Ok(decoded) =
::decode(data)
{
return Ok(Self::SetPermissionedProver(decoded));
}
+ if let Ok(decoded) =
+ ::decode(data)
+ {
+ return Ok(Self::SetStateUpdateBlockNumbers(decoded));
+ }
+ if let Ok(decoded) =
+ ::decode(data)
+ {
+ return Ok(Self::StateUpdateBlockNumbers(decoded));
+ }
if let Ok(decoded) = ::decode(data) {
return Ok(Self::States(decoded));
}
@@ -3000,8 +3637,23 @@ pub mod light_client_mock {
Self::FrozenThreshold(element) => ::ethers::core::abi::AbiEncode::encode(element),
Self::GetFinalizedState(element) => ::ethers::core::abi::AbiEncode::encode(element),
Self::GetGenesisState(element) => ::ethers::core::abi::AbiEncode::encode(element),
+ Self::GetHotShotBlockCommitmentsCount(element) => {
+ ::ethers::core::abi::AbiEncode::encode(element)
+ }
+ Self::GetHotShotCommitment(element) => {
+ ::ethers::core::abi::AbiEncode::encode(element)
+ }
+ Self::GetStateUpdateBlockNumbersCount(element) => {
+ ::ethers::core::abi::AbiEncode::encode(element)
+ }
Self::GetVersion(element) => ::ethers::core::abi::AbiEncode::encode(element),
+ Self::HotShotCommitments(element) => {
+ ::ethers::core::abi::AbiEncode::encode(element)
+ }
Self::Initialize(element) => ::ethers::core::abi::AbiEncode::encode(element),
+ Self::LagOverEscapeHatchThreshold(element) => {
+ ::ethers::core::abi::AbiEncode::encode(element)
+ }
Self::NewFinalizedState(element) => ::ethers::core::abi::AbiEncode::encode(element),
Self::Owner(element) => ::ethers::core::abi::AbiEncode::encode(element),
Self::PermissionedProver(element) => {
@@ -3014,9 +3666,22 @@ pub mod light_client_mock {
Self::RenounceOwnership(element) => ::ethers::core::abi::AbiEncode::encode(element),
Self::SetCurrentEpoch(element) => ::ethers::core::abi::AbiEncode::encode(element),
Self::SetFinalizedState(element) => ::ethers::core::abi::AbiEncode::encode(element),
+ Self::SetHotShotCommitments(element) => {
+ ::ethers::core::abi::AbiEncode::encode(element)
+ }
+ Self::SetHotShotDownSince(element) => {
+ ::ethers::core::abi::AbiEncode::encode(element)
+ }
+ Self::SetHotShotUp(element) => ::ethers::core::abi::AbiEncode::encode(element),
Self::SetPermissionedProver(element) => {
::ethers::core::abi::AbiEncode::encode(element)
}
+ Self::SetStateUpdateBlockNumbers(element) => {
+ ::ethers::core::abi::AbiEncode::encode(element)
+ }
+ Self::StateUpdateBlockNumbers(element) => {
+ ::ethers::core::abi::AbiEncode::encode(element)
+ }
Self::States(element) => ::ethers::core::abi::AbiEncode::encode(element),
Self::TransferOwnership(element) => ::ethers::core::abi::AbiEncode::encode(element),
Self::UpgradeToAndCall(element) => ::ethers::core::abi::AbiEncode::encode(element),
@@ -3041,8 +3706,17 @@ pub mod light_client_mock {
Self::FrozenThreshold(element) => ::core::fmt::Display::fmt(element, f),
Self::GetFinalizedState(element) => ::core::fmt::Display::fmt(element, f),
Self::GetGenesisState(element) => ::core::fmt::Display::fmt(element, f),
+ Self::GetHotShotBlockCommitmentsCount(element) => {
+ ::core::fmt::Display::fmt(element, f)
+ }
+ Self::GetHotShotCommitment(element) => ::core::fmt::Display::fmt(element, f),
+ Self::GetStateUpdateBlockNumbersCount(element) => {
+ ::core::fmt::Display::fmt(element, f)
+ }
Self::GetVersion(element) => ::core::fmt::Display::fmt(element, f),
+ Self::HotShotCommitments(element) => ::core::fmt::Display::fmt(element, f),
Self::Initialize(element) => ::core::fmt::Display::fmt(element, f),
+ Self::LagOverEscapeHatchThreshold(element) => ::core::fmt::Display::fmt(element, f),
Self::NewFinalizedState(element) => ::core::fmt::Display::fmt(element, f),
Self::Owner(element) => ::core::fmt::Display::fmt(element, f),
Self::PermissionedProver(element) => ::core::fmt::Display::fmt(element, f),
@@ -3051,7 +3725,12 @@ pub mod light_client_mock {
Self::RenounceOwnership(element) => ::core::fmt::Display::fmt(element, f),
Self::SetCurrentEpoch(element) => ::core::fmt::Display::fmt(element, f),
Self::SetFinalizedState(element) => ::core::fmt::Display::fmt(element, f),
+ Self::SetHotShotCommitments(element) => ::core::fmt::Display::fmt(element, f),
+ Self::SetHotShotDownSince(element) => ::core::fmt::Display::fmt(element, f),
+ Self::SetHotShotUp(element) => ::core::fmt::Display::fmt(element, f),
Self::SetPermissionedProver(element) => ::core::fmt::Display::fmt(element, f),
+ Self::SetStateUpdateBlockNumbers(element) => ::core::fmt::Display::fmt(element, f),
+ Self::StateUpdateBlockNumbers(element) => ::core::fmt::Display::fmt(element, f),
Self::States(element) => ::core::fmt::Display::fmt(element, f),
Self::TransferOwnership(element) => ::core::fmt::Display::fmt(element, f),
Self::UpgradeToAndCall(element) => ::core::fmt::Display::fmt(element, f),
@@ -3105,16 +3784,41 @@ pub mod light_client_mock {
Self::GetGenesisState(value)
}
}
+ impl ::core::convert::From for LightClientMockCalls {
+ fn from(value: GetHotShotBlockCommitmentsCountCall) -> Self {
+ Self::GetHotShotBlockCommitmentsCount(value)
+ }
+ }
+ impl ::core::convert::From for LightClientMockCalls {
+ fn from(value: GetHotShotCommitmentCall) -> Self {
+ Self::GetHotShotCommitment(value)
+ }
+ }
+ impl ::core::convert::From for LightClientMockCalls {
+ fn from(value: GetStateUpdateBlockNumbersCountCall) -> Self {
+ Self::GetStateUpdateBlockNumbersCount(value)
+ }
+ }
impl ::core::convert::From for LightClientMockCalls {
fn from(value: GetVersionCall) -> Self {
Self::GetVersion(value)
}
}
+ impl ::core::convert::From for LightClientMockCalls {
+ fn from(value: HotShotCommitmentsCall) -> Self {
+ Self::HotShotCommitments(value)
+ }
+ }
impl ::core::convert::From for LightClientMockCalls {
fn from(value: InitializeCall) -> Self {
Self::Initialize(value)
}
}
+ impl ::core::convert::From for LightClientMockCalls {
+ fn from(value: LagOverEscapeHatchThresholdCall) -> Self {
+ Self::LagOverEscapeHatchThreshold(value)
+ }
+ }
impl ::core::convert::From for LightClientMockCalls {
fn from(value: NewFinalizedStateCall) -> Self {
Self::NewFinalizedState(value)
@@ -3155,11 +3859,36 @@ pub mod light_client_mock {
Self::SetFinalizedState(value)
}
}
+ impl ::core::convert::From for LightClientMockCalls {
+ fn from(value: SetHotShotCommitmentsCall) -> Self {
+ Self::SetHotShotCommitments(value)
+ }
+ }
+ impl ::core::convert::From for LightClientMockCalls {
+ fn from(value: SetHotShotDownSinceCall) -> Self {
+ Self::SetHotShotDownSince(value)
+ }
+ }
+ impl ::core::convert::From for LightClientMockCalls {
+ fn from(value: SetHotShotUpCall) -> Self {
+ Self::SetHotShotUp(value)
+ }
+ }
impl ::core::convert::From for LightClientMockCalls {
fn from(value: SetPermissionedProverCall) -> Self {
Self::SetPermissionedProver(value)
}
}
+ impl ::core::convert::From for LightClientMockCalls {
+ fn from(value: SetStateUpdateBlockNumbersCall) -> Self {
+ Self::SetStateUpdateBlockNumbers(value)
+ }
+ }
+ impl ::core::convert::From for LightClientMockCalls {
+ fn from(value: StateUpdateBlockNumbersCall) -> Self {
+ Self::StateUpdateBlockNumbers(value)
+ }
+ }
impl ::core::convert::From for LightClientMockCalls {
fn from(value: StatesCall) -> Self {
Self::States(value)
@@ -3297,6 +4026,48 @@ pub mod light_client_mock {
Hash,
)]
pub struct GetGenesisStateReturn(pub LightClientState);
+ ///Container type for all return fields from the `getHotShotBlockCommitmentsCount` function with signature `getHotShotBlockCommitmentsCount()` and selector `0x54646085`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthAbiType,
+ ::ethers::contract::EthAbiCodec,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ pub struct GetHotShotBlockCommitmentsCountReturn(pub ::ethers::core::types::U256);
+ ///Container type for all return fields from the `getHotShotCommitment` function with signature `getHotShotCommitment(uint256)` and selector `0x8584d23f`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthAbiType,
+ ::ethers::contract::EthAbiCodec,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ pub struct GetHotShotCommitmentReturn(pub HotShotCommitment);
+ ///Container type for all return fields from the `getStateUpdateBlockNumbersCount` function with signature `getStateUpdateBlockNumbersCount()` and selector `0x7053fc51`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthAbiType,
+ ::ethers::contract::EthAbiCodec,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ pub struct GetStateUpdateBlockNumbersCountReturn(pub ::ethers::core::types::U256);
///Container type for all return fields from the `getVersion` function with signature `getVersion()` and selector `0x0d8e6e2c`
#[derive(
Clone,
@@ -3315,6 +4086,37 @@ pub mod light_client_mock {
pub minor_version: u8,
pub patch_version: u8,
}
+ ///Container type for all return fields from the `hotShotCommitments` function with signature `hotShotCommitments(uint256)` and selector `0xdb13b60a`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthAbiType,
+ ::ethers::contract::EthAbiCodec,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ pub struct HotShotCommitmentsReturn {
+ pub block_height: u64,
+ pub block_comm_root: ::ethers::core::types::U256,
+ }
+ ///Container type for all return fields from the `lagOverEscapeHatchThreshold` function with signature `lagOverEscapeHatchThreshold(uint256,uint256)` and selector `0xe0303301`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthAbiType,
+ ::ethers::contract::EthAbiCodec,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ pub struct LagOverEscapeHatchThresholdReturn(pub bool);
///Container type for all return fields from the `owner` function with signature `owner()` and selector `0x8da5cb5b`
#[derive(
Clone,
@@ -3371,6 +4173,20 @@ pub mod light_client_mock {
Hash,
)]
pub struct ProxiableUUIDReturn(pub [u8; 32]);
+ ///Container type for all return fields from the `stateUpdateBlockNumbers` function with signature `stateUpdateBlockNumbers(uint256)` and selector `0xa51e6fea`
+ #[derive(
+ Clone,
+ ::ethers::contract::EthAbiType,
+ ::ethers::contract::EthAbiCodec,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+ )]
+ pub struct StateUpdateBlockNumbersReturn(pub ::ethers::core::types::U256);
///Container type for all return fields from the `states` function with signature `states(uint32)` and selector `0x7f17baad`
#[derive(
Clone,
diff --git a/contract-bindings/src/shared_types.rs b/contract-bindings/src/shared_types.rs
index 18211d22a..0176246d0 100644
--- a/contract-bindings/src/shared_types.rs
+++ b/contract-bindings/src/shared_types.rs
@@ -53,6 +53,23 @@ pub struct PlonkProof {
pub sigma_eval_3: ::ethers::core::types::U256,
pub prod_perm_zeta_omega_eval: ::ethers::core::types::U256,
}
+///`HotShotCommitment(uint64,uint256)`
+#[derive(
+ Clone,
+ ::ethers::contract::EthAbiType,
+ ::ethers::contract::EthAbiCodec,
+ serde::Serialize,
+ serde::Deserialize,
+ Default,
+ Debug,
+ PartialEq,
+ Eq,
+ Hash,
+)]
+pub struct HotShotCommitment {
+ pub block_height: u64,
+ pub block_comm_root: ::ethers::core::types::U256,
+}
///`LightClientState(uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256)`
#[derive(
Clone,
diff --git a/contracts/.gitignore b/contracts/.gitignore
index 5c4627912..b68c24227 100644
--- a/contracts/.gitignore
+++ b/contracts/.gitignore
@@ -13,3 +13,10 @@ out/
# Dotenv file
.env
+
+.wake
+pytypes
+__pycache__/
+*.py[cod]
+.hypothesis/
+wake-coverage.cov
\ No newline at end of file
diff --git a/contracts/rust/adapter/Cargo.toml b/contracts/rust/adapter/Cargo.toml
index 3072bfc8a..d242940fc 100644
--- a/contracts/rust/adapter/Cargo.toml
+++ b/contracts/rust/adapter/Cargo.toml
@@ -18,8 +18,8 @@ contract-bindings = { path = "../../../contract-bindings" }
diff-test-bn254 = { git = "https://github.com/EspressoSystems/solidity-bn254.git" }
ethers = { version = "2.0.4" }
hotshot-types = { workspace = true }
+jf-pcs = { workspace = true }
jf-plonk = { workspace = true }
-jf-primitives = { workspace = true }
jf-utils = { workspace = true }
num-bigint = { version = "0.4", default-features = false }
num-traits = { version = "0.2", default-features = false }
diff --git a/contracts/rust/adapter/src/jellyfish.rs b/contracts/rust/adapter/src/jellyfish.rs
index 18943d847..1df5a92ab 100644
--- a/contracts/rust/adapter/src/jellyfish.rs
+++ b/contracts/rust/adapter/src/jellyfish.rs
@@ -11,10 +11,10 @@ use ethers::{
prelude::{AbiError, EthAbiCodec, EthAbiType},
types::{Bytes, H256, U256},
};
+use jf_pcs::prelude::Commitment;
use jf_plonk::proof_system::structs::{OpenKey, Proof, ProofEvaluations, VerifyingKey};
use jf_plonk::testing_apis::Challenges;
use jf_plonk::{constants::KECCAK256_STATE_SIZE, transcript::SolidityTranscript};
-use jf_primitives::pcs::prelude::Commitment;
use num_bigint::BigUint;
use num_traits::Num;
diff --git a/contracts/rust/diff-test/Cargo.toml b/contracts/rust/diff-test/Cargo.toml
index 59fdae91a..6669efe59 100644
--- a/contracts/rust/diff-test/Cargo.toml
+++ b/contracts/rust/diff-test/Cargo.toml
@@ -23,9 +23,10 @@ hotshot-stake-table = { workspace = true }
hotshot-state-prover = { path = "../../../hotshot-state-prover" }
hotshot-types = { workspace = true }
itertools = { workspace = true }
+jf-pcs = { workspace = true }
jf-plonk = { workspace = true }
-jf-primitives = { workspace = true }
jf-relation = { workspace = true }
+jf-signature = { workspace = true }
jf-utils = { workspace = true }
sha3 = { version = "0.10.8", default-features = false }
diff --git a/contracts/rust/diff-test/src/main.rs b/contracts/rust/diff-test/src/main.rs
index b7dc3976d..5c7b58b40 100644
--- a/contracts/rust/diff-test/src/main.rs
+++ b/contracts/rust/diff-test/src/main.rs
@@ -17,17 +17,16 @@ use hotshot_state_prover::mock_ledger::{
gen_plonk_proof_for_test, MockLedger, MockSystemParam, STAKE_TABLE_CAPACITY,
};
use itertools::multiunzip;
+use jf_pcs::prelude::Commitment;
use jf_plonk::proof_system::structs::{Proof, VerifyingKey};
use jf_plonk::proof_system::PlonkKzgSnark;
use jf_plonk::{
testing_apis::Verifier,
transcript::{PlonkTranscript, SolidityTranscript},
};
-use jf_primitives::constants::CS_ID_BLS_BN254;
-use jf_primitives::pcs::prelude::Commitment;
-use jf_primitives::signatures::bls_over_bn254::Signature;
-use jf_primitives::signatures::bls_over_bn254::{hash_to_curve, KeyPair as BLSKeyPair};
-use jf_primitives::signatures::schnorr::KeyPair as SchnorrKeyPair;
+use jf_signature::bls_over_bn254::{hash_to_curve, KeyPair as BLSKeyPair, Signature};
+use jf_signature::constants::CS_ID_BLS_BN254;
+use jf_signature::schnorr::KeyPair as SchnorrKeyPair;
use sha3::Keccak256;
#[derive(Parser)]
diff --git a/contracts/rust/gen-vk-contract/Cargo.toml b/contracts/rust/gen-vk-contract/Cargo.toml
index 595c163d0..dc4920fc7 100644
--- a/contracts/rust/gen-vk-contract/Cargo.toml
+++ b/contracts/rust/gen-vk-contract/Cargo.toml
@@ -10,4 +10,4 @@ ark-srs = { workspace = true }
hotshot-contract-adapter = { path = "../adapter" }
hotshot-stake-table = { workspace = true }
hotshot-state-prover = { path = "../../../hotshot-state-prover" }
-jf-primitives = { workspace = true }
+jf-pcs = { workspace = true }
diff --git a/contracts/rust/gen-vk-contract/src/main.rs b/contracts/rust/gen-vk-contract/src/main.rs
index ce32050aa..d6804eca7 100644
--- a/contracts/rust/gen-vk-contract/src/main.rs
+++ b/contracts/rust/gen-vk-contract/src/main.rs
@@ -9,7 +9,7 @@ use std::process::Command;
use hotshot_contract_adapter::jellyfish::ParsedVerifyingKey;
use hotshot_stake_table::config::STAKE_TABLE_CAPACITY;
-use jf_primitives::pcs::prelude::UnivariateUniversalParams;
+use jf_pcs::prelude::UnivariateUniversalParams;
fn main() {
let srs = {
diff --git a/contracts/script/README.md b/contracts/script/README.md
index 573f613b2..6ddf07f41 100644
--- a/contracts/script/README.md
+++ b/contracts/script/README.md
@@ -18,10 +18,19 @@ settings.
1. Create a multisig wallet using [Safe](https://app.safe.global/welcome/accounts) on the network you'd like to deploy
to.
-2. In OpenZeppelin Defender, create an Approval Process that requires the multisig wallet you created above.
- `Manage > Approval Processes`
-3. In OpenZeppelin Defender, create a deployment environment and use the approval process created in Step 2. Be sure to
- copy the Defender secret and key, that is shown at the end of this step, into the .env file.
+2. In [OpenZeppelin Defender](https://www.openzeppelin.com/defender), create an Approval Process that requires the
+ multisig wallet you created above. `Manage > Approval Processes`.
+ 1. Enter a name for your approval process
+ 1. Enter the multisig address from shown in te Safe UI
+ 1. Enter one of multisig owner address addresses
+ 1. Save the changes
+3. In OpenZeppelin Defender, create a deployment environment by clicking on "Setup" in the
+ [deploy](https://defender.openzeppelin.com/v2/#/deploy) tab. Use "Test Environment" for deploying to testnets (e. g.
+ Sepolia) and "Production Environment" for mainnet.
+ 1. Choose a network
+ 1. Select the approval process created in Step 2
+ 1. Be sure to save DEFENDER_SECRET ("Team Secret key") and DEFENDER_KEY ("Team API Key"), that is shown at the end of
+ this step, into the .env file. The keys won't be available later at a later point.
## Deployments
@@ -29,15 +38,23 @@ settings.
Steps:
-1. Run the Deployment Command This command requires you to go to OpenZeppelin Defender's UI to see the transaction.
- Click that transaction which opens up the Safe UI where your signers for that Safe multi-sig wallet can confirm the
- transaction. The two transactions to be confirmed are: (i) deployment of implementation contract (ii) deployment of
- proxy contract
+1. Run the Deployment command.
-```bash
-forge clean && \
-forge script contracts/script/FeeContractWithDefender.s.sol:FeeContractDefenderDeployScript --ffi --rpc-url https://ethereum-sepolia.publicnode.com --build-info true
-```
+ ```bash
+ forge clean && forge script contracts/script/FeeContractWithDefender.s.sol:FeeContractDefenderDeployScript --ffi --rpc-url https://ethereum-sepolia.publicnode.com --build-info true
+ ```
+
+ 1. Go to the [deploy](https://defender.openzeppelin.com/v2/#/deploy) tab OpenZeppelin Defender's UI and click on the
+ current environment to see the transaction. The transaction should be visible with status "SUBMITTED". The page
+ may need to be refreshed a few times. It occasionally may take minutes for transactions to appear.
+ 2. Click that transaction, then "Open in Safe App" which opens up the Safe UI where your signers for that Safe
+ multi-sig wallet can confirm the transaction. The two transactions to be confirmed are: (i) deployment of
+ implementation contract (ii) deployment of proxy contract
+ 3. If the transaction looks correct click "confirm".
+ 4. Click "Execute".
+ 5. Confirm the transaction with your wallet (e. g. metamask).
+ 6. Repeat steps 1 to 5 for the deployment of the proxy contract. You may need to refresh the OpenZeppelin Defender
+ "deploy" tab a few times until the second transaction appears.
2. Verify the Implementation contract on Etherscan (Use another window as step would not have completed yet)
@@ -73,10 +90,11 @@ Read Deploying the Fee Contract for a more detailed version of this.
1. Initiate the Deployment with OpenZeppelin Defender
```bash
-forge clean && \
-forge script contracts/script/LightClientWithDefender.s.sol:LightClientDefenderDeployScript --ffi --rpc-url https://ethereum-sepolia.publicnode.com --build-info true
+forge clean && forge script contracts/script/LightClientWithDefender.s.sol:LightClientDefenderDeployScript --ffi --rpc-url https://ethereum-sepolia.publicnode.com --build-info true
```
+Follow the same steps as for the deployment of the fee contract above.
+
2. Verify the Contract
```bash
diff --git a/contracts/script/multisigTransactionProposals/README.md b/contracts/script/multisigTransactionProposals/README.md
new file mode 100644
index 000000000..b25ab1bd8
--- /dev/null
+++ b/contracts/script/multisigTransactionProposals/README.md
@@ -0,0 +1,92 @@
+# Proposing Multisig Transactions via the Safe SDK
+
+The [Safe SDK](https://github.com/safe-global/safe-core-sdk/blob/main/guides/integrating-the-safe-core-sdk.md) is being
+used to propose transactions that only the Safe multisig admin wallet can perform. The proposer of these transactions is
+also part of the multisig wallet but is used to orchestrate the process. E.g. If you require 3 of 5 trusted signers to
+sign a transaction, then the multisig wallet should require 4 of 5 signers where the 4th signer is the orchestrator
+wallet.
+
+## Set Permissioned Prover
+
+To enable the permissioned prover on the light client contract, ensure that the following environment variables are set
+in the `.env` file:
+
+- `SEPOLIA_RPC_URL`
+- `SAFE_ORCHESTRATOR_PRIVATE_KEY`
+- `SAFE_MULTISIG_ADDRESS`
+- `APPROVED_PROVER_ADDRESS`
+- `LIGHT_CLIENT_PROXY_CONTRACT_ADDRESS`
+
+Assuming you're in the root folder, run the following command:
+
+```bash
+ts-node contracts/script/multisigTransactionProposals/safeSDK/modifyProverModeProposal.ts setProver
+```
+
+Open the the URL shown in the console to sign the transaction in the Safe UI.
+
+Once successful, all signers will see a transaction request on the SAFE UI e.g.
+`https://app.safe.global/transactions/queue?safe=$SAFE_MULTISIG_ADDRESS`
+
+Once the transaction has been signed by all signers and executed by one, you should be able to go to the light client
+proxy and read the permissioned prover address on etherscan.
+
+## Disable Permissioned Prover
+
+To disable the permissioned prover on the light client contract, ensure that the following environment variables are set
+in the `.env` file:
+
+- `SEPOLIA_RPC_URL`
+- `SAFE_ORCHESTRATOR_PRIVATE_KEY`
+- `SAFE_MULTISIG_ADDRESS`
+- `LIGHT_CLIENT_PROXY_CONTRACT_ADDRESS`
+
+Assuming you're in the root folder, run the following command:
+
+```bash
+ts-node contracts/script/multisigTransactionProposals/safeSDK/modifyProverModeProposal.ts disableProver
+```
+
+Once successful, all signers will see a transaction request on the SAFE UI
+`https://app.safe.global/transactions/queue?safe=$SAFE_MULTISIG_ADDRESS`
+
+Once the transaction has been signed by all signers and executed by one, you should be able to go to the light client
+proxy and read the permissioned prover address. It will be equal to the 0 ETH address (address(0)).
+
+## Demonstrating the setPermissionedProver workflow
+
+1. Follow the steps in the deployment script [readme](../../contracts/script/README.md) to set up OpenZeppelin Defender,
+ a Multisig Wallet and deploy the Light Client contract
+2. Set the environment variables mentioned in the section, [Set Permissioned Prover](#set-permissioned-prover)
+3. Run the `ts-node` command as mentioned in the section, [Set Permissioned Prover](#set-permissioned-prover)
+
+## Demonstrating the disablePermissionedProver workflow
+
+1. Follow the steps in the deployment script [readme](../../contracts/script/README.md) to set up OpenZeppelin Defender,
+ a Multisig Wallet and deploy the Light Client contract
+2. Set the environment variables mentioned in the section, [Disable Permissioned Prover](#disable-permissioned-prover)
+3. Run the `ts-node` command as mentioned in the section, [Disable Permissioned Prover](#disable-permissioned-prover)
+
+## Testing
+
+### Testing Safe Multisig Wallets
+
+The Safe Transaction Service requires a live network available for testing and the current service only supports mainnet
+and testnets such as Sepolia. The Safe Wallet UI only works with public networks that they support and to customize it
+for a private EVM network, read their [docs](https://help.safe.global/en/articles/40795-supported-networks) for more
+info. It's non-trivial to set up Safe for private networks and therefore time has not been allocated to do so at this
+stage.
+
+### Testing the utils
+
+Testing safeSDK/utils.ts
+
+```bash
+yarn jest contracts/script/multisigTransactionProposals/tests/utils.test.ts
+```
+
+OR
+
+```bash
+yarn jest
+```
diff --git a/contracts/script/multisigTransactionProposals/safeSDK/modifyProverModeProposal.ts b/contracts/script/multisigTransactionProposals/safeSDK/modifyProverModeProposal.ts
new file mode 100644
index 000000000..294dfa974
--- /dev/null
+++ b/contracts/script/multisigTransactionProposals/safeSDK/modifyProverModeProposal.ts
@@ -0,0 +1,209 @@
+import dotenv from "dotenv";
+import { ethers } from "ethers";
+import { EthersAdapter } from "@safe-global/protocol-kit";
+import SafeApiKit from "@safe-global/api-kit";
+import Safe from "@safe-global/protocol-kit";
+import { getEnvVar, createSafeTransactionData, validateEthereumAddress } from "./utils";
+const SET_PROVER_CMD = "setProver" as const;
+const DISABLE_PROVER_CMD = "disableProver" as const;
+
+// declaring the type returned by the createTransaction method in the safe package locally (since the return type isn't exposed) so that if it's updated, it's reflected here too
+type LocalSafeTransaction = Awaited>;
+
+async function main() {
+ dotenv.config();
+
+ try {
+ const command = processCommandLineArguments();
+
+ /**TODO
+ * change from SEPOLIA_RPC_URL to production URL when deploying to production
+ */
+ // Initialize web3 provider using the RPC URL from environment variables
+ const web3Provider = new ethers.JsonRpcProvider(getEnvVar("SEPOLIA_RPC_URL"));
+ // Create a signer using the orchestrator's private key and the web3 provider
+ const orchestratorSigner = new ethers.Wallet(getEnvVar("SAFE_ORCHESTRATOR_PRIVATE_KEY"), web3Provider);
+
+ // Set up Eth Adapter with ethers and the signer
+ const ethAdapter = new EthersAdapter({
+ ethers,
+ signerOrProvider: orchestratorSigner,
+ });
+
+ const chainId = await ethAdapter.getChainId();
+ const safeService = new SafeApiKit({ chainId });
+ const safeAddress = getEnvVar("SAFE_MULTISIG_ADDRESS");
+ validateEthereumAddress(safeAddress);
+ const safeSdk = await Safe.create({ ethAdapter, safeAddress });
+ const orchestratorSignerAddress = await orchestratorSigner.getAddress();
+
+ if (command === SET_PROVER_CMD) {
+ console.log(`${command}`);
+ const permissionedProverAddress = getEnvVar("APPROVED_PROVER_ADDRESS");
+ validateEthereumAddress(permissionedProverAddress);
+
+ await proposeSetProverTransaction(
+ safeSdk,
+ safeService,
+ orchestratorSignerAddress,
+ safeAddress,
+ permissionedProverAddress,
+ );
+ } else if (command === DISABLE_PROVER_CMD) {
+ console.log(`${command}`);
+ await proposeDisableProverTransaction(safeSdk, safeService, orchestratorSignerAddress, safeAddress);
+ }
+
+ console.log(
+ `The other owners of the Safe Multisig wallet need to sign the transaction via the Safe UI https://app.safe.global/transactions/queue?safe=sep:${safeAddress}`,
+ );
+ } catch (error) {
+ throw new Error("An error occurred: " + error);
+ }
+}
+
+function processCommandLineArguments() {
+ const args = process.argv.slice(2); // Remove the first two args (node command and script name)
+ if (args.length === 0) {
+ console.log("No commands provided.");
+ throw new Error(`No commands provided, either ${SET_PROVER_CMD} or ${DISABLE_PROVER_CMD}`);
+ }
+
+ const command = args[0];
+ if (command !== SET_PROVER_CMD && command !== DISABLE_PROVER_CMD) {
+ throw new Error(`Unrecognized command ${command} provided, either ${SET_PROVER_CMD} or ${DISABLE_PROVER_CMD}`);
+ }
+
+ return command;
+}
+
+/**
+ * Function to propose the transaction data for setting the permissioned prover
+ * @param {string} safeSDK - An instance of the Safe SDK
+ * @param {string} safeService - An instance of the Safe Service
+ * @param {string} signerAddress - The address of the address signing the transaction
+ * @param {string} safeAddress - The address of the Safe multisig wallet
+ * @param {string} proverAddress - The address of the permissioned prover
+ */
+export async function proposeSetProverTransaction(
+ safeSDK: Safe,
+ safeService: SafeApiKit,
+ signerAddress: string,
+ safeAddress: string,
+ proverAddress: string,
+) {
+ // Prepare the transaction data to set the permissioned prover
+ let data = createPermissionedProverTxData(proverAddress);
+
+ const contractAddress = getEnvVar("LIGHT_CLIENT_PROXY_CONTRACT_ADDRESS");
+ validateEthereumAddress(contractAddress);
+
+ // Create the Safe Transaction Object
+ const safeTransaction = await createSafeTransaction(safeSDK, contractAddress, data, "0");
+
+ // Get the transaction hash and sign the transaction
+ const safeTxHash = await safeSDK.getTransactionHash(safeTransaction);
+
+ // Sign the transaction with orchestrator signer that was specified when we created the safeSDK
+ const senderSignature = await safeSDK.signHash(safeTxHash);
+
+ // Propose the transaction which can be signed by other owners via the Safe UI
+ await safeService.proposeTransaction({
+ safeAddress: safeAddress,
+ safeTransactionData: safeTransaction.data,
+ safeTxHash: safeTxHash,
+ senderAddress: signerAddress,
+ senderSignature: senderSignature.data,
+ });
+}
+
+/**
+ * Function to create the transaction data for setting the permissioned prover
+ * @param {string} proverAddress - The address of the permissioned prover
+ * @returns {string} - Encoded transaction data
+ */
+function createPermissionedProverTxData(proverAddress: string): string {
+ // Define the ABI of the function to be called
+ const abi = ["function setPermissionedProver(address)"];
+
+ // Encode the function call with the provided prover address
+ const data = new ethers.Interface(abi).encodeFunctionData("setPermissionedProver", [proverAddress]);
+ return data; // Return the encoded transaction data
+}
+
+/**
+ * Function to propose the transaction data for disabling permissioned prover mode
+ * @param {Safe} safeSDK - An instance of the Safe SDK
+ * @param {SafeApiKit} safeService - An instance of the Safe Service
+ * @param {string} signerAddress - The address of the address signing the transaction
+ * @param {string} safeAddress - The address of the Safe multisig wallet
+ */
+export async function proposeDisableProverTransaction(
+ safeSDK: Safe,
+ safeService: SafeApiKit,
+ signerAddress: string,
+ safeAddress: string,
+) {
+ // Prepare the transaction data to disable permissioned prover mode
+ let data = createDisablePermissionedProverTxData();
+
+ const contractAddress = getEnvVar("LIGHT_CLIENT_PROXY_CONTRACT_ADDRESS");
+ validateEthereumAddress(contractAddress);
+
+ // Create the Safe Transaction Object
+ const safeTransaction = await createSafeTransaction(safeSDK, contractAddress, data, "0");
+
+ // Get the transaction hash and sign the transaction
+ const safeTxHash = await safeSDK.getTransactionHash(safeTransaction);
+
+ // Sign the transaction with orchestrator signer that was specified when we created the safeSDK
+ const senderSignature = await safeSDK.signHash(safeTxHash);
+
+ // Propose the transaction which can be signed by other owners via the Safe UI
+ await safeService.proposeTransaction({
+ safeAddress: safeAddress,
+ safeTransactionData: safeTransaction.data,
+ safeTxHash: safeTxHash,
+ senderAddress: signerAddress,
+ senderSignature: senderSignature.data,
+ });
+}
+
+/**
+ * Function to create the transaction data for disabling permissioned prover mode
+ * @returns {string} - Encoded transaction data
+ */
+function createDisablePermissionedProverTxData(): string {
+ // Define the ABI of the function to be called
+ const abi = ["function disablePermissionedProverMode()"];
+
+ // Encode the function call with the provided prover address
+ const data = new ethers.Interface(abi).encodeFunctionData("disablePermissionedProverMode", []);
+ return data; // Return the encoded transaction data
+}
+
+/**
+ * Creates a Safe transaction object
+ *
+ * @param {Safe} safeSDK - An instance of the Safe SDK
+ * @param {string} contractAddress - The address of the contract to interact with
+ * @param {string} data - The data payload for the transaction
+ * @param {string} value - The value to be sent with the transaction
+ * @returns {Promise} - A promise that resolves to the Safe transaction object
+ */
+async function createSafeTransaction(
+ safeSDK: Safe,
+ contractAddress: string,
+ data: string,
+ value: string,
+): Promise {
+ // Prepare the safe transaction data with the contract address, data, and value
+ let safeTransactionData = createSafeTransactionData(contractAddress, data, value);
+
+ // Create the safe transaction using the Safe SDK
+ const safeTransaction = await safeSDK.createTransaction({ transactions: [safeTransactionData] });
+
+ return safeTransaction;
+}
+
+main();
diff --git a/contracts/script/multisigTransactionProposals/safeSDK/utils.ts b/contracts/script/multisigTransactionProposals/safeSDK/utils.ts
new file mode 100644
index 000000000..f69a02a60
--- /dev/null
+++ b/contracts/script/multisigTransactionProposals/safeSDK/utils.ts
@@ -0,0 +1,52 @@
+import { ethers } from "ethers"; // Import ethers from the ethers library
+
+/**
+ * Function to check if a given string is a valid Ethereum address
+ * @param {string} address - The Ethereum address to validate
+ * @throws {Error} - Throws an error if the address is invalid and doesn't follow Ethereum address standards
+ */
+export function validateEthereumAddress(address: string) {
+ if (!ethers.isAddress(address)) {
+ throw new Error(`Invalid Ethereum address format: ${address}`); // Throw an error if the address is invalid
+ }
+}
+
+/**
+ * Function to get the value of an environment variable from the .env file
+ * @param {string} name - The name of the environment variable to retrieve
+ * @returns {string} - Returns the value of the environment variable
+ */
+export function getEnvVar(name: string): string {
+ const value = process.env[name]; // Retrieve the environment variable value
+ // Check if the environment variable is undefined or empty
+ if (value === undefined || value === "") {
+ throw new Error(`Environment variable ${name} is not set`); // Throw an error if the environment variable is not set
+ }
+ return value; // Return the value of the environment variable
+}
+
+/**
+ * Function to create safe transaction data to be used with the safe SDK
+ * @param {string} to - The destination address for the transaction
+ * @param {string} data - The contract data to be sent
+ * @param {string} value - The value to be sent
+ * @returns {object} - Returns the safe transaction data object
+ */
+export function createSafeTransactionData(to: string, data: string, value: string) {
+ // Check if the destination address is specified
+ if (to == "") {
+ throw new Error("must specify destination address"); // Throw an error if the destination address is not specified
+ }
+ // Check if both data and value are empty
+ if (data == "" && value == "") {
+ throw new Error("Either the contract data or value to be sent must be specified"); // Throw an error if both data and value are empty
+ }
+ validateEthereumAddress(to); // Validate the destination address
+ // Create the safe transaction data object
+ const safeTransactionData = {
+ to: to,
+ data: data,
+ value: value,
+ };
+ return safeTransactionData; // Return the safe transaction data object
+}
diff --git a/contracts/script/multisigTransactionProposals/tests/utils.test.ts b/contracts/script/multisigTransactionProposals/tests/utils.test.ts
new file mode 100644
index 000000000..2fa1a6688
--- /dev/null
+++ b/contracts/script/multisigTransactionProposals/tests/utils.test.ts
@@ -0,0 +1,87 @@
+import { createSafeTransactionData, getEnvVar, isValidEthereumAddress } from "../safeSDK/utils";
+
+// Mocking process.argv
+const originalArgv = process.argv;
+const validETHAddress = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266";
+
+describe("environment tests", () => {
+ afterEach(() => {
+ process.argv = originalArgv; // Reset argv after each test
+ });
+
+ it("should throw an error if SEPOLIA_RPC_URL environment variable is not set", () => {
+ process.env.SEPOLIA_RPC_URL = "";
+ expect(() => getEnvVar("SEPOLIA_RPC_URL")).toThrow();
+ });
+
+ it("should return the rpc url if SEPOLIA_RPC_URL environment variable is set", () => {
+ process.env.SEPOLIA_RPC_URL = "http://rpc";
+ const result = getEnvVar("SEPOLIA_RPC_URL");
+ expect(result).toEqual("http://rpc");
+ });
+});
+
+describe("createSafeTransactionData", () => {
+ test("should throw an error if the destination address is not specified", () => {
+ expect(() => {
+ createSafeTransactionData("", "0x", "0");
+ }).toThrow("must specify destination address");
+ });
+
+ test("should throw an error if the address is not valid", () => {
+ expect(() => {
+ createSafeTransactionData("0x123", "0x", "0");
+ }).toThrow("Invalid Ethereum address format");
+ });
+
+ test("should throw an error if both data and value are empty", () => {
+ expect(() => {
+ createSafeTransactionData(validETHAddress, "", "");
+ }).toThrow("Either the contract data or value to be sent must be specified");
+ });
+
+ test("should return safe transaction data when valid parameters are provided", () => {
+ const result = createSafeTransactionData(validETHAddress, "0x", "100");
+ expect(result).toEqual({
+ to: validETHAddress,
+ data: "0x",
+ value: "100",
+ });
+ });
+
+ test("should return safe transaction data when only data is provided", () => {
+ const result = createSafeTransactionData(validETHAddress, "0x", "");
+ expect(result).toEqual({
+ to: validETHAddress,
+ data: "0x",
+ value: "",
+ });
+ });
+
+ test("should return safe transaction data when only value is provided", () => {
+ const result = createSafeTransactionData(validETHAddress, "", "100");
+ expect(result).toEqual({
+ to: validETHAddress,
+ data: "",
+ value: "100",
+ });
+ });
+});
+
+describe("isValidEthereumAddress", () => {
+ test("should return true for a valid Ethereum address", () => {
+ expect(isValidEthereumAddress(validETHAddress)).toBe(true);
+ });
+
+ test("should throw an error for an invalid Ethereum address", () => {
+ expect(() => {
+ isValidEthereumAddress("0xInvalidEthereumAddress");
+ }).toThrow("Invalid Ethereum address format");
+ });
+
+ test("should throw an error for an empty string", () => {
+ expect(() => {
+ isValidEthereumAddress("");
+ }).toThrow("Invalid Ethereum address format");
+ });
+});
diff --git a/contracts/script/output/defenderDeployments/LightClient.sol/11155111/12.json b/contracts/script/output/defenderDeployments/LightClient.sol/11155111/12.json
new file mode 100644
index 000000000..2b7d992e6
--- /dev/null
+++ b/contracts/script/output/defenderDeployments/LightClient.sol/11155111/12.json
@@ -0,0 +1,7 @@
+{
+ "approvalProcessId": "a0dd5bf1-9766-4a2f-94b1-2a7ceb0dc5be",
+ "approvalType": "Gnosis Safe",
+ "multisig": "0xc56fA6505d10bF322e01327e22479DE78C3Bf1cE",
+ "proxyAddress": "0xbC781a2BCcdac8F65EF10EA85D765CA240D1789b",
+ "salt": 12
+}
\ No newline at end of file
diff --git a/contracts/script/output/defenderDeployments/LightClient.sol/11155111/saltHistory.json b/contracts/script/output/defenderDeployments/LightClient.sol/11155111/saltHistory.json
new file mode 100644
index 000000000..42cc64ab9
--- /dev/null
+++ b/contracts/script/output/defenderDeployments/LightClient.sol/11155111/saltHistory.json
@@ -0,0 +1,4 @@
+{
+ "contractName": "LightClient.sol",
+ "previousSalt": 12
+}
\ No newline at end of file
diff --git a/contracts/src/LightClient.sol b/contracts/src/LightClient.sol
index 69892005f..f3110da1f 100644
--- a/contracts/src/LightClient.sol
+++ b/contracts/src/LightClient.sol
@@ -84,6 +84,13 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable {
/// @notice a flag that indicates when a permissioned provrer is needed
bool public permissionedProverEnabled;
+ /// @notice an array to store the L1 Block Heights where the finalizedState was updated
+ uint256[] public stateUpdateBlockNumbers;
+
+ /// @notice an array to store the HotShot Block Heights and their respective HotShot
+ /// commitments
+ HotShotCommitment[] public hotShotCommitments;
+
// === Data Structure ===
//
/// @notice The finalized HotShot state (as the digest of the entire HotShot state)
@@ -106,6 +113,14 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable {
uint256 threshold;
}
+ /// @notice Simplified HotShot commitment struct
+ /// @param blockHeight The block height of the latest finalized HotShot block
+ /// @param blockCommRoot The merkle root of historical block commitments (BN254::ScalarField)
+ struct HotShotCommitment {
+ uint64 blockHeight;
+ BN254.ScalarField blockCommRoot;
+ }
+
/// @notice Event that a new finalized state has been successfully verified and updated
event NewState(
uint64 indexed viewNum, uint64 indexed blockHeight, BN254.ScalarField blockCommRoot
@@ -131,6 +146,10 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable {
error PermissionedProverNotSet();
/// @notice If the same mode or prover is sent to the function, then no change is required
error NoChangeRequired();
+ /// @notice Invalid L1 Block for checking Light Client Updates, premature or in the future
+ error InsufficientSnapshotHistory();
+ /// @notice Invalid HotShot Block for checking HotShot commitments, premature or in the future
+ error InvalidHotShotBlockForCommitmentCheck();
/// @notice since the constructor initializes storage on this contract we disable it
/// @dev storage is on the proxy contract since it calls this contract via delegatecall
@@ -181,9 +200,9 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable {
) {
revert InvalidArgs();
}
-
states[genesisState] = genesis;
states[finalizedState] = genesis;
+
currentEpoch = 0;
blocksPerEpoch = numBlockPerEpoch;
@@ -193,6 +212,12 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable {
votingThreshold = genesis.threshold;
frozenStakeTableCommitment = initStakeTableComm;
frozenThreshold = genesis.threshold;
+
+ //add the L1 Block to stateUpdateBlockNumbers for the genesis state
+ stateUpdateBlockNumbers.push(block.number);
+
+ // add the HotShot commitment for the genesis state
+ hotShotCommitments.push(HotShotCommitment(genesis.blockHeight, genesis.blockCommRoot));
}
// === State Modifying APIs ===
@@ -251,6 +276,13 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable {
// upon successful verification, update the latest finalized state
states[finalizedState] = newState;
+
+ //add the L1 Block to stateUpdateBlockNumbers for the new finalized state
+ stateUpdateBlockNumbers.push(block.number);
+
+ //add the blockheight and blockCommRoot to hotShotCommitments for the new finalized state
+ hotShotCommitments.push(HotShotCommitment(newState.blockHeight, newState.blockCommRoot));
+
emit NewState(newState.viewNum, newState.blockHeight, newState.blockCommRoot);
}
@@ -331,7 +363,6 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable {
/// @notice set the permissionedProverMode to false and set the permissionedProver to address(0)
/// @dev if it was already disabled (permissioneProverMode == false), then revert with
- /// NoChangeRequired
function disablePermissionedProverMode() public onlyOwner {
if (permissionedProverEnabled) {
permissionedProver = address(0);
@@ -341,4 +372,82 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable {
revert NoChangeRequired();
}
}
+
+ /// @notice check if more than threshold blocks passed since the last state update before
+ /// L1 Block Number
+ /// @param blockNumber The L1 block number
+ /// @param threshold The number of blocks updates to this contract is allowed to lag behind
+ /// Marked as `virtual` for easily testing.
+ function lagOverEscapeHatchThreshold(uint256 blockNumber, uint256 threshold)
+ public
+ view
+ virtual
+ returns (bool)
+ {
+ uint256 updatesCount = stateUpdateBlockNumbers.length;
+
+ // Handling Edge Cases
+ // Edgecase 1: The block is in the future or in the past before HotShot was live
+ if (blockNumber > block.number || updatesCount < 3) {
+ revert InsufficientSnapshotHistory();
+ }
+
+ uint256 prevBlock;
+ bool prevUpdateFound;
+
+ uint256 i = updatesCount - 1;
+ while (!prevUpdateFound) {
+ if (stateUpdateBlockNumbers[i] <= blockNumber) {
+ prevUpdateFound = true;
+ prevBlock = stateUpdateBlockNumbers[i];
+ }
+
+ // We don't consider the lag time for the first two updates
+ if (i < 2) {
+ break;
+ }
+ i--;
+ }
+
+ // If no snapshot is found, we don't have enough history stored to tell whether HotShot was
+ // down.
+ if (!prevUpdateFound) {
+ revert InsufficientSnapshotHistory();
+ }
+
+ return blockNumber - prevBlock > threshold;
+ }
+
+ /// @notice get the number of L1 block updates
+ function getStateUpdateBlockNumbersCount() public view returns (uint256) {
+ return stateUpdateBlockNumbers.length;
+ }
+
+ /// @notice get the HotShot commitment that represents the Merkle root containing the leaf at
+ /// the provided height
+ /// @param hotShotBlockHeight hotShotBlockHeight
+ function getHotShotCommitment(uint256 hotShotBlockHeight)
+ public
+ view
+ returns (HotShotCommitment memory)
+ {
+ uint256 commitmentsHeight = hotShotCommitments.length;
+ if (hotShotBlockHeight >= hotShotCommitments[commitmentsHeight - 1].blockHeight) {
+ revert InvalidHotShotBlockForCommitmentCheck();
+ }
+ for (uint256 i = 0; i < commitmentsHeight; i++) {
+ // The first commitment greater than the provided height is the root of the tree
+ // that leaf at that HotShot height
+ if (hotShotCommitments[i].blockHeight > hotShotBlockHeight) {
+ return hotShotCommitments[i];
+ }
+ }
+
+ return hotShotCommitments[commitmentsHeight - 1];
+ }
+
+ /// @notice get the number of HotShot block commitments
+ function getHotShotBlockCommitmentsCount() public view returns (uint256) {
+ return hotShotCommitments.length;
+ }
}
diff --git a/contracts/test/LightClient.t.sol b/contracts/test/LightClient.t.sol
index d9da161f9..4e074e187 100644
--- a/contracts/test/LightClient.t.sol
+++ b/contracts/test/LightClient.t.sol
@@ -18,6 +18,7 @@ import { BN254 } from "bn254/BN254.sol";
contract LightClientCommonTest is Test {
LCMock public lc;
uint32 public constant BLOCKS_PER_EPOCH_TEST = 3;
+ uint32 public constant DELAY_THRESHOLD = 6;
LC.LightClientState public genesis;
// this constant should be consistent with `hotshot_contract::light_client.rs`
uint64 internal constant STAKE_TABLE_CAPACITY = 10;
@@ -613,3 +614,309 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest {
lc.newFinalizedState(newState, proof);
}
}
+
+contract LightClient_StateUpdatesTest is LightClientCommonTest {
+ LC.LightClientState internal newState;
+ V.PlonkProof internal newProof;
+
+ /**
+ * Liveness test cases to consider
+ * Outside of HotShot threshold, revert
+ * OnlyOneUpdate - HotShot is live
+ * OnlyTwoUpdates - HotShot is live unless blockNumber is past the 2nd blockupdate and past the
+ * threshold
+ */
+ function setUp() public {
+ init();
+ // Assert owner is correctly set, add this to check owner state
+ assertEq(lc.owner(), admin, "Admin should be the owner.");
+
+ string[] memory cmds = new string[](6);
+ cmds[0] = "diff-test";
+ cmds[1] = "mock-consecutive-finalized-states";
+ cmds[2] = vm.toString(BLOCKS_PER_EPOCH_TEST);
+ cmds[3] = vm.toString(STAKE_TABLE_CAPACITY / 2);
+ cmds[4] = vm.toString(uint64(1));
+ cmds[5] = vm.toString(uint64(1));
+
+ bytes memory result = vm.ffi(cmds);
+ (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs) =
+ abi.decode(result, (LC.LightClientState[], V.PlonkProof[]));
+
+ newState = states[1];
+ newProof = proofs[1];
+ }
+
+ function test_1lBlockUpdatesIsUpdated() public {
+ uint256 blockUpdatesCount = lc.getStateUpdateBlockNumbersCount();
+
+ // Update the state and thus the l1BlockUpdates array would be updated
+ vm.prank(permissionedProver);
+ vm.expectEmit(true, true, true, true);
+ emit LC.NewState(newState.viewNum, newState.blockHeight, newState.blockCommRoot);
+ lc.newFinalizedState(newState, newProof);
+
+ assertEq(lc.getStateUpdateBlockNumbersCount(), blockUpdatesCount + 1);
+ }
+
+ function test_hotshotIsLiveFunctionWhenNoDelayOccurred() public {
+ // DELAY_THRESHOLD = 6
+ uint256[] memory updates = new uint256[](5);
+ updates[0] = 1;
+ updates[1] = updates[0] + DELAY_THRESHOLD / 2; // 4
+ updates[2] = updates[1] + DELAY_THRESHOLD / 2; // 7
+ updates[3] = updates[2] + DELAY_THRESHOLD + 5; // 18
+ updates[4] = updates[3] + DELAY_THRESHOLD / 2; // 21
+ lc.setStateUpdateBlockNumbers(updates);
+
+ // set the current block to block number larger than the l1 block numbers used in this test
+ vm.roll(updates[4] + (DELAY_THRESHOLD * 5));
+
+ assertEq(lc.getStateUpdateBlockNumbersCount(), 5);
+
+ // Reverts as it's within the first two updates which aren't valid times to check since it
+ // was just getting initialized
+ vm.expectRevert(LC.InsufficientSnapshotHistory.selector);
+ lc.lagOverEscapeHatchThreshold(updates[1] - 1, DELAY_THRESHOLD);
+
+ // Hotshot should be live (l1BlockNumber = 7)
+ assertFalse(lc.lagOverEscapeHatchThreshold(updates[2], DELAY_THRESHOLD));
+ }
+
+ function test_hotshotIsDownWhenADelayExists() public {
+ // DELAY_THRESHOLD = 6
+ uint256[] memory updates = new uint256[](5);
+ updates[0] = 1;
+ updates[1] = updates[0] + DELAY_THRESHOLD / 2; // 4
+ updates[2] = updates[1] + DELAY_THRESHOLD / 2; // 7
+ updates[3] = updates[2] + DELAY_THRESHOLD + 5; // 18
+ updates[4] = updates[3] + DELAY_THRESHOLD / 2; // 21
+ lc.setStateUpdateBlockNumbers(updates);
+
+ // set the current block to block number larger than the l1 block numbers used in this test
+ vm.roll(updates[4] + (DELAY_THRESHOLD * 5));
+
+ // Hotshot should be down (l1BlockNumber = 15)
+ // for a block that should have been recorded but wasn't due to a delay
+ assertTrue(
+ lc.lagOverEscapeHatchThreshold(updates[2] + DELAY_THRESHOLD + 2, DELAY_THRESHOLD)
+ );
+ }
+
+ function test_revertWhenThereAreOnlyTwoUpdates() public {
+ uint256[] memory updates = new uint256[](2);
+ updates[0] = 1;
+ updates[1] = updates[0] + DELAY_THRESHOLD + 5; //12
+ lc.setStateUpdateBlockNumbers(updates);
+
+ vm.roll(DELAY_THRESHOLD * 5);
+
+ assertEq(lc.getStateUpdateBlockNumbersCount(), 2);
+
+ vm.expectRevert(LC.InsufficientSnapshotHistory.selector);
+ lc.lagOverEscapeHatchThreshold(updates[0] + 2, DELAY_THRESHOLD); //3
+ }
+
+ function test_revertWhenThereIsOnlyOneUpdate() public {
+ uint256[] memory updates = new uint256[](1);
+ updates[0] = 1;
+ lc.setStateUpdateBlockNumbers(updates);
+
+ vm.roll(DELAY_THRESHOLD * 3);
+
+ assertEq(lc.getStateUpdateBlockNumbersCount(), 1);
+
+ vm.expectRevert(LC.InsufficientSnapshotHistory.selector);
+ lc.lagOverEscapeHatchThreshold(updates[0] + 2, DELAY_THRESHOLD); //3
+ }
+
+ function test_revertWhenBlockRequestedWithinFirstTwoUpdates() public {
+ // DELAY_THRESHOLD = 6
+ uint256[] memory updates = new uint256[](3);
+ updates[0] = 1;
+ updates[1] = updates[0] + DELAY_THRESHOLD / 2; // 4
+ updates[2] = updates[1] + DELAY_THRESHOLD / 2; // 21
+ lc.setStateUpdateBlockNumbers(updates);
+
+ vm.roll(DELAY_THRESHOLD * 5);
+
+ assertEq(lc.getStateUpdateBlockNumbersCount(), 3);
+
+ vm.expectRevert(LC.InsufficientSnapshotHistory.selector);
+ lc.lagOverEscapeHatchThreshold(updates[0] + 2, DELAY_THRESHOLD); //3
+ }
+
+ function test_hotShotIsDownWhenBlockIsHigherThanLastRecordedAndTheDelayThresholdHasPassed()
+ public
+ {
+ // DELAY_THRESHOLD = 6
+ uint256[] memory updates = new uint256[](3);
+ updates[0] = 1;
+ updates[1] = updates[0] + DELAY_THRESHOLD / 2; // 4
+ updates[2] = updates[1] + DELAY_THRESHOLD / 2; // 21
+ lc.setStateUpdateBlockNumbers(updates);
+
+ // set the current block to block number larger than the l1 block numbers used in this test
+ vm.roll(updates[2] + (DELAY_THRESHOLD * 5));
+
+ // Hotshot should be down (l1BlockNumber = 29)
+ // in a block that's higher than the last recorded and past the delay threshold
+ assertTrue(
+ lc.lagOverEscapeHatchThreshold(updates[2] + DELAY_THRESHOLD + 3, DELAY_THRESHOLD)
+ );
+ }
+
+ function test_hotShotIsLiveWhenBlockIsHigherThanLastRecordedAndTheDelayThresholdHasNotPassed()
+ public
+ {
+ // DELAY_THRESHOLD = 6
+ uint256[] memory updates = new uint256[](3);
+ updates[0] = 1;
+ updates[1] = updates[0] + DELAY_THRESHOLD / 2; // 4
+ updates[2] = updates[1] + DELAY_THRESHOLD / 2; // 21
+ lc.setStateUpdateBlockNumbers(updates);
+
+ // set the current block to block number larger than the l1 block numbers used in this test
+ vm.roll(updates[2] + (DELAY_THRESHOLD * 5));
+
+ // Hotshot should be live (l1BlockNumber = 24)
+ assertFalse(lc.lagOverEscapeHatchThreshold(updates[2] + 3, DELAY_THRESHOLD));
+ }
+
+ function test_revertWhenBlockInFuture() public {
+ // DELAY_THRESHOLD = 6
+ uint256[] memory updates = new uint256[](2);
+ updates[0] = 1;
+ updates[1] = updates[0] + DELAY_THRESHOLD / 2; // 4
+ lc.setStateUpdateBlockNumbers(updates);
+
+ // set the current block
+ uint256 currBlock = 20;
+ vm.roll(currBlock);
+
+ vm.expectRevert(LC.InsufficientSnapshotHistory.selector);
+
+ lc.lagOverEscapeHatchThreshold(currBlock + 5, DELAY_THRESHOLD);
+ }
+
+ function test_revertWhenRequestedBlockIsBeforeHotShotFirstBlock() public {
+ // DELAY_THRESHOLD = 6
+ uint256[] memory updates = new uint256[](2);
+ updates[0] = 1;
+ updates[1] = updates[0] + DELAY_THRESHOLD / 2; // 4
+ lc.setStateUpdateBlockNumbers(updates);
+
+ // set the current block
+ uint256 currBlock = 20;
+ vm.roll(currBlock);
+
+ vm.expectRevert(LC.InsufficientSnapshotHistory.selector);
+
+ lc.lagOverEscapeHatchThreshold(updates[0] - 1, DELAY_THRESHOLD);
+ }
+}
+
+contract LightClient_HotShotCommUpdatesTest is LightClientCommonTest {
+ LC.LightClientState internal newState;
+ V.PlonkProof internal newProof;
+
+ /**
+ * Liveness test cases to consider
+ * Outside of HotShot threshold, revert
+ * OnlyOneUpdate - HotShot is live
+ * OnlyTwoUpdates - HotShot is live unless blockNumber is past the 2nd blockupdate and past the
+ * threshold
+ */
+ function setUp() public {
+ init();
+ // Assert owner is correctly set, add this to check owner state
+ assertEq(lc.owner(), admin, "Admin should be the owner.");
+
+ string[] memory cmds = new string[](6);
+ cmds[0] = "diff-test";
+ cmds[1] = "mock-consecutive-finalized-states";
+ cmds[2] = vm.toString(BLOCKS_PER_EPOCH_TEST);
+ cmds[3] = vm.toString(STAKE_TABLE_CAPACITY / 2);
+ cmds[4] = vm.toString(uint64(1));
+ cmds[5] = vm.toString(uint64(1));
+
+ bytes memory result = vm.ffi(cmds);
+ (LC.LightClientState[] memory _states, V.PlonkProof[] memory _proofs) =
+ abi.decode(result, (LC.LightClientState[], V.PlonkProof[]));
+
+ newState = _states[1];
+ newProof = _proofs[1];
+ }
+
+ function assertEqBN254(BN254.ScalarField a, BN254.ScalarField b) public pure {
+ assertEq(BN254.ScalarField.unwrap(a), BN254.ScalarField.unwrap(b));
+ }
+
+ function assertNotEqBN254(BN254.ScalarField a, BN254.ScalarField b) public pure {
+ assertNotEq(BN254.ScalarField.unwrap(a), BN254.ScalarField.unwrap(b));
+ }
+
+ function test_hotShotBlockCommIsUpdated() public {
+ uint256 blockCommCount = lc.getHotShotBlockCommitmentsCount();
+
+ // Update the state and thus the l1BlockUpdates array would be updated
+ vm.prank(permissionedProver);
+ vm.expectEmit(true, true, true, true);
+ emit LC.NewState(newState.viewNum, newState.blockHeight, newState.blockCommRoot);
+ lc.newFinalizedState(newState, newProof);
+
+ assertEq(lc.getHotShotBlockCommitmentsCount(), blockCommCount + 1);
+ }
+
+ function test_hotShotBlockCommIsUpdatedXTimes() public {
+ uint256 blockCommCount = lc.getHotShotBlockCommitmentsCount();
+
+ string[] memory cmds = new string[](6);
+ cmds[0] = "diff-test";
+ cmds[1] = "mock-consecutive-finalized-states";
+ cmds[2] = vm.toString(BLOCKS_PER_EPOCH_TEST);
+ cmds[3] = vm.toString(STAKE_TABLE_CAPACITY / 2);
+ cmds[4] = vm.toString(uint64(1));
+ cmds[5] = vm.toString(uint64(1));
+
+ bytes memory result = vm.ffi(cmds);
+ (LC.LightClientState[] memory _states, V.PlonkProof[] memory _proofs) =
+ abi.decode(result, (LC.LightClientState[], V.PlonkProof[]));
+
+ uint256 statesCount = _states.length - 1;
+ // Update the state and thus the l1BlockUpdates array would be updated
+ for (uint8 i = 1; i <= statesCount; i++) {
+ LC.LightClientState memory state = _states[i];
+ V.PlonkProof memory proof = _proofs[i];
+ vm.prank(permissionedProver);
+ vm.expectEmit(true, true, true, true);
+ emit LC.NewState(state.viewNum, state.blockHeight, state.blockCommRoot);
+ lc.newFinalizedState(state, proof);
+ }
+
+ assertEq(lc.getHotShotBlockCommitmentsCount(), blockCommCount + statesCount);
+ }
+
+ function test_GetHotShotCommitmentValid() public {
+ vm.prank(permissionedProver);
+ vm.expectEmit(true, true, true, true);
+ emit LC.NewState(newState.viewNum, newState.blockHeight, newState.blockCommRoot);
+ lc.newFinalizedState(newState, newProof);
+
+ // Test for a smaller hotShotBlockHeight
+ BN254.ScalarField blockComm =
+ lc.getHotShotCommitment(newState.blockHeight - 1).blockCommRoot;
+ assertEqBN254(blockComm, newState.blockCommRoot);
+ }
+
+ function test_revertWhenGetHotShotCommitmentInvalidHigh() public {
+ // Get the highest HotShot blockheight recorded
+ uint256 numCommitments = lc.getHotShotBlockCommitmentsCount();
+ (uint64 blockHeight,) = lc.hotShotCommitments(numCommitments - 1);
+
+ // Expect revert when attempting to retrieve a block height higher than the highest one
+ // recorded
+ vm.expectRevert(LC.InvalidHotShotBlockForCommitmentCheck.selector);
+ lc.getHotShotCommitment(blockHeight + 1);
+ }
+}
diff --git a/contracts/test/StakeTable.t.sol b/contracts/test/StakeTable.t.sol
index 3018b7fb5..d91daaee4 100644
--- a/contracts/test/StakeTable.t.sol
+++ b/contracts/test/StakeTable.t.sol
@@ -120,6 +120,7 @@ contract StakeTable_Test is StakeTableCommonTest {
abi.decode(result, (LC.LightClientState, bytes32, bytes32));
genesis = state;
+
lc = new LCTest(genesis, BLOCKS_PER_EPOCH_TEST);
stakeTable = new S(address(token), address(lc), 10);
}
diff --git a/contracts/test/mocks/LightClientMock.sol b/contracts/test/mocks/LightClientMock.sol
index 7fddae0ca..d535943b8 100644
--- a/contracts/test/mocks/LightClientMock.sol
+++ b/contracts/test/mocks/LightClientMock.sol
@@ -10,6 +10,9 @@ import { LightClientStateUpdateVKMock as VkLib } from "./LightClientStateUpdateV
/// @dev A helper that wraps LightClient contract for testing
contract LightClientMock is LC {
+ bool internal hotShotDown;
+ uint256 internal frozenL1Height;
+
constructor(LC.LightClientState memory genesis, uint32 numBlockPerEpoch) LC() {
_initializeState(genesis, numBlockPerEpoch);
}
@@ -47,4 +50,44 @@ contract LightClientMock is LC {
revert InvalidProof();
}
}
+
+ function setStateUpdateBlockNumbers(uint256[] memory values) public {
+ // Empty the array
+ delete stateUpdateBlockNumbers;
+
+ // Set the stateUpdateBlockNumbers to the new values
+ stateUpdateBlockNumbers = values;
+ }
+
+ function setHotShotCommitments(HotShotCommitment[] memory values) public {
+ // Empty the array
+ delete hotShotCommitments;
+
+ // Set the hotShotCommitments to the new values
+ for (uint256 i = 0; i < values.length; i++) {
+ hotShotCommitments.push(values[i]);
+ }
+ }
+
+ function setHotShotDownSince(uint256 l1Height) public {
+ hotShotDown = true;
+ frozenL1Height = l1Height;
+ }
+
+ function setHotShotUp() public {
+ hotShotDown = false;
+ }
+
+ /// @dev override the production-implementation with frozen data
+ function lagOverEscapeHatchThreshold(uint256 blockNumber, uint256 threshold)
+ public
+ view
+ override
+ returns (bool)
+ {
+ if (hotShotDown) {
+ return blockNumber - frozenL1Height > threshold;
+ }
+ return super.lagOverEscapeHatchThreshold(blockNumber, threshold);
+ }
}
diff --git a/cross-shell.nix b/cross-shell.nix
index b9b3949d9..604dfd82c 100644
--- a/cross-shell.nix
+++ b/cross-shell.nix
@@ -1,7 +1,7 @@
# A simplest nix shell file with the project dependencies and
# a cross-compilation support.
-{ pkgs, RUSTFLAGS, RUST_LOG, RUST_BACKTRACE, CARGO_TARGET_DIR }:
-pkgs.mkShell {
+{ pkgs, envVars }:
+pkgs.mkShell (envVars // {
# Native project dependencies like build utilities and additional routines
# like container building, linters, etc.
nativeBuildInputs = with pkgs.pkgsBuildHost; [
@@ -25,5 +25,4 @@ pkgs.mkShell {
rustCrossHook
];
- inherit RUSTFLAGS RUST_LOG RUST_BACKTRACE CARGO_TARGET_DIR;
-}
+})
diff --git a/data/README.md b/data/README.md
index c4f6a6934..42d9a011d 100644
--- a/data/README.md
+++ b/data/README.md
@@ -1,15 +1,16 @@
# Reference Data
This directory contains reference instantiations of the data types used by the sequencer which have a stable
-language-agnostic interface for serialization (via JSON) and cryptographic commitments. The objects in this directory
-have well-known commitments. They serve as examples of the data formats used by the Espresso Sequencer, and can be used
-as test cases for ports of the serialization and commitment algorithms to other languages.
+language-agnostic interface for serialization (in both `.json` files and binary `.bin` files) and cryptographic
+commitments. The objects in this directory have well-known commitments. They serve as examples of the data formats used
+by the Espresso Sequencer, and can be used as test cases for ports of the serialization and commitment algorithms to
+other languages.
-The Rust module `sequencer::block::reference` contains test cases which are designed to fail if the serialization format
+The Rust module `sequencer::reference_tests` contains test cases which are designed to fail if the serialization format
or commitment scheme for any of these data types changes. If you make a breaking change, you may need to update these
reference objects as well. Running those tests will also print out information about the commitments of these reference
objects, which can be useful for generating test cases for ports. To run them and get the output, use
```bash
-cargo test --all-features -p sequencer -- --nocapture --test-threads 1 block::reference
+cargo test --all-features -p sequencer -- --nocapture --test-threads 1 reference_tests
```
diff --git a/data/chain_config.bin b/data/chain_config.bin
new file mode 100644
index 000000000..188812406
Binary files /dev/null and b/data/chain_config.bin differ
diff --git a/data/chain_config.json b/data/chain_config.json
new file mode 100644
index 000000000..4f0650f18
--- /dev/null
+++ b/data/chain_config.json
@@ -0,0 +1,7 @@
+{
+ "base_fee": "0",
+ "chain_id": "35353",
+ "fee_contract": "0x0000000000000000000000000000000000000000",
+ "fee_recipient": "0x0000000000000000000000000000000000000000",
+ "max_block_size": "10240"
+}
diff --git a/data/fee_info.bin b/data/fee_info.bin
new file mode 100644
index 000000000..debddd9d0
Binary files /dev/null and b/data/fee_info.bin differ
diff --git a/data/fee_info.json b/data/fee_info.json
new file mode 100644
index 000000000..ae0867bb1
--- /dev/null
+++ b/data/fee_info.json
@@ -0,0 +1,4 @@
+{
+ "account": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "amount": "0"
+}
diff --git a/data/genesis/cappuccino.toml b/data/genesis/cappuccino.toml
new file mode 100644
index 000000000..4f79e5024
--- /dev/null
+++ b/data/genesis/cappuccino.toml
@@ -0,0 +1,11 @@
+[stake_table]
+capacity = 200
+
+[chain_config]
+chain_id = 0
+base_fee = '0 wei'
+max_block_size = '30mb'
+fee_recipient = '0x0000000000000000000000000000000000000000'
+
+[header]
+timestamp = "1970-01-01T00:00:00Z"
diff --git a/data/genesis/demo.toml b/data/genesis/demo.toml
new file mode 100644
index 000000000..5c52dc386
--- /dev/null
+++ b/data/genesis/demo.toml
@@ -0,0 +1,25 @@
+[stake_table]
+capacity = 10
+
+[chain_config]
+chain_id = 999999999
+base_fee = '1 wei'
+max_block_size = '1mb'
+fee_recipient = '0x0000000000000000000000000000000000000000'
+fee_contract = '0xa15bb66138824a1c7167f5e85b957d04dd34e468'
+
+[header]
+timestamp = "1970-01-01T00:00:00Z"
+
+[[upgrade]]
+version = "0.2"
+view = 5
+propose_window = 10
+
+
+[upgrade.chain_config]
+chain_id = 999999999
+base_fee = '2 wei'
+max_block_size = '1mb'
+fee_recipient = '0x0000000000000000000000000000000000000000'
+fee_contract = '0xa15bb66138824a1c7167f5e85b957d04dd34e468'
diff --git a/data/genesis/staging.toml b/data/genesis/staging.toml
new file mode 100644
index 000000000..02a2def78
--- /dev/null
+++ b/data/genesis/staging.toml
@@ -0,0 +1,11 @@
+[stake_table]
+capacity = 200
+
+[chain_config]
+chain_id = 888888888
+base_fee = '0 wei'
+max_block_size = '30mb'
+fee_recipient = '0x0000000000000000000000000000000000000000'
+
+[header]
+timestamp = "1970-01-01T00:00:00Z"
diff --git a/data/header.bin b/data/header.bin
new file mode 100644
index 000000000..1c3990498
Binary files /dev/null and b/data/header.bin differ
diff --git a/data/header.json b/data/header.json
index 42769ec1d..02e7af466 100644
--- a/data/header.json
+++ b/data/header.json
@@ -1,19 +1,37 @@
{
- "height": 42,
- "timestamp": 789,
- "l1_head": 124,
- "l1_finalized": {
- "number": 123,
- "timestamp": "0x456",
- "hash": "0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
- },
- "payload_commitment": "HASH~1yS-KEtL3oDZDBJdsW51Pd7zywIiHesBZsTbpOzrxOfu",
- "builder_commitment": "BUILDER_COMMITMENT~1yS-KEtL3oDZDBJdsW51Pd7zywIiHesBZsTbpOzrxOdZ",
- "ns_table": {
- "bytes": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- },
- "block_merkle_tree_root": "MERKLE_COMM~yB4_Aqa35_PoskgTpcCR1oVLh6BUdLHIs7erHKWi-usUAAAAAAAAAAEAAAAAAAAAJg",
- "fee_merkle_tree_root": "MERKLE_COMM~VJ9z239aP9GZDrHp3VxwPd_0l28Hc5KEAB1pFeCIxhYgAAAAAAAAAAIAAAAAAAAAdA",
- "fee_info": { "account": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", "amount": "0x0" },
- "chain_config": { "chain_config": { "Left": { "chain_id": "0x8a19", "max_block_size": 10240, "base_fee": "0x0" } } }
-}
+ "block_merkle_tree_root": "MERKLE_COMM~AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAQA",
+ "builder_commitment": "BUILDER_COMMITMENT~jlEvJoHPETCSwXF6UKcD22zOjfoHGuyVFTVkP_BNc-no",
+ "builder_signature": {
+ "r": "0xa1c3795850b7b490e616b60fead89753841fbc9fffe1a939d483f1d959ad1c45",
+ "s": "0x20228f5b63b14792d371dce479978e45020f19602189ef6d325b73029a2848ac",
+ "v": 27
+ },
+ "chain_config": {
+ "chain_config": {
+ "Left": {
+ "base_fee": "0",
+ "chain_id": "35353",
+ "fee_contract": "0x0000000000000000000000000000000000000000",
+ "fee_recipient": "0x0000000000000000000000000000000000000000",
+ "max_block_size": "10240"
+ }
+ }
+ },
+ "fee_info": {
+ "account": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266",
+ "amount": "0"
+ },
+ "fee_merkle_tree_root": "MERKLE_COMM~AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAKA",
+ "height": 42,
+ "l1_finalized": {
+ "hash": "0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
+ "number": 123,
+ "timestamp": "0x456"
+ },
+ "l1_head": 124,
+ "ns_table": {
+ "bytes": "AwAAAO7/wAAcBgAAobC5EkAOAABksAWiXBQAAA=="
+ },
+ "payload_commitment": "HASH~u-mEo1mwByROUhnvO7pBFitcD0UEvruK-b8WONkKoCLQ",
+ "timestamp": 789
+}
\ No newline at end of file
diff --git a/data/l1_block.bin b/data/l1_block.bin
new file mode 100644
index 000000000..ecffa9fdc
Binary files /dev/null and b/data/l1_block.bin differ
diff --git a/data/messages.bin b/data/messages.bin
new file mode 100644
index 000000000..a3962ad3d
Binary files /dev/null and b/data/messages.bin differ
diff --git a/data/messages.json b/data/messages.json
new file mode 100644
index 000000000..3a5a37686
--- /dev/null
+++ b/data/messages.json
@@ -0,0 +1,427 @@
+[
+ {
+ "kind": {
+ "Consensus": {
+ "General": {
+ "Proposal": {
+ "_pd": null,
+ "data": {
+ "block_header": {
+ "block_merkle_tree_root": "MERKLE_COMM~AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAQA",
+ "builder_commitment": "BUILDER_COMMITMENT~tEvs0rxqOiMCvfe2R0omNNaphSlUiEDrb2q0IZpRcgA_",
+ "builder_signature": null,
+ "chain_config": {
+ "chain_config": {
+ "Left": {
+ "base_fee": "0",
+ "chain_id": "35353",
+ "fee_contract": null,
+ "fee_recipient": "0x0000000000000000000000000000000000000000",
+ "max_block_size": "10240"
+ }
+ }
+ },
+ "fee_info": {
+ "account": "0x0000000000000000000000000000000000000000",
+ "amount": "0"
+ },
+ "fee_merkle_tree_root": "MERKLE_COMM~AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAKA",
+ "height": 0,
+ "l1_finalized": null,
+ "l1_head": 0,
+ "ns_table": {
+ "bytes": "AAAAAA=="
+ },
+ "payload_commitment": "HASH~AazstQer_ho1SqgGT0r10_Gs0BnjfbPBHJdSO3HHbp29",
+ "timestamp": 0
+ },
+ "justify_qc": {
+ "_pd": null,
+ "data": {
+ "leaf_commit": "COMMIT~eaBGKF8-lw-t211wxLq7tcXEEqacbvDVcFFR9aCddO3G"
+ },
+ "signatures": null,
+ "view_number": 0,
+ "vote_commitment": "COMMIT~0-ZxNgMSsUEPeGDdq5-TZE8PDsYwgI4O2fVGMKooP87D"
+ },
+ "proposal_certificate": {
+ "Timeout": {
+ "_pd": null,
+ "data": {
+ "view": 0
+ },
+ "signatures": null,
+ "view_number": 0,
+ "vote_commitment": "COMMIT~TZG1F34lxU6Ny9aKQMkjZAxjW9zotdwW75EHEGbyALOi"
+ }
+ },
+ "upgrade_certificate": {
+ "_pd": null,
+ "data": {
+ "decide_by": 0,
+ "new_version": {
+ "major": 1,
+ "minor": 0
+ },
+ "new_version_first_view": 0,
+ "new_version_hash": [],
+ "old_version": {
+ "major": 0,
+ "minor": 1
+ },
+ "old_version_last_view": 0
+ },
+ "signatures": null,
+ "view_number": 0,
+ "vote_commitment": "COMMIT~roiQgLLeI4uYqYxjz-0jPwtLyNhSlnfriPEVZ-_4RUrW"
+ },
+ "view_number": 0
+ },
+ "signature": "BLS_SIG~g3CUcLMD7fnDsBhItKvSqXLwEqdWfvusSrgpL1GBAxf-SWFW0t32Agt2jrOiempjjpI7dBwYGgXv-0mvI4sGEEE"
+ }
+ }
+ }
+ },
+ "sender": "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U"
+ },
+ {
+ "kind": {
+ "Consensus": {
+ "General": {
+ "Vote": {
+ "data": {
+ "leaf_commit": "COMMIT~eaBGKF8-lw-t211wxLq7tcXEEqacbvDVcFFR9aCddO3G"
+ },
+ "signature": [
+ "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U",
+ "BLS_SIG~g3CUcLMD7fnDsBhItKvSqXLwEqdWfvusSrgpL1GBAxf-SWFW0t32Agt2jrOiempjjpI7dBwYGgXv-0mvI4sGEEE"
+ ],
+ "view_number": 0
+ }
+ }
+ }
+ },
+ "sender": "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U"
+ },
+ {
+ "kind": {
+ "Consensus": {
+ "General": {
+ "ViewSyncPreCommitVote": {
+ "data": {
+ "relay": 0,
+ "round": 0
+ },
+ "signature": [
+ "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U",
+ "BLS_SIG~g3CUcLMD7fnDsBhItKvSqXLwEqdWfvusSrgpL1GBAxf-SWFW0t32Agt2jrOiempjjpI7dBwYGgXv-0mvI4sGEEE"
+ ],
+ "view_number": 0
+ }
+ }
+ }
+ },
+ "sender": "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U"
+ },
+ {
+ "kind": {
+ "Consensus": {
+ "General": {
+ "ViewSyncCommitVote": {
+ "data": {
+ "relay": 0,
+ "round": 0
+ },
+ "signature": [
+ "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U",
+ "BLS_SIG~g3CUcLMD7fnDsBhItKvSqXLwEqdWfvusSrgpL1GBAxf-SWFW0t32Agt2jrOiempjjpI7dBwYGgXv-0mvI4sGEEE"
+ ],
+ "view_number": 0
+ }
+ }
+ }
+ },
+ "sender": "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U"
+ },
+ {
+ "kind": {
+ "Consensus": {
+ "General": {
+ "ViewSyncFinalizeVote": {
+ "data": {
+ "relay": 0,
+ "round": 0
+ },
+ "signature": [
+ "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U",
+ "BLS_SIG~g3CUcLMD7fnDsBhItKvSqXLwEqdWfvusSrgpL1GBAxf-SWFW0t32Agt2jrOiempjjpI7dBwYGgXv-0mvI4sGEEE"
+ ],
+ "view_number": 0
+ }
+ }
+ }
+ },
+ "sender": "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U"
+ },
+ {
+ "kind": {
+ "Consensus": {
+ "General": {
+ "ViewSyncPreCommitCertificate": {
+ "_pd": null,
+ "data": {
+ "relay": 0,
+ "round": 0
+ },
+ "signatures": null,
+ "view_number": 0,
+ "vote_commitment": "COMMIT~OQecZxfFpuEuPJgkpsQoglnqY0fm6Qi1PUarYCgiFQ0T"
+ }
+ }
+ }
+ },
+ "sender": "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U"
+ },
+ {
+ "kind": {
+ "Consensus": {
+ "General": {
+ "ViewSyncCommitCertificate": {
+ "_pd": null,
+ "data": {
+ "relay": 0,
+ "round": 0
+ },
+ "signatures": null,
+ "view_number": 0,
+ "vote_commitment": "COMMIT~POgBCaDjtUV3Il5-FXVr5KN2KzYSgipfKX6Ci0-nxduO"
+ }
+ }
+ }
+ },
+ "sender": "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U"
+ },
+ {
+ "kind": {
+ "Consensus": {
+ "General": {
+ "ViewSyncFinalizeCertificate": {
+ "_pd": null,
+ "data": {
+ "relay": 0,
+ "round": 0
+ },
+ "signatures": null,
+ "view_number": 0,
+ "vote_commitment": "COMMIT~s5i9wmQWH7VU90CUiEWRdAG19LI1iXydSMxp9gZ7kHco"
+ }
+ }
+ }
+ },
+ "sender": "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U"
+ },
+ {
+ "kind": {
+ "Consensus": {
+ "General": {
+ "TimeoutVote": {
+ "data": {
+ "view": 0
+ },
+ "signature": [
+ "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U",
+ "BLS_SIG~g3CUcLMD7fnDsBhItKvSqXLwEqdWfvusSrgpL1GBAxf-SWFW0t32Agt2jrOiempjjpI7dBwYGgXv-0mvI4sGEEE"
+ ],
+ "view_number": 0
+ }
+ }
+ }
+ },
+ "sender": "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U"
+ },
+ {
+ "kind": {
+ "Consensus": {
+ "General": {
+ "UpgradeProposal": {
+ "_pd": null,
+ "data": {
+ "upgrade_proposal": {
+ "decide_by": 0,
+ "new_version": {
+ "major": 1,
+ "minor": 0
+ },
+ "new_version_first_view": 0,
+ "new_version_hash": [],
+ "old_version": {
+ "major": 0,
+ "minor": 1
+ },
+ "old_version_last_view": 0
+ },
+ "view_number": 0
+ },
+ "signature": "BLS_SIG~g3CUcLMD7fnDsBhItKvSqXLwEqdWfvusSrgpL1GBAxf-SWFW0t32Agt2jrOiempjjpI7dBwYGgXv-0mvI4sGEEE"
+ }
+ }
+ }
+ },
+ "sender": "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U"
+ },
+ {
+ "kind": {
+ "Consensus": {
+ "General": {
+ "UpgradeVote": {
+ "data": {
+ "decide_by": 0,
+ "new_version": {
+ "major": 1,
+ "minor": 0
+ },
+ "new_version_first_view": 0,
+ "new_version_hash": [],
+ "old_version": {
+ "major": 0,
+ "minor": 1
+ },
+ "old_version_last_view": 0
+ },
+ "signature": [
+ "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U",
+ "BLS_SIG~g3CUcLMD7fnDsBhItKvSqXLwEqdWfvusSrgpL1GBAxf-SWFW0t32Agt2jrOiempjjpI7dBwYGgXv-0mvI4sGEEE"
+ ],
+ "view_number": 0
+ }
+ }
+ }
+ },
+ "sender": "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U"
+ },
+ {
+ "kind": {
+ "Consensus": {
+ "Da": {
+ "DaProposal": {
+ "_pd": null,
+ "data": {
+ "encoded_transactions": [
+ 1,
+ 0,
+ 0,
+ 0,
+ 3,
+ 0,
+ 0,
+ 0,
+ 1,
+ 2,
+ 3
+ ],
+ "metadata": {
+ "bytes": "AQAAAAEAAAALAAAA"
+ },
+ "view_number": 0
+ },
+ "signature": "BLS_SIG~g3CUcLMD7fnDsBhItKvSqXLwEqdWfvusSrgpL1GBAxf-SWFW0t32Agt2jrOiempjjpI7dBwYGgXv-0mvI4sGEEE"
+ }
+ }
+ }
+ },
+ "sender": "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U"
+ },
+ {
+ "kind": {
+ "Consensus": {
+ "Da": {
+ "DaVote": {
+ "data": {
+ "payload_commit": "HASH~AazstQer_ho1SqgGT0r10_Gs0BnjfbPBHJdSO3HHbp29"
+ },
+ "signature": [
+ "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U",
+ "BLS_SIG~g3CUcLMD7fnDsBhItKvSqXLwEqdWfvusSrgpL1GBAxf-SWFW0t32Agt2jrOiempjjpI7dBwYGgXv-0mvI4sGEEE"
+ ],
+ "view_number": 0
+ }
+ }
+ }
+ },
+ "sender": "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U"
+ },
+ {
+ "kind": {
+ "Consensus": {
+ "Da": {
+ "DaCertificate": {
+ "_pd": null,
+ "data": {
+ "payload_commit": "HASH~AazstQer_ho1SqgGT0r10_Gs0BnjfbPBHJdSO3HHbp29"
+ },
+ "signatures": null,
+ "view_number": 0,
+ "vote_commitment": "COMMIT~5E3F3rC4E9DBhMBqOTmjZ9tjX4VFaV5gqrZJl0y6V05D"
+ }
+ }
+ }
+ },
+ "sender": "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U"
+ },
+ {
+ "kind": {
+ "Consensus": {
+ "Da": {
+ "VidDisperseMsg": {
+ "_pd": null,
+ "data": {
+ "common": {
+ "all_evals_digest": "FIELD~rF4TMFZMXJCieDeov31aNuDG5nDGR-iQdteEgBjXkErn",
+ "multiplicity": 1,
+ "num_storage_nodes": 1,
+ "payload_byte_len": 11,
+ "poly_commits": "FIELD~AQAAAAAAAAD2xsICwO-z0CXx_ucl0FV1j-zJ3tgPO-OL8gYLvXkIkNE"
+ },
+ "payload_commitment": "HASH~Z03vXeC1EEaBGf5iacsBEWYiA7PHi3K6uS9gVpmlUx3t",
+ "recipient_key": "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U",
+ "share": {
+ "aggregate_proofs": "FIELD~AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQGY",
+ "evals": "FIELD~AQAAAAAAAAABAAAAAwAAAAECAwAAAAAAAAAAAAAAAAAAAAAAAAAAAMk",
+ "evals_proof": {
+ "pos": "FIELD~AAAAAAAAAAD7",
+ "proof": [
+ {
+ "Leaf": {
+ "elem": "FIELD~AQAAAAAAAAABAAAAAwAAAAECAwAAAAAAAAAAAAAAAAAAAAAAAAAAAMk",
+ "pos": "FIELD~AAAAAAAAAAD7",
+ "value": "FIELD~rF4TMFZMXJCieDeov31aNuDG5nDGR-iQdteEgBjXkErn"
+ }
+ }
+ ]
+ },
+ "index": 0
+ },
+ "view_number": 0
+ },
+ "signature": "BLS_SIG~g3CUcLMD7fnDsBhItKvSqXLwEqdWfvusSrgpL1GBAxf-SWFW0t32Agt2jrOiempjjpI7dBwYGgXv-0mvI4sGEEE"
+ }
+ }
+ }
+ },
+ "sender": "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U"
+ },
+ {
+ "kind": {
+ "Data": {
+ "SubmitTransaction": [
+ {
+ "namespace": 1,
+ "payload": "AQID"
+ },
+ 0
+ ]
+ }
+ },
+ "sender": "BLS_VER_KEY~bQszS-QKYvUij2g20VqS8asttGSb95NrTu2PUj0uMh1CBUxNy1FqyPDjZqB29M7ZbjWqj79QkEOWkpga84AmDYUeTuWmy-0P1AdKHD3ehc-dKvei78BDj5USwXPJiDUlCxvYs_9rWYhagaq-5_LXENr78xel17spftNd5MA1Mw5U"
+ }
+]
\ No newline at end of file
diff --git a/data/ns_table.bin b/data/ns_table.bin
new file mode 100644
index 000000000..02a363d7c
Binary files /dev/null and b/data/ns_table.bin differ
diff --git a/data/ns_table.json b/data/ns_table.json
index 767edc5b0..146b543fd 100644
--- a/data/ns_table.json
+++ b/data/ns_table.json
@@ -1,3 +1,3 @@
{
- "bytes": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
-}
+ "bytes": "AwAAAO7/wAAcBgAAobC5EkAOAABksAWiXBQAAA=="
+}
\ No newline at end of file
diff --git a/data/payload.bin b/data/payload.bin
new file mode 100644
index 000000000..806d83c2a
Binary files /dev/null and b/data/payload.bin differ
diff --git a/data/payload.json b/data/payload.json
new file mode 100644
index 000000000..2387c7aa4
--- /dev/null
+++ b/data/payload.json
@@ -0,0 +1,6 @@
+{
+ "ns_table": {
+ "bytes": "AwAAAO7/wAAcBgAAobC5EkAOAABksAWiXBQAAA=="
+ },
+ "raw_payload": "BgAAAAABAAAAAgAAAAMAAAAEAAAABQAAAAYAAF2eIXFMYkyrHrYISOdpUPxLq2dgmfDilwq9z71rSHb2xcbmS2nim/Ak33mSXGqypeXatObNfgf921YXBvra9Z/oPCq6AEfRmM5J+ZKvcX4URjpPP/AvIPcF3PmLmF/kgyq1cPnT/lQPW5Z9Nb4ka3C1IqLMBqqmNxca+jwWrXOXtaj/VTrLdtRleItPSrcC9ShFVqMk4NJrFe9i6LiuDYom7JdoIeitb+le/x4cl3koNvqFcmVY3013dIXijRwffVUQHWATDTBLMJRTtTiA9gTg+Dl4gsboJzOzlKjaqEgNUouP/E/YMHdTVgUvz3TyvPOCxePq9xg0yeNT8BDKA+kPUd5oezPOoFRQum/hkAidqKl453/BTMpijENApkbiy/s0FV7kT2CyBp+kMHNdVO7IK4JyCO4Mj1HBxtcFaNjhXNg7QAXB0c8t/9E4DhvDU1YX9UB8mSqCRrq35BXOFHRDmMFaXj/WWWMZkeUHeAQZF7Y8k4cHnImIhdZg532eg6QcPNwuHgCdLQOnoZteoZWKoMloJvpS1xcRusvh8Y4wV4L1eURLQLq8eva5UTFs6LzRyPQZ6EOlZvrMTlunRwCGBT5lGiyX3wWGY2m2JWfhR+rlccHcUlwb43d40VkXY3oVg4eR4nWS9eBaqkjHXYuQaX0INhMYV+byHlUn7wJkqiHjp3hY0xts2yr/mjCkUeScU9vG7C+x5lg8r+RDFox1OaF7s9/jYcDEXLZzfyrX5iE8x9ot6A+E6W5rp1Ek/ymkRvK3rr7DmTvGrRpgNfSndlb2FsH7Vu1lnYsE/mNEMwwbhjTrRI1qoWRNdkrJYUZsTOw4NM6SfN0wvZ4PVtTlFb97KvWd5b/y5f9WoGEbqunvtky528CtZyn3e44a0Rd9ECWhYifqb9L7R+D8yGm8NePNpyiAx2TdlX4Su4eN/VeHV04moVpH8ygXKKhMNX2KpDqu7sVB4T5/wUZNOCyvdzoQsZ7ot8JVOol4qLvegxsm/VbK4tQKmzeC/2tXleHPHSl8Nxsd+chgyAGJTuAH8EdCO3vJHSf7BqWzcDAeyz7tWe2sDkW0XJAco+uepk6bISMHItKAdO9tsaf+XMOdrg2lPghOYD2baTpvaF9d9jFZL+P5T+2LwRbKkID3WSC2vt7Ipq5KKsrMoGAzZO+AMOIQJQbGhta8YHLaz7hWrrpfzThxipZnBaGmjeKUMP7aJD4pP0uA5VFbtLYuiXFFh86rq0ovBZFMIe1d99EmksRPhFS1TwG2BjBkvMCjNI7eHYU1/yXvB35UfCNr8hEiaMvfOZ4ZUIzoBymPQtTIhaW/vPGR/4cDt0anBEZ8/4tdyaswCW9tTzfecNzzlt37ymGIDDGsH5UAlM4Th5TDYi+G5rHreV6cwIkaKKwTkVmAwG1eG51EYyO9NKdV1ikjdemEonxX9E4h3ZYZziwlNWCigg5eeo96cqMWL562APWSiyp0ARGlKGLUbrTLeQ8vuEbOOZqiOffH7Lnp24hDGhuUiPeARi15iru4e7YMPjpLD3D38jZHh+wo1BcdA2LWsOGCstaPKaQIgdyDD2xt846nIv6g4ozCsPmVXIBjJ46xvZkFbmmKFXQ0ZfopR2CGqAkAqbo/2EklZzo0kPQNlqDb2gDGafEDC4ND+mBTilxklxx354LlwTO/70S/CJrIs2kQgBPwyblcOguKfJpSLE0aYScDmLbqqIXWJTI6cmmKUf+RvYb+dhp9HGXSVkUpilYqkzRNz+NEwVTH9Afqh3PguK1YEXKINBwm0FMEstgeulTBCErnGYB2+XUdT4tKvC3XnQdsFthPW4VJ0Z8Wo1zt3uOlktbdUePvXLkUbWvaWJppmFidgFy1XBfD5mUyHMuaO7OsXMZHgCcAdx0OhqNAGKhLeN14LeiA8LaBJEV6SGqLy0fh5Vj501jGT+Z8PJ7MKZ38o1q+zUY+q/NnbRnRROTZZCSSAjbo+VosW3arhJeNeFHlABDaalv1GxCY3KIq5/nPK6sPBkIRIIumGXMYDJ9N+vF7rlgeCB+VgQgAAAAAAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAM9kwJjeoi0EAJ6Ut9v7a/RueDt+T9TdqgR8o/fpx1WCUgOMGSTcPkOnP2NkuC2GLzV+zEIah3u4xPLjQ1lRZHr2yTAf2B3rtETPpqvYr065U/AobcXdWD3vdMivApM/emVjgu7qFboSXYCBPmr2qqCZndfCcilnWV9sAgns2CfpFFNcWxr6O0tvSChdJC0As3r1Edye2ep7erYCjTZlPFaSykV/QY+A60JWHr81x+0l8/sP/AM0X7uZPh8JSfuPPJJ3Shz8E0W0DHyKcJInJkus4JGGOSIF3xU2OtZTH2YDvpZmkhFKVTAiig7YzN5DAv+aRsmOiNVCbu4jDm6nMqkMjyEolLrO7aPLZUtXr6O8BAUCprmDe0o0TdCR+8pWgGLDQyf3z7Yvo4n7+oNS8j+D0R2zBqyToAnMwOkAecJYvUr27OlzXvEcmAGStoz1A+OngS+3gHIwAMQOrDjwiUra5NausPZ7CbfcuY3FBY8pFrBY/4IkTKql55InYmQTFhQHj5YLFbzHbdZOJpYybVk0OkntRe6OEEQVuo8ivUVHr3lmABW4LT+Xpceqie5i6dqh87b+TqqnNcyEUo66TFOPJWRjVeC8v/Hoy05WnM098DsBMjGvmrFe/9JNQowEnh1XzpjiUHGuHpJPlAo+221hkTaXRve2th1mXmFSzy5fVziicoKc0YVOM3qEmyI2u/ZFXYaGCmWeigQ0mq3JJuKGZXrcfxTivGHXoa4VwELGpxero1XnEwO11rggj/wg8N8jh1UHjdevZiHJOZUuGuve11dSqe5KUdG6ty0exPWWdMiohVJ+coEz98GheJDDGjBFOcF/q1rTcNWRVURpeDx8oxkQ3/E8fwxD76lG8snJjNip/CcFDiDI8orkn6cQsnMybACRf0kKzAAnitxWIuzuvVB99tJ/iDUD+U5fplD5w2ER2Q0kRVLYxEjwdNr/5nzJjHoVehLYupVYvT1hMF+8iQQJfyex4ZeSUeD48p7UEy9IG9JolNVKIH+YpGfR5WU/nfWbieWQtUR+DGGv6CQB20Pztd20I4z/+NcWnFOddFRT51GK8T++Ot7h5jKsaEReI5kKChnPUwA0ZB8GGmKfTC1UOUGESv2l+r5pfSp/st+mT0s9iLcIiBqxzazIlcsAFG/RjpS+UXTC0Vn6ut37XtxSGprSYc4zByNOHW40Wl27pErIEmpivjBgTuI1ta02YAlUcN/AMIDxBq9KcsZMCHnBb11fCU7s+EZCgKWPzXnpwbstf+zMOtMiwwJdiEKq//xbmrK3/JFuXfaomDzQJXsq4OIvGuDZuV3TcXn925y4sqvqwhjGzDZNi4JBzc4o3+4GiyrF6Lz6k0A7G6Ivvb4ZawTJ4IKO99+1rgTKrCrnlTU7DbZssIxSnwH2qW48y+FirOUYH9jwn4gfI6KYAbOmjejZsU7X44sHaGEzNjqXZ3Vb57gUW7vK/cSsuKXDnB8q5bCiudg9BuLz1cuPwAQ4d7NRRJujYeAF+H8Upsmer6sgfl5SvWLzxxkpkz4NcMdH5IJ8Ll9UwoD3/14DOz6EX2drBl075iejXBE0ViBty/CSt0FD1+3tvJbObV3dqq4PrGyEDdp1rg8pVrTtCq6BNEEWM/9n1WRPYFBI6nKMIyqXslNNssZJ4Eya1bwXPxVJxTevGKbsbKFAwFiLq0JzQe2BecfHKGpmvZAjJ54vXwaRVEmbuE6Sw47ec0s4jLAqZ8FMWcxCMho6vcINVeJFll0UZLZSTd8u67tBsHCrXsa54fwwTZ/tL2IayrBa2+y4zgDU6mf/PXBDxn5rUHcqK/LUwxdOvVvFst/HImU0ty8Y+F8eHkTocENVRVTNxPJ2UGQX8DXguv33WQ+kNjO7vY8V18BPTWZYC4Jf3GY2FvAGGr6jGbrAD9/Wb7zetKhS6zrbOnz2KOSJabYRpaNj85+5mALigd9unzZd2evLiX9CZCu/cVwZKoQZw6L4tKYwx5tA9M3qcKvZMNpDxURGStPwpiXnFiAa0+kZ+ugMH9IiEWQyCEInXBMUskVu7+rVs6HqFarEcQGhi3VSxl7S2/PG6K7mNzgBZzgWMeXpAixkWd6zjYESBLsFe6GsYHQjYNq4z0Jjv5Rjx3IOgtbNUZehBkcI+zmpbqf3tv1odmHtxpL/hVgBG2NvWdE+q2OtDaz3JOVZ27Pf6kf0glHhnaPpDDfbjfTygd7B4LFli5k+ED2bMc5264Oa+N2yWRLqhorqibx0L2Y/KzjOVh+qCinziGmfIGVMEhiMJB/SaAw4PMVg7dR+N0C4bHHJBQS8MPv6aydBmPYm9j9kh8ee6pFYqvXgwdXebkJS8j1D1vHb9g3ndhsr4J6x+u0GrlHz1J4cyivM4HG1GqixkW2pCiB3Fh4dEIUeJsUemr0hB9dMdbOC0WBn42Xc6v8MP9gnIrHhCueK7CleMPMjS38E5MgVas0GerM4cGLMBxvjL30zdcBAeMZdRaPR8WQbw5B4jwY93C6LKcxO+gWix02aa0i5ZDcHZY3IjZV7fxy3vvtEs/qxXMto8gLK8I7kjDAblmAIV5yleBUgQ8pzw6BkqbK2/AA6cJcAg7gJUVAA6wT9fsrAUgiMcWuf1+DSSVrBK/FXa7AY5X/PGPaWeZdOCLs1ncGLrVmOSNCFfCWT/5UYvh952uFc+/SghFcdEyQ2bznu9S55FpNFVQ29Ia10aeYMffzonMx+eT01BgAAAAABAAAAAgAAAAMAAAAEAAAABQAAAAYAAKLQrjdgptCHUAMU4Epx9OxmKmeD0v9LZ4yGEf3K9lgBYxrATdQAzMHtZ9GmmubMEgpTgWew4elHoHC7Cw9H889c2Z86VqYBGQ+8xlYRQjy9W5IQtu5SddmMIgUzoBx2itmtCyrthgf79qAInSyQwaJrKiuRRq16wwwoa5j3YQr3AOfrjR+kglN/K8prXBIN8YYJxLi+ntqQ2B5mvIY+3yy+mDsrI2BvS9dcfaAPi+x7V1AgwzXpEvA5Hh/rp3e4WfbH5cUjdubwUr8Qx/a7RUb9jMDZvBm2aKuX5p0kVpntV9nVt2p/fKJ4sXqguB2dHhcU3o5OWMyelM/3qFkLAFKWhRA8XRm7jjQAN7B1+ZtmaPqQIsSza0ToJiYzUR3K/5yy52gfFTwa5G4dpFqRFz+GSTBn/ZiMXLHfZcJwa/ILkNRGSqEj6TFBXYJPaMhrTz6JeA43PcD2x8OF6vKgunyd+HPh3Vi1Mm5UY0q8HHoiZpJ5g+kKKT3dAxS2LekFg+fsDdphawltbsoCeIDHKmLIQ0OEHoB4Y13bb96RzZHFKMRUgGSommgmsEA/yoS20e4wWU1uEv7DcM4PQ75QsntW1296s4DBkHAV0JIe/zetUPnMK/pj4DTlluQR74BPvYmCd6PNdwm8Nw9Y+luvmNm63A3BemUg0yOJV+xC6Lp6i8NuBuwpS2ICoQW/aKNgnBrX0msaee9YhzKiV0gBBjCibHdJNFnWDUBwYJQZc4fdJtgE5gIyTi7UMjgQz65QKbIrCv+jtFmkBN89VflXl1616Cn/9AxGXABurhggbm7QajQpBjJtLaFmSJxHc6/39v+bWHfQFs7Xoi3hDFf1Lk6G+x+972g0ThDI1eZVYaRckd6u1Hg/M8f5GC/J9Ib4RTGHIgAbFfs/CRA7LcSiGY9PEZxSUhMMRhiexEw4x0bkeb8lrsy14aBsM45krvzGWBlJMKRGMtuvsBA3dU+GCjU9+savW/QEIjhm7sWfkvKLcqVreKl1HFHdsB/iKMfHU5Lfd917BM9ip0oOe8y4GLDCscgs/6lUTzO0g30OzZVvlsdOk2pSNRbrbrnhy6HCGsxPxAYuyIJ93ZmHaZ+hEiq1KgISHq7bIxV7ffUEZIZ3+RyTWsvJGB82C027X1NXcrLRtmfJ9L9oUask0rqNz7elKvd8FFET54rUaDOx/dorXjMwoWuxHnViT+jYwsSA+73kiOA5H0Q4y0XT6F58/wo7JSR3hS2PQNPtsuLgX4ZIadYn4njN3w7Uocuz48iw/JYLIM+AlrW16RgduDVr0YhVIcMVAeeeizNM/wkfulryWH5LvDqJ6oH6ir9b5NX5f82FPE7o2p7shS1I02wV3zPpoqcOn4C1z9LC1V0twA4xSRyQc0nmcWZMpIR3/IkSIMRdMa/OB2WsJza/u+DOzJ6HcDfLtqNNIpm/ksVqJiQWkl48B2rCv26KDkRwXFoLopuT2KRlB1kRFew7lNRaTQesbiGMrYFd98AHjDJzuA6197J5c7XgRA7EVaFK72Rbzsudh2oHun/ninbEHNDvEtYrBlZszVJ48a+EL8X/r8gMwoi7Wq33dhwFaDmIezr0/A9RjJELXTEtczYQwt3SP/vkSqjqwbC0LNJVsvoqf8QpkTmfBFyEtakDYgSqOqAei92d3d1yBIq+HFQu4wy83N25zw3fSMJXJixQwp7QEIScYLxQP/9Q3NGiV1QtxGUMdu1bGVTvjcvmNx6sezGBjleuHUBYlF9+y8yVWc3dOyQ9EqEMomqZ4fkeBvNgElGjPTH2SA9nl0ZVKM4EgQ1cvRUYwBWtFYkrfcZquK/G6+/REOOB4Q+xIIcxbsrzCI0DYsFLllEVKIfWLbdJH2WwWINsP96rBhh3aLnTeM0srC3IuZfjI+wgpXnEyMqdWJ1rqjrkMBZHvjecJmWaUhFFmBE22RGJ544P1PsMp/pVEFPGMdb+sSuqhuA88XnuYKI8ENxLXXTHE/to1mQ9khDnpntjARASxeSAFmEddAmrfSoh9JV3P49YR8QBlWAyVPt/aw=="
+}
\ No newline at end of file
diff --git a/data/transaction.bin b/data/transaction.bin
new file mode 100644
index 000000000..9f086e390
Binary files /dev/null and b/data/transaction.bin differ
diff --git a/data/transaction.json b/data/transaction.json
index 201c1350e..df1071171 100644
--- a/data/transaction.json
+++ b/data/transaction.json
@@ -1,4 +1,4 @@
{
- "namespace": 12648430,
- "payload": "TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4gRG9uZWMgbGVjdHVzIHZlbGl0LCBjb21tb2RvIGVnZXQgdGVsbHVzIHZpdGFlLCBtb2xlc3RpZSBtYXhpbXVzIHR1cnBpcy4gTWFlY2VuYXMgbGFjdXMgbWF1cmlzLCBhdWN0b3IgcXVpcyBsYWN1cyBhdCwgYXVjdG9yIHZvbHV0cGF0IG5pc2kuIEZ1c2NlIG1vbGVzdGllIHVybmEgc2l0IGFtZXQgcXVhbSBpbXBlcmRpZXQgc3VzY2lwaXQuIERvbmVjIGVsaXQgbGVjdHVzLCBkYXBpYnVzIGluIGlwc3VtIGV0LCB2aXZlcnJhIHBoYXJldHJhIGZlbGlzLiBTZWQgc2VkIHNlbSBzZWQgbGliZXJvIHNlbXBlciBwb3N1ZXJlLiBVdCBldWlzbW9kIHB1cnVzIGF0IG1vbGVzdGllIHZvbHV0cGF0LiBOdW5jIGV1aXNtb2QgaWQgZXN0IG5lYyBldWlzbW9kLiBBbGlxdWFtIHF1aXMgZXJhdCBiaWJlbmR1bSwgZWdlc3RhcyBhdWd1ZSBxdWlzLCB0aW5jaWR1bnQgdGVsbHVzLiBEdWlzIGRhcGlidXMgYWMganVzdG8gdXQgcmhvbmN1cy4gTnVsbGEgdmVoaWN1bGEgYXVndWUgbm9uIGFyY3UgdmVzdGlidWx1bSB0ZW1wdXMuIER1aXMgdWxsYW1jb3JwZXIgc2l0IGFtZXQgbGFjdXMgZXQgZGlnbmlzc2ltLiBNYXVyaXMgYXVjdG9yIHNvbGxpY2l0dWRpbiBmZXVnaWF0LiBGdXNjZSB0aW5jaWR1bnQgY29uZGltZW50dW0gZGFwaWJ1cy4gQWxpcXVhbSBhcmN1IGxlY3R1cywgYmxhbmRpdCBzZWQgc2VtIHNpdCBhbWV0LCBmZXJtZW50dW0gdmVoaWN1bGEgbWV0dXMuIE1hZWNlbmFzIHR1cnBpcyBuZXF1ZSwgdHJpc3RpcXVlIGVnZXQgdGluY2lkdW50IHV0LCBzY2VsZXJpc3F1ZSBldSBsYWN1cy4gVXQgYmxhbmRpdCBldSBsZW8gdml0YWUgdm9sdXRwYXQu"
-}
+ "namespace": 12648430,
+ "payload": "vj8cymNUwpTPZMCY3qItBACelLfb+2v0bng7fk/U3aoEfKP36cdVglIDjBkk3D5Dpz9jZLgthi81fsxCGod7uMTy40NZUWR69skwH9gd67REz6ar2K9OuVPwKG3F3Vg973TIrwKTP3plY4Lu6hW6El2AgT5q9qqgmZ3XwnIpZ1lfbAIJ7Ngn6RRTXFsa+jtLb0goXSQtALN69RHcntnqe3q2Ao02ZTxWkspFf0GPgOtCVh6/NcftJfP7D/wDNF+7mT4fCUn7jzySd0oc/BNFtAx8inCSJyZLrOCRhjkiBd8VNjrWUx9mA76WZpIRSlUwIooO2MzeQwL/mkbJjojVQg=="
+}
\ No newline at end of file
diff --git a/data/tx_index.bin b/data/tx_index.bin
new file mode 100644
index 000000000..efdcb0dd8
Binary files /dev/null and b/data/tx_index.bin differ
diff --git a/data/tx_index.json b/data/tx_index.json
new file mode 100644
index 000000000..0c24f617f
--- /dev/null
+++ b/data/tx_index.json
@@ -0,0 +1,14 @@
+{
+ "ns_index": [
+ 2,
+ 0,
+ 0,
+ 0
+ ],
+ "tx_index": [
+ 5,
+ 0,
+ 0,
+ 0
+ ]
+}
\ No newline at end of file
diff --git a/doc/architecture.puml b/doc/architecture.puml
index b51d13463..c45e7edb7 100644
--- a/doc/architecture.puml
+++ b/doc/architecture.puml
@@ -1,82 +1,150 @@
@startuml
-component "HotShot Sequencer" as Seq
-package "Layer 2s" as L2 {
- component "Rollup 1" as L2_1 {
- component "API (e.g. JSON-RPC)" as L2_1_RPC
- component Executor as L2_1_Exec
- component Prover as L2_1_Prover
- component "State DB" as L2_1_State
+
+package "Espresso Sequencer Network" as Network #MistyRose {
+ component "Other\nSequencer\nNodes" as Nodes
+ package CDN {
+ component Broker
+ component Marshal
+ database KeyDB
}
- component "Rollup 2" as L2_2
- component "Rollup N" as L2_N
-}
-package "Layer 1" as L1 {
- component "Sequencer Contract" as Seq_L1
- package "Rollup Contracts" as L2_L1 {
- component "Rollup 1\nContract" as L2_1_L1
- component "Rollup 2\nContract" as L2_2_L1
- component "Rollup N\nContract" as L2_N_L1
+
+ 'CDN Layout
+ Broker -> KeyDB: state
+ KeyDB -> Marshal: state
+
+ component "Sequencer Node" as Seq #Bisque {
+ database "Postgres" as DB
+ package APIs #LightCyan {
+ component "Submit" as Submit
+ component "Hotshot\nEvents\nStream\n" as EventsStream
+ component "Catchup" as Catchup
+ component "Status"
+ component "Query" as Query
+ }
+ package HotShot {
+ component "Networking"{
+ component Libp2p
+ component "CDN Client"
+ }
+ component "HotShot Events" as Events
+ }
+
+ package State as State {
+ component "State Signer" as Signer
+ component "ValidatedState" as Validated
+ }
}
+ component "HotShot state\nprover service" as HSProver
+ component "HotShot state\nrelay service" as Relay
+ component "Builder" as Builder
}
-Client -up-> L2_1_RPC : Transactions\nState queries
-note right of link
-1. Many clients submit transactions
- to each L2 simultaneously (for
- clarity only one is shown)
+' Network
+Nodes <-up- Catchup: "missing\nstate" " "
+Nodes <-> Libp2p: consensus\nmessages
+"CDN Client" <--> CDN: consensus\nmessages
+Nodes <--> CDN: consensus\nmessages
+note top of link
+ 4. HotShot consensus
end note
-L2_1_RPC -> Seq : Transaction\nRollup 1 ID
+' HotShot state
+Signer --> Relay: state, signature
note top of link
-2. L2s forward transactions to sequencer.
+ 6. HotShot proving
end note
+Relay -> HSProver: state,\nsignature bundle
-Seq -down-> L2_1_Exec : Block
-Seq -down-> L2_2 : Block
-Seq -down-> L2_N : Block
-note right of link
-3. Sequencer produces blocks --
- ordered lists of transactions.
- L2s receive blocks and execute
- transactions for their rollup.
+' Builder
+Builder --> HotShot: Espresso block
+note top of link
+ 3. Leader
+ obtains
+ Espresso
+ block
end note
+EventsStream -> Builder: transactions
-Seq -down-> Seq_L1 : Block Commitment\nQC
-note right of link
-4. Sequencer posts succinct commitment
- to block to L1. Contract verifies proof
- of sequencing (Quorum Certificate)
- then stores the block commitment.
+' Events
+Networking <-up-> Events
+Events -up-> EventsStream: events
+Events -down-> Validated
+
+' Storage
+Query --> DB
+Validated -up-> DB
+DB --> Catchup: missing\nstate
+
+package "Layer 2s / Rollups" as L2s #LightYellow {
+ component "zk Rollup Z" as ZK #LightBlue {
+ component "API (e.g. JSON-RPC)" as ZK_RPC
+ component Executor as ZK_Exec
+ component Prover as ZK_Prover
+ ZK_RPC --[hidden]> ZK_Exec
+ ZK_RPC --[hidden]> ZK_Prover
+ }
+ component "Optimistic Rollup O" #LightGreen {
+ component "API (e.g. JSON-RPC)" as OR_RPC
+ component Proposer
+ component Challenger
+ OR_RPC --[hidden]> Proposer
+ OR_RPC --[hidden]> Challenger
+ }
+}
+package "Ethereum Layer 1" as L1 #LightGray {
+ package "Espresso Contracts" as Esp_L1 {
+ component "Light Client\nContract" as LC_L1
+ component "Fee\nContract" as Fee_L1
+ }
+ package "Rollup Contracts" {
+ component "zk Rollup Z\nContract" as ZK_L1
+ component "OR Rollup O\nContract" as OR_L1
+ }
+}
+
+' Transaction submission
+entity User
+User --> ZK_RPC : rollup transaction,\nstate queries
+note top of link
+ 2. Transaction submission
end note
+User --> OR_RPC
-L2_1_Prover -> L2_1_L1 : State\nProof
-L2_2 -down-> L2_2_L1 : State\nProof
-L2_N -down-> L2_N_L1 : State\nProof
-note right of link
-5. Rollups post updated state to L1.
- ZK-rollups include a proof.
+ZK_RPC --> Submit : "transaction" " "
+Submit -> Events: transaction
+Query -up-> ZK_Exec : " " "Espresso\nheader,\nnamespace\ntransactions"
+note top of link
+ 5. Rollup
+ block
+ production
end note
+Query -up-> Proposer: " " "Espresso\nheader,\nnamespace\ntransactions"
-Seq_L1 -> L2_L1
-note bottom of link
-6. Rollup contracts read certified sequence
- of block commitments from sequencer
- contract. Verify state transition proofs
- against this sequence (ZKR) or wait for
- fraud proof against this sequence (ORU).
+
+' L1 details
+HSProver -up-> LC_L1 : HotShot\nstate\nproof
+LC_L1 -up-> ZK_L1 : " " "HotShot\ncommitment"
+LC_L1 -up-> OR_L1 : " " "HotShot\ncommitment"
+
+' ZK proof
+ZK_Prover --> ZK_L1 : rollup state proof
+note top of link
+ 7. ZK Rollup
+ proving
+end note
+
+' OR dispute
+Proposer --> OR_L1: respond
+Challenger --> OR_L1: challenge
+note top of link
+ 8. OR dispute
+end note
+
+Builder -> Fee_L1: deposit\nether
+note top of link
+ 1. Fee
+ deposit
end note
+Fee_L1 --> Validated: fee\ndeposits
-' L2 1 details
-L2_1_RPC <-down- L2_1_State : Read state
-L2_1_Exec -down-> L2_1_State : Write state
-L2_1_Prover <-down- L2_1_State : Read State
-
-' Layout
-L2_1_RPC -[hidden]r-> L2_1_Exec
-L2_1 -[hidden]r-> L2_2
-L2_2 -[hidden]r-> L2_N
-L2_1_L1 -[hidden]r-> L2_2_L1
-L2_2_L1 -[hidden]r-> L2_N_L1
-L2 -[hidden]d-> L1
-Seq -[hidden]d-> L2
@enduml
diff --git a/doc/architecture.svg b/doc/architecture.svg
index 309240c0c..4836bc167 100644
--- a/doc/architecture.svg
+++ b/doc/architecture.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/doc/sequence-diagram.puml b/doc/sequence-diagram.puml
new file mode 100644
index 000000000..1e476c7e0
--- /dev/null
+++ b/doc/sequence-diagram.puml
@@ -0,0 +1,97 @@
+@startuml
+!pragma teoz true
+actor User
+
+box Layer 2s / Rollups #LightYellow
+ box "Optimistic Rollup O" #LightGreen
+ participant "API\n(RPC)" as orrpc
+ participant Proposer
+ participant Challenger
+ end box
+ box "ZK Rollup Z" #LightBlue
+ participant "API\n(RPC)" as zkrpc
+ participant "Prover" as rprover
+ participant "Executor" as executor
+ end box
+end box
+
+box "Ethereum L1" #LightGrey
+ participant "Rollup\nContract" as RC
+ participant "Light\nClient\nContract" as LC
+ participant "Fee\nContract" as fee
+end box
+
+box Espresso Sequencer Network #MistyRose
+ box Sequencer Node #Bisque
+ box APIs #LightCyan
+ participant "Submit\nAPI" as submit
+ participant "Query\nAPI" as query
+ end box
+ participant "HotShot\nEvents\nStream" as events
+ participant "Validated\nState" as ValidatedState
+ participant "State\nSigner" as signer
+ end box
+
+ participant Builder
+ participant "HotShot\nLeader" as leader
+ participant CDN
+ participant Libp2p
+ participant "HotShot\nreplicas" as replicas
+ participant "HotShot\nstate\nrelay\nservice" as relay
+ participant "HotShot\nstate\nprover\nservice" as prover
+end box
+
+group 1. Fee deposit
+ Builder -> fee: fee deposit
+end group
+
+group 2. Transaction submisssion
+ User -> orrpc: rollup O transaction
+ orrpc -> submit: transaction
+ User -> zkrpc: rollup Z transaction
+ zkrpc -> submit: transaction
+ events -> Builder: transactions
+end group
+
+group 3. Leader obtains Espresso block
+ Builder -> leader: available blocks
+ leader -> Builder: claim block
+end group
+
+group 4. HotShot consensus
+ leader <-> replicas: consensus messages
+ & leader <-> Libp2p:
+ & Libp2p <-> replicas:
+ & replicas -> CDN:
+ fee -> ValidatedState: credit fee deposit
+ ValidatedState -> ValidatedState: apply header\ncharge fee
+end group
+
+group 5. Rollup block production
+ query -> executor: Espresso header,\ntransactions in namespace
+ executor -> executor: verify\nnamespace\nproof
+ executor -> rprover: rollup block
+end group
+
+group 6. HotShot proving
+ signer -> relay: state, signature
+ relay -> prover: state,\nsignature bundle
+ prover -> "Light\nClient\nContract" as LC: proof
+ LC -> LC: verify
+end group
+
+group 7. ZK Rollup proving
+ rprover -> RC: rollup state proof
+ group verify
+ LC -> "Rollup\nContract" as RC: HotShot\ncommitment
+ end group
+end group
+
+group 8. Optimistic Rollup dispute
+ Challenger -> RC: challenge
+ loop until dispute resolved
+ Proposer -> RC: respond
+ LC --> RC: HotShot\ncommitment
+ Challenger -> RC: respond
+end group
+@enduml
diff --git a/doc/sequence-diagram.svg b/doc/sequence-diagram.svg
new file mode 100644
index 000000000..1b5bf3cd2
--- /dev/null
+++ b/doc/sequence-diagram.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/docker-compose.yaml b/docker-compose.yaml
index c92035744..ec1339e59 100644
--- a/docker-compose.yaml
+++ b/docker-compose.yaml
@@ -15,11 +15,27 @@ services:
- "./geth-config/genesis-default.json:/genesis.json"
- "./geth-config/test-jwt-secret.txt:/config/test-jwt-secret.txt"
- deploy-contracts:
+ deploy-sequencer-contracts:
image: ghcr.io/espressosystems/espresso-sequencer/deploy:main
+ command: deploy --only fee-contract
+ environment:
+ - ESPRESSO_SEQUENCER_L1_PROVIDER
+ - ESPRESSO_DEPLOYER_ACCOUNT_INDEX
+ - RUST_LOG
+ - RUST_LOG_FORMAT
+ - ASYNC_STD_THREAD_COUNT
+ depends_on:
+ demo-l1-network:
+ condition: service_healthy
+
+ deploy-prover-contracts:
+ image: ghcr.io/espressosystems/espresso-sequencer/deploy:main
+ command: deploy --use-mock-contract --only hotshot,light-client
environment:
- ESPRESSO_SEQUENCER_ORCHESTRATOR_URL
- ESPRESSO_SEQUENCER_L1_PROVIDER
+ - ESPRESSO_SEQUENCER_URL
+ - ESPRESSO_SEQUENCER_STAKE_TABLE_CAPACITY
- ESPRESSO_DEPLOYER_ACCOUNT_INDEX
- RUST_LOG
- RUST_LOG_FORMAT
@@ -27,7 +43,27 @@ services:
depends_on:
demo-l1-network:
condition: service_healthy
- orchestrator:
+ sequencer0:
+ condition: service_healthy
+ # Make sure this doesn't start until the other contracts have been deployed, since we use the same mnemonic.
+ deploy-sequencer-contracts:
+ condition: service_completed_successfully
+
+ fund-builder:
+ image: ghcr.io/espressosystems/espresso-sequencer/bridge:main
+ command: espresso-bridge deposit
+ environment:
+ - L1_PROVIDER=$ESPRESSO_SEQUENCER_L1_PROVIDER
+ - ESPRESSO_PROVIDER=http://sequencer1:$ESPRESSO_SEQUENCER_API_PORT
+ - CONTRACT_ADDRESS=0xa15bb66138824a1c7167f5e85b957d04dd34e468
+ - MNEMONIC=$ESPRESSO_BUILDER_ETH_MNEMONIC
+ - ACCOUNT_INDEX=$ESPRESSO_BUILDER_ETH_ACCOUNT_INDEX
+ - AMOUNT=1000000000000000000
+ - CONFIRMATIONS=1
+ depends_on:
+ deploy-sequencer-contracts:
+ condition: service_completed_successfully
+ sequencer1:
condition: service_healthy
orchestrator:
@@ -35,7 +71,7 @@ services:
ports:
- "$ESPRESSO_ORCHESTRATOR_PORT:$ESPRESSO_ORCHESTRATOR_PORT"
environment:
- - ESPRESSO_ORCHESTRATOR_BUILDER_URL=http://permissionless-builder:$ESPRESSO_BUILDER_SERVER_PORT
+ - ESPRESSO_ORCHESTRATOR_BUILDER_URLS=http://permissionless-builder:$ESPRESSO_BUILDER_SERVER_PORT
- ESPRESSO_ORCHESTRATOR_PORT
- ESPRESSO_ORCHESTRATOR_NUM_NODES
- ESPRESSO_ORCHESTRATOR_START_DELAY
@@ -49,7 +85,7 @@ services:
# different parts of the CDN
keydb:
image: docker.io/eqalpha/keydb:latest
- command: ["--requirepass", "changemeplease!!"]
+ command: [ "--requirepass", "changemeplease!!" ]
healthcheck:
# Attempt to PING the database
test: keydb-cli --pass changemeplease!! --raw incr PING
@@ -67,7 +103,7 @@ services:
- cdn-marshal
- -d
- redis://:changemeplease!!@keydb:6379
- - -b
+ - -b
- $ESPRESSO_CDN_SERVER_PORT
- -m
- 0.0.0.0:$ESPRESSO_CDN_SERVER_METRICS_PORT
@@ -81,16 +117,16 @@ services:
- RUST_LOG
- ESPRESSO_CDN_SERVER_METRICS_PORT
image: ghcr.io/espressosystems/espresso-sequencer/cdn-broker:main
- command:
- - cdn-broker
- - -d
- - redis://:changemeplease!!@keydb:6379
- - --public-advertise-endpoint
- - broker-0:1738
- - --private-advertise-endpoint
- - broker-0:1739
- - -m
- - 0.0.0.0:$ESPRESSO_CDN_SERVER_METRICS_PORT
+ command:
+ - cdn-broker
+ - -d
+ - redis://:changemeplease!!@keydb:6379
+ - --public-advertise-endpoint
+ - broker-0:1738
+ - --private-advertise-endpoint
+ - broker-0:1739
+ - -m
+ - 0.0.0.0:$ESPRESSO_CDN_SERVER_METRICS_PORT
depends_on:
keydb:
condition: service_healthy
@@ -101,16 +137,16 @@ services:
- RUST_LOG
- ESPRESSO_CDN_SERVER_METRICS_PORT
image: ghcr.io/espressosystems/espresso-sequencer/cdn-broker:main
- command:
- - cdn-broker
- - -d
- - redis://:changemeplease!!@keydb:6379
- - --public-advertise-endpoint
- - broker-1:1738
- - --private-advertise-endpoint
- - broker-1:1739
- - -m
- - 0.0.0.0:$ESPRESSO_CDN_SERVER_METRICS_PORT
+ command:
+ - cdn-broker
+ - -d
+ - redis://:changemeplease!!@keydb:6379
+ - --public-advertise-endpoint
+ - broker-1:1738
+ - --private-advertise-endpoint
+ - broker-1:1739
+ - -m
+ - 0.0.0.0:$ESPRESSO_CDN_SERVER_METRICS_PORT
depends_on:
keydb:
condition: service_healthy
@@ -122,10 +158,10 @@ services:
- RUST_LOG
- ESPRESSO_SEQUENCER_ORCHESTRATOR_URL
image: ghcr.io/espressosystems/espresso-sequencer/cdn-whitelist:main
- command:
- - cdn-whitelist
- - -d
- - redis://:changemeplease!!@keydb:6379
+ command:
+ - cdn-whitelist
+ - -d
+ - redis://:changemeplease!!@keydb:6379
depends_on:
keydb:
condition: service_healthy
@@ -138,7 +174,7 @@ services:
- "$ESPRESSO_STATE_RELAY_SERVER_PORT:$ESPRESSO_STATE_RELAY_SERVER_PORT"
environment:
- ESPRESSO_STATE_RELAY_SERVER_PORT
- - ESPRESSO_STATE_SIGNATURE_WEIGHT_THRESHOLD
+ - ESPRESSO_STATE_SIGNATURE_TOTAL_STAKE
- RUST_LOG
- RUST_LOG_FORMAT
- ASYNC_STD_THREAD_COUNT
@@ -150,11 +186,12 @@ services:
environment:
- ESPRESSO_PROVER_SERVICE_PORT
- ESPRESSO_STATE_RELAY_SERVER_URL
- - ESPRESSO_SEQUENCER_ORCHESTRATOR_URL
+ - ESPRESSO_SEQUENCER_URL
- ESPRESSO_STATE_PROVER_UPDATE_INTERVAL
- ESPRESSO_SEQUENCER_L1_PROVIDER
- ESPRESSO_SEQUENCER_ETH_MNEMONIC
- ESPRESSO_SEQUENCER_LIGHTCLIENT_ADDRESS
+ - ESPRESSO_SEQUENCER_STAKE_TABLE_CAPACITY
- MNEMONIC=$ESPRESSO_SEQUENCER_ETH_MNEMONIC
- ESPRESSO_SEQUENCER_STATE_PROVER_ACCOUNT_INDEX
- RAYON_NUM_THREADS=$PROVER_RAYON_NUM_THREADS
@@ -163,13 +200,13 @@ services:
- ASYNC_STD_THREAD_COUNT
- RAYON_NUM_THREADS
depends_on:
- orchestrator:
+ sequencer0:
condition: service_healthy
state-relay-server:
condition: service_healthy
demo-l1-network:
condition: service_healthy
- deploy-contracts:
+ deploy-prover-contracts:
condition: service_completed_successfully
sequencer0:
@@ -177,24 +214,27 @@ services:
ports:
- "$ESPRESSO_SEQUENCER_API_PORT:$ESPRESSO_SEQUENCER_API_PORT"
- "$ESPRESSO_SEQUENCER_HOTSHOT_EVENT_STREAMING_API_PORT:$ESPRESSO_SEQUENCER_HOTSHOT_EVENT_STREAMING_API_PORT"
- # Run the full API server with all modules, default storage
- command: sequencer -- http -- query -- catchup -- status -- submit -- hotshot-events
+ # Run the full API server with all modules, Postgres storage
+ command: sequencer -- storage-sql -- http -- query -- catchup -- status -- submit -- hotshot-events -- config
environment:
+ - ESPRESSO_SEQUENCER_GENESIS_FILE
- ESPRESSO_SEQUENCER_ORCHESTRATOR_URL
- ESPRESSO_SEQUENCER_CDN_ENDPOINT
- ESPRESSO_SEQUENCER_API_PORT
+ - ESPRESSO_SEQUENCER_MAX_CONNECTIONS
- ESPRESSO_SEQUENCER_HOTSHOT_EVENT_STREAMING_API_PORT
- ESPRESSO_SEQUENCER_STATE_PEERS=http://sequencer1:$ESPRESSO_SEQUENCER_API_PORT
- - ESPRESSO_SEQUENCER_STORAGE_PATH
+ - ESPRESSO_SEQUENCER_POSTGRES_HOST=sequencer-db-0
+ - ESPRESSO_SEQUENCER_POSTGRES_USER=root
+ - ESPRESSO_SEQUENCER_POSTGRES_PASSWORD=password
+ - ESPRESSO_SEQUENCER_POSTGRES_DATABASE=sequencer
- ESPRESSO_SEQUENCER_L1_PROVIDER
+ - ESPRESSO_SEQUENCER_L1_EVENTS_MAX_BLOCK_RANGE
- ESPRESSO_STATE_RELAY_SERVER_URL
- ESPRESSO_SEQUENCER_PRIVATE_STAKING_KEY=$ESPRESSO_DEMO_SEQUENCER_STAKING_PRIVATE_KEY_0
- ESPRESSO_SEQUENCER_PRIVATE_STATE_KEY=$ESPRESSO_DEMO_SEQUENCER_STATE_PRIVATE_KEY_0
- ESPRESSO_SEQUENCER_LIBP2P_BIND_ADDRESS=0.0.0.0:$ESPRESSO_DEMO_SEQUENCER_LIBP2P_PORT_0
- ESPRESSO_SEQUENCER_LIBP2P_ADVERTISE_ADDRESS=sequencer0:$ESPRESSO_DEMO_SEQUENCER_LIBP2P_PORT_0
- - ESPRESSO_SEQUENCER_PREFUNDED_BUILDER_ACCOUNTS
- - ESPRESSO_SEQUENCER_MAX_BLOCK_SIZE
- - ESPRESSO_SEQUENCER_BASE_FEE
- ESPRESSO_SEQUENCER_IS_DA=true
- RUST_LOG
- RUST_LOG_FORMAT
@@ -204,7 +244,7 @@ services:
condition: service_healthy
demo-l1-network:
condition: service_healthy
- sequencer-db:
+ sequencer-db-0:
condition: service_healthy
state-relay-server:
condition: service_healthy
@@ -214,30 +254,33 @@ services:
condition: service_healthy
marshal-0:
condition: service_healthy
+ deploy-sequencer-contracts:
+ condition: service_completed_successfully
sequencer1:
image: ghcr.io/espressosystems/espresso-sequencer/sequencer:main
ports:
- "$ESPRESSO_SEQUENCER1_API_PORT:$ESPRESSO_SEQUENCER_API_PORT"
- command: sequencer -- storage-sql -- http -- query -- catchup -- state
+ command: sequencer -- storage-sql -- http -- query -- catchup -- status -- state -- explorer
environment:
+ - ESPRESSO_SEQUENCER_GENESIS_FILE
- ESPRESSO_SEQUENCER_ORCHESTRATOR_URL
- ESPRESSO_SEQUENCER_CDN_ENDPOINT
- ESPRESSO_SEQUENCER_API_PORT
+ - ESPRESSO_SEQUENCER_MAX_CONNECTIONS
- ESPRESSO_SEQUENCER_API_PEERS=http://sequencer2:$ESPRESSO_SEQUENCER_API_PORT
- ESPRESSO_SEQUENCER_STATE_PEERS=http://sequencer2:$ESPRESSO_SEQUENCER_API_PORT
- - ESPRESSO_SEQUENCER_POSTGRES_HOST=sequencer-db
+ - ESPRESSO_SEQUENCER_POSTGRES_HOST=sequencer-db-1
- ESPRESSO_SEQUENCER_POSTGRES_USER=root
- ESPRESSO_SEQUENCER_POSTGRES_PASSWORD=password
+ - ESPRESSO_SEQUENCER_POSTGRES_DATABASE=sequencer
- ESPRESSO_SEQUENCER_L1_PROVIDER
+ - ESPRESSO_SEQUENCER_L1_EVENTS_MAX_BLOCK_RANGE
- ESPRESSO_STATE_RELAY_SERVER_URL
- ESPRESSO_SEQUENCER_PRIVATE_STAKING_KEY=$ESPRESSO_DEMO_SEQUENCER_STAKING_PRIVATE_KEY_1
- ESPRESSO_SEQUENCER_PRIVATE_STATE_KEY=$ESPRESSO_DEMO_SEQUENCER_STATE_PRIVATE_KEY_1
- ESPRESSO_SEQUENCER_LIBP2P_BIND_ADDRESS=0.0.0.0:$ESPRESSO_DEMO_SEQUENCER_LIBP2P_PORT_1
- ESPRESSO_SEQUENCER_LIBP2P_ADVERTISE_ADDRESS=sequencer1:$ESPRESSO_DEMO_SEQUENCER_LIBP2P_PORT_1
- - ESPRESSO_SEQUENCER_PREFUNDED_BUILDER_ACCOUNTS
- - ESPRESSO_SEQUENCER_MAX_BLOCK_SIZE
- - ESPRESSO_SEQUENCER_BASE_FEE
- ESPRESSO_SEQUENCER_IS_DA=true
- RUST_LOG
- RUST_LOG_FORMAT
@@ -247,6 +290,8 @@ services:
condition: service_healthy
demo-l1-network:
condition: service_healthy
+ sequencer-db-1:
+ condition: service_healthy
state-relay-server:
condition: service_healthy
broker-0:
@@ -255,6 +300,8 @@ services:
condition: service_healthy
marshal-0:
condition: service_healthy
+ deploy-sequencer-contracts:
+ condition: service_completed_successfully
sequencer2:
image: ghcr.io/espressosystems/espresso-sequencer/sequencer:main
@@ -262,20 +309,20 @@ services:
- "$ESPRESSO_SEQUENCER2_API_PORT:$ESPRESSO_SEQUENCER_API_PORT"
command: sequencer -- http -- catchup -- status
environment:
+ - ESPRESSO_SEQUENCER_GENESIS_FILE
- ESPRESSO_SEQUENCER_ORCHESTRATOR_URL
- ESPRESSO_SEQUENCER_CDN_ENDPOINT
- ESPRESSO_SEQUENCER_API_PORT
+ - ESPRESSO_SEQUENCER_MAX_CONNECTIONS
- ESPRESSO_SEQUENCER_API_PEERS=http://sequencer1:$ESPRESSO_SEQUENCER_API_PORT
- ESPRESSO_SEQUENCER_STATE_PEERS=http://sequencer3:$ESPRESSO_SEQUENCER_API_PORT
- ESPRESSO_SEQUENCER_L1_PROVIDER
+ - ESPRESSO_SEQUENCER_L1_EVENTS_MAX_BLOCK_RANGE
- ESPRESSO_STATE_RELAY_SERVER_URL
- ESPRESSO_SEQUENCER_PRIVATE_STAKING_KEY=$ESPRESSO_DEMO_SEQUENCER_STAKING_PRIVATE_KEY_2
- ESPRESSO_SEQUENCER_PRIVATE_STATE_KEY=$ESPRESSO_DEMO_SEQUENCER_STATE_PRIVATE_KEY_2
- ESPRESSO_SEQUENCER_LIBP2P_BIND_ADDRESS=0.0.0.0:$ESPRESSO_DEMO_SEQUENCER_LIBP2P_PORT_2
- ESPRESSO_SEQUENCER_LIBP2P_ADVERTISE_ADDRESS=sequencer2:$ESPRESSO_DEMO_SEQUENCER_LIBP2P_PORT_2
- - ESPRESSO_SEQUENCER_PREFUNDED_BUILDER_ACCOUNTS
- - ESPRESSO_SEQUENCER_MAX_BLOCK_SIZE
- - ESPRESSO_SEQUENCER_BASE_FEE
- ESPRESSO_SEQUENCER_IS_DA=true
- RUST_LOG
- RUST_LOG_FORMAT
@@ -293,6 +340,8 @@ services:
condition: service_healthy
marshal-0:
condition: service_healthy
+ deploy-sequencer-contracts:
+ condition: service_completed_successfully
sequencer3:
image: ghcr.io/espressosystems/espresso-sequencer/sequencer:main
@@ -300,19 +349,19 @@ services:
- "$ESPRESSO_SEQUENCER3_API_PORT:$ESPRESSO_SEQUENCER_API_PORT"
command: sequencer -- http -- catchup -- status
environment:
+ - ESPRESSO_SEQUENCER_GENESIS_FILE
- ESPRESSO_SEQUENCER_ORCHESTRATOR_URL
- ESPRESSO_SEQUENCER_CDN_ENDPOINT
- ESPRESSO_SEQUENCER_API_PORT
+ - ESPRESSO_SEQUENCER_MAX_CONNECTIONS
- ESPRESSO_SEQUENCER_STATE_PEERS=http://sequencer4:$ESPRESSO_SEQUENCER_API_PORT
- ESPRESSO_SEQUENCER_L1_PROVIDER
+ - ESPRESSO_SEQUENCER_L1_EVENTS_MAX_BLOCK_RANGE
- ESPRESSO_STATE_RELAY_SERVER_URL
- ESPRESSO_SEQUENCER_PRIVATE_STAKING_KEY=$ESPRESSO_DEMO_SEQUENCER_STAKING_PRIVATE_KEY_3
- ESPRESSO_SEQUENCER_PRIVATE_STATE_KEY=$ESPRESSO_DEMO_SEQUENCER_STATE_PRIVATE_KEY_3
- ESPRESSO_SEQUENCER_LIBP2P_BIND_ADDRESS=0.0.0.0:$ESPRESSO_DEMO_SEQUENCER_LIBP2P_PORT_3
- ESPRESSO_SEQUENCER_LIBP2P_ADVERTISE_ADDRESS=sequencer3:$ESPRESSO_DEMO_SEQUENCER_LIBP2P_PORT_3
- - ESPRESSO_SEQUENCER_PREFUNDED_BUILDER_ACCOUNTS
- - ESPRESSO_SEQUENCER_MAX_BLOCK_SIZE
- - ESPRESSO_SEQUENCER_BASE_FEE
- RUST_LOG
- RUST_LOG_FORMAT
- ASYNC_STD_THREAD_COUNT
@@ -329,6 +378,8 @@ services:
condition: service_healthy
marshal-0:
condition: service_healthy
+ deploy-sequencer-contracts:
+ condition: service_completed_successfully
sequencer4:
image: ghcr.io/espressosystems/espresso-sequencer/sequencer:main
@@ -336,19 +387,19 @@ services:
- "$ESPRESSO_SEQUENCER4_API_PORT:$ESPRESSO_SEQUENCER_API_PORT"
command: sequencer -- http -- catchup -- status
environment:
+ - ESPRESSO_SEQUENCER_GENESIS_FILE
- ESPRESSO_SEQUENCER_ORCHESTRATOR_URL
- ESPRESSO_SEQUENCER_CDN_ENDPOINT
- ESPRESSO_SEQUENCER_API_PORT
+ - ESPRESSO_SEQUENCER_MAX_CONNECTIONS
- ESPRESSO_SEQUENCER_STATE_PEERS=http://sequencer0:$ESPRESSO_SEQUENCER_API_PORT
- ESPRESSO_SEQUENCER_L1_PROVIDER
+ - ESPRESSO_SEQUENCER_L1_EVENTS_MAX_BLOCK_RANGE
- ESPRESSO_STATE_RELAY_SERVER_URL
- ESPRESSO_SEQUENCER_PRIVATE_STAKING_KEY=$ESPRESSO_DEMO_SEQUENCER_STAKING_PRIVATE_KEY_4
- ESPRESSO_SEQUENCER_PRIVATE_STATE_KEY=$ESPRESSO_DEMO_SEQUENCER_STATE_PRIVATE_KEY_4
- ESPRESSO_SEQUENCER_LIBP2P_BIND_ADDRESS=0.0.0.0:$ESPRESSO_DEMO_SEQUENCER_LIBP2P_PORT_4
- ESPRESSO_SEQUENCER_LIBP2P_ADVERTISE_ADDRESS=sequencer4:$ESPRESSO_DEMO_SEQUENCER_LIBP2P_PORT_4
- - ESPRESSO_SEQUENCER_PREFUNDED_BUILDER_ACCOUNTS
- - ESPRESSO_SEQUENCER_MAX_BLOCK_SIZE
- - ESPRESSO_SEQUENCER_BASE_FEE
- RUST_LOG
- RUST_LOG_FORMAT
- ASYNC_STD_THREAD_COUNT
@@ -365,6 +416,8 @@ services:
condition: service_healthy
marshal-0:
condition: service_healthy
+ deploy-sequencer-contracts:
+ condition: service_completed_successfully
commitment-task:
image: ghcr.io/espressosystems/espresso-sequencer/commitment-task:main
@@ -385,7 +438,7 @@ services:
condition: service_healthy
demo-l1-network:
condition: service_healthy
- deploy-contracts:
+ deploy-prover-contracts:
condition: service_completed_successfully
submit-transactions-public:
@@ -402,6 +455,10 @@ services:
depends_on:
sequencer0:
condition: service_healthy
+ # We don't directly depend on the builder, but transactions will not be finalized until it has
+ # started, so there is no point in starting before then.
+ permissionless-builder:
+ condition: service_healthy
submit-transactions-private:
image: ghcr.io/espressosystems/espresso-sequencer/submit-transactions:main
@@ -428,27 +485,31 @@ services:
environment:
- ESPRESSO_SEQUENCER_HOTSHOT_EVENT_STREAMING_API_URL=http://sequencer0:$ESPRESSO_SEQUENCER_HOTSHOT_EVENT_STREAMING_API_PORT
- ESPRESSO_SEQUENCER_STATE_PEERS=http://sequencer0:$ESPRESSO_SEQUENCER_API_PORT
+ - ESPRESSO_BUILDER_GENESIS_FILE
- ESPRESSO_BUILDER_ETH_MNEMONIC
- ESPRESSO_BUILDER_ETH_ACCOUNT_INDEX
- ESPRESSO_BUILDER_L1_PROVIDER
- ESPRESSO_BUILDER_SERVER_PORT
- - ESPRESSO_BUILDER_CHANNEL_CAPACITY
+ - ESPRESSO_BUILDER_TX_CHANNEL_CAPACITY
+ - ESPRESSO_BUILDER_EVENT_CHANNEL_CAPACITY
- ESPRESSO_BUILDER_BOOTSTRAPPED_VIEW
- ESPRESSO_BUILDER_WEBSERVER_RESPONSE_TIMEOUT_DURATION
- ESPRESSO_BUILDER_BUFFER_VIEW_NUM_COUNT
+ - ESPRESSO_BUILDER_INIT_NODE_COUNT
- RUST_LOG
- RUST_LOG_FORMAT
- ASYNC_STD_THREAD_COUNT
depends_on:
- sequencer0:
- condition: service_healthy
+ fund-builder:
+ condition: service_completed_successfully
nasty-client:
image: ghcr.io/espressosystems/espresso-sequencer/nasty-client:main
ports:
- "$ESPRESSO_NASTY_CLIENT_PORT:$ESPRESSO_NASTY_CLIENT_PORT"
environment:
- - ESPRESSO_SEQUENCER_URL
+ # Point the nasty client at sequencer1, the only one running the state API.
+ - ESPRESSO_SEQUENCER_URL=http://sequencer1:$ESPRESSO_SEQUENCER_API_PORT
- ESPRESSO_NASTY_CLIENT_PORT
- RUST_LOG
- RUST_LOG_FORMAT
@@ -457,14 +518,15 @@ services:
sequencer0:
condition: service_healthy
- sequencer-db:
+ sequencer-db-0:
image: postgres
user: postgres
ports:
- - "$ESPRESSO_SEQUENCER_DB_PORT:5432"
+ - "$ESPRESSO_SEQUENCER0_DB_PORT:5432"
environment:
- POSTGRES_PASSWORD=password
- POSTGRES_USER=root
+ - POSTGRES_DB=sequencer
healthcheck:
# Postgres can be falsely "ready" once before running init scripts.
# See https://github.com/docker-library/postgres/issues/146 for discussion.
@@ -472,3 +534,30 @@ services:
interval: 5s
timeout: 4s
retries: 20
+
+ sequencer-db-1:
+ image: postgres
+ user: postgres
+ ports:
+ - "$ESPRESSO_SEQUENCER1_DB_PORT:5432"
+ environment:
+ - POSTGRES_PASSWORD=password
+ - POSTGRES_USER=root
+ - POSTGRES_DB=sequencer
+ healthcheck:
+ # Postgres can be falsely "ready" once before running init scripts.
+ # See https://github.com/docker-library/postgres/issues/146 for discussion.
+ test: "pg_isready -U root && sleep 1 && pg_isready -U root"
+ interval: 5s
+ timeout: 4s
+ retries: 20
+
+ block-explorer:
+ image: ghcr.io/espressosystems/espresso-block-explorer:main
+ ports:
+ - "$ESPRESSO_BLOCK_EXPLORER_PORT:3000"
+ environment:
+ - QUERY_SERVICE_URI:http://localhost:$ESPRESSO_SEQUENCER1_API_PORT/v0/
+ depends_on:
+ sequencer1:
+ condition: service_healthy
diff --git a/docker/espresso-bridge.Dockerfile b/docker/espresso-bridge.Dockerfile
new file mode 100644
index 000000000..ad7db1839
--- /dev/null
+++ b/docker/espresso-bridge.Dockerfile
@@ -0,0 +1,15 @@
+FROM ubuntu:jammy
+
+ARG TARGETARCH
+
+RUN apt-get update \
+ && apt-get install -y curl libcurl4 wait-for-it tini \
+ && rm -rf /var/lib/apt/lists/*
+ENTRYPOINT ["tini", "--"]
+
+COPY target/$TARGETARCH/release/espresso-bridge /bin/espresso-bridge
+RUN chmod +x /bin/espresso-bridge
+
+RUN ln -s /bin/espresso-bridge /bin/bridge
+
+CMD [ "/bin/espresso-bridge"]
diff --git a/docker/espresso-dev-node.Dockerfile b/docker/espresso-dev-node.Dockerfile
new file mode 100644
index 000000000..7b5982857
--- /dev/null
+++ b/docker/espresso-dev-node.Dockerfile
@@ -0,0 +1,26 @@
+FROM postgres
+
+ARG TARGETARCH
+
+RUN apt-get update \
+ && apt-get install -y curl libcurl4 wait-for-it tini \
+ && rm -rf /var/lib/apt/lists/*
+ENTRYPOINT ["tini", "--"]
+
+# Download an SRS file to avoid download at runtime
+ENV AZTEC_SRS_PATH=/kzg10-aztec20-srs-1048584.bin
+RUN curl -LO https://github.com/EspressoSystems/ark-srs/releases/download/v0.2.0/$AZTEC_SRS_PATH
+
+COPY target/$TARGETARCH/release/espresso-dev-node /bin/espresso-dev-node
+RUN chmod +x /bin/espresso-dev-node
+
+# When running as a Docker service, we always want a healthcheck endpoint, so set a default for the
+# port that the HTTP server will run on. This can be overridden in any given deployment environment.
+ENV ESPRESSO_SEQUENCER_API_PORT=8770
+HEALTHCHECK --interval=1s --timeout=1s --retries=100 CMD curl --fail http://localhost:${ESPRESSO_SEQUENCER_API_PORT}/status/block-height || exit 1
+
+EXPOSE 8770
+EXPOSE 8771
+EXPOSE 8772
+
+CMD [ "/bin/espresso-dev-node"]
diff --git a/docker/permissionless-builder.Dockerfile b/docker/permissionless-builder.Dockerfile
index 4140ae5f7..82424dd6e 100644
--- a/docker/permissionless-builder.Dockerfile
+++ b/docker/permissionless-builder.Dockerfile
@@ -7,6 +7,10 @@ RUN apt-get update \
&& rm -rf /var/lib/apt/lists/*
ENTRYPOINT ["tini", "--"]
+# Install genesis files for all supported configurations. The desired configuration can be chosen by
+# setting `ESPRESSO_BUILDER_GENESIS_FILE`.
+COPY data/genesis /genesis
+
# Download an SRS file to avoid download at runtime
ENV AZTEC_SRS_PATH=/kzg10-aztec20-srs-1048584.bin
RUN curl -LO https://github.com/EspressoSystems/ark-srs/releases/download/v0.2.0/$AZTEC_SRS_PATH
diff --git a/docker/scripts/sequencer-awssecretsmanager.sh b/docker/scripts/sequencer-awssecretsmanager.sh
new file mode 100644
index 000000000..582cd36f2
--- /dev/null
+++ b/docker/scripts/sequencer-awssecretsmanager.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+set -eEu -o pipefail
+
+if [[ -v ESPRESSO_SEQUENCER_GENESIS_SECRET ]]; then
+ echo "Loading genesis file from AWS secrets manager"
+ aws secretsmanager get-secret-value --secret-id ${ESPRESSO_SEQUENCER_GENESIS_SECRET} --query SecretString --output text | tee /genesis/injected.toml >/dev/null
+fi
+
+/bin/sequencer "$@"
diff --git a/docker/sequencer.Dockerfile b/docker/sequencer.Dockerfile
index e84367152..eac4ec5f5 100644
--- a/docker/sequencer.Dockerfile
+++ b/docker/sequencer.Dockerfile
@@ -23,6 +23,14 @@ RUN chmod +x /bin/keygen
COPY target/$TARGETARCH/release/pub-key /bin/pub-key
RUN chmod +x /bin/pub-key
+# Install genesis files for all supported configurations. The desired configuration can be chosen by
+# setting `ESPRESSO_SEQUENCER_GENESIS_FILE`.
+COPY data/genesis /genesis
+
+# Allow injecting a genesis file with aws secretsmanager
+# Set `ESPRESSO_SEQUENCER_GENESIS_SECRET`
+COPY docker/scripts/sequencer-awssecretsmanager.sh /bin/sequencer-awssecretsmanager.sh
+
# Set a path to save the consensus config on startup.
#
# Upon restart, the config will be loaded from this file and the node will be able to resume
diff --git a/flake.lock b/flake.lock
index 832aab8c3..cef230226 100644
--- a/flake.lock
+++ b/flake.lock
@@ -196,11 +196,11 @@
"nixpkgs": "nixpkgs"
},
"locked": {
- "lastModified": 1712135466,
- "narHash": "sha256-+xFfYk17EI0zZTGmhh3MyeSpl7RVohoVp/4HaSvGj4I=",
+ "lastModified": 1714727549,
+ "narHash": "sha256-CWXRTxxcgMfQubJugpeg3yVWIfm70MYTtgaKWKgD60U=",
"owner": "shazow",
"repo": "foundry.nix",
- "rev": "ece7c960a440c6725a7a5576d1f49a5fabde3747",
+ "rev": "47cf189ec395eda4b3e0623179d1075c8027ca97",
"type": "github"
},
"original": {
@@ -476,11 +476,11 @@
"nixpkgs": "nixpkgs_6"
},
"locked": {
- "lastModified": 1713838472,
- "narHash": "sha256-lCdDz6/YgyXdFRHall3P+dCETRpfz3Pi9eREnA9RX6k=",
+ "lastModified": 1714616033,
+ "narHash": "sha256-JcWAjIDl3h0bE/pII0emeHwokTeBl+SWrzwrjoRu7a0=",
"owner": "oxalica",
"repo": "rust-overlay",
- "rev": "28a9436d356181603fb0d333565431c3d952f299",
+ "rev": "3e416d5067ba31ff8ac31eeb763e4388bdf45089",
"type": "github"
},
"original": {
diff --git a/flake.nix b/flake.nix
index 59c458a30..777dba371 100644
--- a/flake.nix
+++ b/flake.nix
@@ -49,10 +49,12 @@
# node=error: disable noisy anvil output
RUST_LOG = "info,libp2p=off,isahc=error,surf=error,node=error";
RUST_BACKTRACE = 1;
- RUSTFLAGS =
- " --cfg async_executor_impl=\"async-std\" --cfg async_channel_impl=\"async-std\" --cfg hotshot_example";
+ ASYNC_FLAGS = " --cfg async_executor_impl=\"async-std\" --cfg async_channel_impl=\"async-std\" ";
+ RUSTFLAGS = "${ASYNC_FLAGS} --cfg hotshot_example";
+ RUSTDOCFLAGS = ASYNC_FLAGS;
# Use a distinct target dir for builds from within nix shells.
CARGO_TARGET_DIR = "target/nix";
+ rustEnvVars = { inherit RUST_LOG RUST_BACKTRACE RUSTFLAGS RUSTDOCFLAGS CARGO_TARGET_DIR; };
solhintPkg = { buildNpmPackage, fetchFromGitHub }:
buildNpmPackage rec {
@@ -90,10 +92,11 @@
inherit overlays localSystem crossSystem;
};
in
- import ./cross-shell.nix {
- inherit pkgs;
- inherit RUST_LOG RUST_BACKTRACE RUSTFLAGS CARGO_TARGET_DIR;
- };
+ import ./cross-shell.nix
+ {
+ inherit pkgs;
+ envVars = rustEnvVars;
+ };
in
with pkgs; {
checks = {
@@ -124,8 +127,7 @@
cargo-clippy = {
enable = true;
description = "Run clippy";
- entry =
- "cargo clippy --workspace --all-features --all-targets -- -D warnings";
+ entry = "just clippy";
types_or = [ "rust" "toml" ];
pass_filenames = false;
};
@@ -154,15 +156,16 @@
enable = true;
description = "Enforce markdown formatting";
entry = "prettier -w";
- types_or = [ "markdown" ];
+ types_or = [ "markdown" "ts" ];
pass_filenames = true;
};
spell-checking = {
enable = true;
description = "Spell checking";
- entry = "typos";
+ # --force-exclude to exclude excluded files if they are passed as arguments
+ entry = "typos --force-exclude";
pass_filenames = true;
- excludes = [ "contract-bindings/" ];
+ # Add excludes to the .typos.toml file instead
};
nixpkgs-fmt.enable = true;
};
@@ -180,7 +183,7 @@
'';
solc = pkgs.solc-bin.latest;
in
- mkShell {
+ mkShell (rustEnvVars // {
buildInputs = [
# Rust dependencies
pkg-config
@@ -218,12 +221,14 @@
nodePackages.prettier
solhint
(python3.withPackages (ps: with ps; [ black ]))
-
+ yarn
] ++ lib.optionals stdenv.isDarwin
[ darwin.apple_sdk.frameworks.SystemConfiguration ]
++ lib.optionals (!stdenv.isDarwin) [ cargo-watch ] # broken on OSX
;
shellHook = ''
+ # Add node binaries to PATH
+ export PATH="$PWD/node_modules/.bin:$PATH"
# Prevent cargo aliases from using programs in `~/.cargo` to avoid conflicts
# with rustup installations.
export CARGO_HOME=$HOME/.cargo-nix
@@ -231,8 +236,7 @@
'' + self.checks.${system}.pre-commit-check.shellHook;
RUST_SRC_PATH = "${stableToolchain}/lib/rustlib/src/rust/library";
FOUNDRY_SOLC = "${solc}/bin/solc";
- inherit RUST_LOG RUST_BACKTRACE RUSTFLAGS CARGO_TARGET_DIR;
- };
+ });
devShells.crossShell =
crossShell { config = "x86_64-unknown-linux-musl"; };
devShells.armCrossShell =
@@ -243,7 +247,7 @@
extensions = [ "rustfmt" "clippy" "llvm-tools-preview" "rust-src" ];
};
in
- mkShell {
+ mkShell (rustEnvVars // {
buildInputs = [
# Rust dependencies
pkg-config
@@ -252,13 +256,12 @@
protobuf # to compile libp2p-autonat
toolchain
];
- inherit RUST_LOG RUST_BACKTRACE RUSTFLAGS CARGO_TARGET_DIR;
- };
+ });
devShells.coverage =
let
toolchain = pkgs.rust-bin.nightly.latest.minimal;
in
- mkShell {
+ mkShell (rustEnvVars // {
buildInputs = [
# Rust dependencies
pkg-config
@@ -268,13 +271,12 @@
toolchain
grcov
];
- inherit RUST_LOG RUST_BACKTRACE RUSTFLAGS CARGO_TARGET_DIR;
CARGO_INCREMENTAL = "0";
shellHook = ''
RUSTFLAGS="$RUSTFLAGS -Zprofile -Ccodegen-units=1 -Cinline-threshold=0 -Clink-dead-code -Coverflow-checks=off -Cpanic=abort -Zpanic_abort_tests -Cdebuginfo=2"
'';
RUSTDOCFLAGS = "-Zprofile -Ccodegen-units=1 -Cinline-threshold=0 -Clink-dead-code -Coverflow-checks=off -Cpanic=abort -Zpanic_abort_tests";
- };
+ });
devShells.rustShell =
let
@@ -282,7 +284,7 @@
extensions = [ "rustfmt" "clippy" "llvm-tools-preview" "rust-src" ];
};
in
- mkShell {
+ mkShell (rustEnvVars // {
buildInputs = [
# Rust dependencies
pkg-config
@@ -291,7 +293,6 @@
protobuf # to compile libp2p-autonat
stableToolchain
];
- inherit RUST_LOG RUST_BACKTRACE RUSTFLAGS CARGO_TARGET_DIR;
- };
+ });
});
}
diff --git a/foundry.toml b/foundry.toml
index e2b19ad85..061cd3fd9 100644
--- a/foundry.toml
+++ b/foundry.toml
@@ -9,7 +9,7 @@ libs = ['contracts/lib']
script = "contracts/script"
broadcast = "contracts/broadcast"
cache_path = "contracts/cache"
-optimizer_runs = 2300 # Increasing the number of runs saves gas but increases the size of the contract
+optimizer_runs = 0 # Increasing the number of runs saves gas but increases the size of the contract
# Version should match the solc installed via flake, otherwise the contract
# artifacts may differ slightly.
solc = "0.8.23"
diff --git a/hotshot-state-prover/Cargo.toml b/hotshot-state-prover/Cargo.toml
index d832988b4..4947d7ead 100644
--- a/hotshot-state-prover/Cargo.toml
+++ b/hotshot-state-prover/Cargo.toml
@@ -6,7 +6,7 @@ authors = { workspace = true }
edition = { workspace = true }
[dependencies]
-anyhow = "1.0"
+anyhow = { workspace = true }
ark-bn254 = { workspace = true }
ark-ec = { workspace = true }
ark-ed-on-bn254 = { workspace = true }
@@ -26,21 +26,25 @@ displaydoc = { version = "0.2.3", default-features = false }
es-version = { workspace = true }
ethers = { workspace = true }
futures = { workspace = true }
-hotshot-contract-adapter = { path = "../contracts/rust/adapter" }
+hotshot-contract-adapter = { workspace = true }
hotshot-orchestrator = { workspace = true }
hotshot-stake-table = { workspace = true }
hotshot-types = { workspace = true }
itertools = { workspace = true }
+jf-crhf = { workspace = true }
+jf-pcs = { workspace = true }
jf-plonk = { workspace = true }
-jf-primitives = { workspace = true }
jf-relation = { workspace = true }
+jf-rescue = { workspace = true, features = ["gadgets"] }
+jf-signature = { workspace = true, features = ["schnorr", "bls", "gadgets"] }
jf-utils = { workspace = true }
rand_chacha = { workspace = true }
+reqwest = { workspace = true }
sequencer-utils = { path = "../utils" }
serde = { workspace = true }
snafu = { workspace = true }
surf-disco = { workspace = true }
-tagged-base64 = { git = "https://github.com/EspressoSystems/tagged-base64", tag = "0.3.4" }
+tagged-base64 = { workspace = true }
tide-disco = { workspace = true }
time = { workspace = true }
toml = "0.8"
@@ -51,4 +55,4 @@ vbs = { workspace = true }
[features]
default = ["parallel"]
std = ["ark-std/std", "ark-ff/std"]
-parallel = ["jf-primitives/parallel", "jf-utils/parallel", "ark-ff/parallel"]
+parallel = ["jf-signature/parallel", "jf-utils/parallel", "ark-ff/parallel"]
diff --git a/hotshot-state-prover/src/bin/state-prover.rs b/hotshot-state-prover/src/bin/state-prover.rs
index 1d9f94fb2..f1f25a027 100644
--- a/hotshot-state-prover/src/bin/state-prover.rs
+++ b/hotshot-state-prover/src/bin/state-prover.rs
@@ -29,6 +29,10 @@ struct Args {
#[clap(short, long = "freq", value_parser = parse_duration, default_value = "10m", env = "ESPRESSO_STATE_PROVER_UPDATE_INTERVAL")]
update_interval: Duration,
+ /// Interval between retries if a state update fails
+ #[clap(long = "retry-freq", value_parser = parse_duration, default_value = "2s", env = "ESPRESSO_STATE_PROVER_RETRY_INTERVAL")]
+ retry_interval: Duration,
+
/// URL of layer 1 Ethereum JSON-RPC provider.
#[clap(
long,
@@ -53,14 +57,14 @@ struct Args {
)]
eth_account_index: u32,
- /// URL of the HotShot orchestrator.
+ /// URL of a sequencer node that is currently providing the HotShot config.
+ /// This is used to initialize the stake table.
#[clap(
- short,
long,
- env = "ESPRESSO_SEQUENCER_ORCHESTRATOR_URL",
- default_value = "http://localhost:8080"
+ env = "ESPRESSO_SEQUENCER_URL",
+ default_value = "http://localhost:24000"
)]
- pub orchestrator_url: Url,
+ pub sequencer_url: Url,
/// If daemon and provided, the service will run a basic HTTP server on the given port.
///
@@ -97,9 +101,10 @@ async fn main() {
let provider = Provider::::try_from(args.l1_provider.to_string()).unwrap();
let chain_id = provider.get_chainid().await.unwrap().as_u64();
let config = StateProverConfig {
- relay_server: args.relay_server.clone(),
+ relay_server: args.relay_server,
update_interval: args.update_interval,
- l1_provider: args.l1_provider.clone(),
+ retry_interval: args.retry_interval,
+ l1_provider: args.l1_provider,
light_client_address: args.light_client_address,
eth_signing_key: MnemonicBuilder::::default()
.phrase(args.eth_mnemonic.as_str())
@@ -110,16 +115,20 @@ async fn main() {
.with_chain_id(chain_id)
.signer()
.clone(),
- orchestrator_url: args.orchestrator_url,
+ sequencer_url: args.sequencer_url,
port: args.port,
stake_table_capacity: args.stake_table_capacity,
};
if args.daemon {
// Launching the prover service daemon
- run_prover_service(config, SEQUENCER_VERSION).await;
+ if let Err(err) = run_prover_service(config, SEQUENCER_VERSION).await {
+ tracing::error!("Error running prover service: {:?}", err);
+ };
} else {
// Run light client state update once
- run_prover_once(config, SEQUENCER_VERSION).await;
+ if let Err(err) = run_prover_once(config, SEQUENCER_VERSION).await {
+ tracing::error!("Error running prover once: {:?}", err);
+ };
}
}
diff --git a/hotshot-state-prover/src/circuit.rs b/hotshot-state-prover/src/circuit.rs
index cdd262d8b..e1e2603b9 100644
--- a/hotshot-state-prover/src/circuit.rs
+++ b/hotshot-state-prover/src/circuit.rs
@@ -5,16 +5,13 @@ use ark_ff::PrimeField;
use ark_std::borrow::Borrow;
use ethers::types::U256;
use hotshot_types::light_client::{GenericLightClientState, GenericPublicInput};
-use jf_plonk::errors::PlonkError;
-use jf_primitives::{
- circuit::{
- rescue::RescueNativeGadget,
- signature::schnorr::{SignatureGadget, VerKeyVar},
- },
- rescue::RescueParameter,
- signatures::schnorr::{Signature, VerKey as SchnorrVerKey},
+use jf_plonk::PlonkError;
+use jf_relation::{BoolVar, Circuit, CircuitError, PlonkCircuit, Variable};
+use jf_rescue::{gadgets::RescueNativeGadget, RescueParameter};
+use jf_signature::{
+ gadgets::schnorr::{SignatureGadget, VerKeyVar},
+ schnorr::{Signature, VerKey as SchnorrVerKey},
};
-use jf_relation::{errors::CircuitError, BoolVar, Circuit, PlonkCircuit, Variable};
/// Lossy conversion of a U256 into a field element.
pub(crate) fn u256_to_field(v: &U256) -> F {
@@ -380,11 +377,13 @@ mod tests {
use ark_ed_on_bn254::EdwardsConfig as Config;
use ethers::types::U256;
use hotshot_types::traits::stake_table::{SnapshotVersion, StakeTableScheme};
- use jf_primitives::{
- crhf::{VariableLengthRescueCRHF, CRHF},
- errors::PrimitivesError,
- signatures::{schnorr::Signature, SchnorrSignatureScheme, SignatureScheme},
+ use jf_crhf::CRHF;
+ use jf_rescue::crhf::VariableLengthRescueCRHF;
+ use jf_signature::{
+ schnorr::{SchnorrSignatureScheme, Signature},
+ SignatureScheme,
};
+
use jf_relation::Circuit;
use jf_utils::test_rng;
@@ -425,7 +424,7 @@ mod tests {
let sigs = state_keys
.iter()
.map(|(key, _)| SchnorrSignatureScheme::::sign(&(), key, state_msg, &mut prng))
- .collect::, PrimitivesError>>()
+ .collect::, _>>()
.unwrap();
// bit vector with total weight 26
@@ -532,7 +531,7 @@ mod tests {
.map(|(key, _)| {
SchnorrSignatureScheme::::sign(&(), key, bad_state_msg, &mut prng)
})
- .collect::, PrimitivesError>>()
+ .collect::