From 9d210ed5b32308bd031a29d43e283245e58edd0d Mon Sep 17 00:00:00 2001 From: DevOps Service Date: Thu, 14 Jul 2022 18:40:13 +0000 Subject: [PATCH 01/39] Bump version to 2.13.0-rc1 --- .version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.version b/.version index 56beced9a..7b75d8034 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -2.12.4 +2.13.0-rc1 From 0a8af6136a2e2f9405f6b21e46b94c826343c6fc Mon Sep 17 00:00:00 2001 From: DevOps Service Date: Thu, 21 Jul 2022 18:41:08 +0000 Subject: [PATCH 02/39] Bump version to 2.13.0 --- .version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.version b/.version index 7b75d8034..fb2c0766b 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -2.13.0-rc1 +2.13.0 From 996bf10843ebdc9e63263376815c0c80d6b6a457 Mon Sep 17 00:00:00 2001 From: Will Winder Date: Fri, 22 Jul 2022 11:01:00 -0400 Subject: [PATCH 03/39] Documentation for data directory. (#1125) Co-authored-by: algobarb <78746954+algobarb@users.noreply.github.com> --- README.md | 8 ++++++-- docs/DataDirectory.md | 48 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 docs/DataDirectory.md diff --git a/README.md b/README.md index 824b8d8c1..dd09bd328 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ For a simple deployment the following configuration works well: * Network: Indexer, Algod and PostgreSQL should all be on the same network. * Indexer: 2 CPU and 8 GB of ram. * Database: When hosted on AWS a `db.r5.xlarge` instance works well. +* Storage: 20 GiB A database with replication can be used to scale read volume. Configure multiple Indexer daemons with a single writer and multiple readers. @@ -199,6 +200,7 @@ Settings can be provided from the command line, a configuration file, or an envi | max-applications-limit | | max-applications-limit | INDEXER_MAX_APPLICATIONS_LIMIT | | default-applications-limit | | default-applications-limit | INDEXER_DEFAULT_APPLICATIONS_LIMIT | | enable-all-parameters | | enable-all-parameters | INDEXER_ENABLE_ALL_PARAMETERS | +| catchpoint | | catchpoint | INDEXER_CATCHPOINT | ## Command line @@ -212,17 +214,19 @@ The command line arguments always take priority over the config file and environ The Indexer data directory is the location where the Indexer can store and/or load data needed for runtime operation and configuration. -**It is a required argument for Indexer daemon operation. Supply it to the Indexer via the `--data-dir` flag.** +**It is a required argument for Indexer daemon operation. Supply it to the Indexer via the `--data-dir`/`-i` flag.** **It is HIGHLY recommended placing the data directory in a separate, stateful directory for production usage of the Indexer.** +For more information on the data directory see [Indexer Data Directory](docs/DataDirectory.md). + ### Auto-Loading Configuration The Indexer will scan the data directory at startup and load certain configuration files if they are present. The files are as follows: - `indexer.yml` - Indexer Configuration File - `api_config.yml` - API Parameter Enable/Disable Configuration File -- + **NOTE:** It is not allowed to supply both the command line flag AND have an auto-loading configuration file in the data directory. Doing so will result in an error. To see an example of how to use the data directory to load a configuration file check out the [Disabling Parameters Guide](docs/DisablingParametersGuide.md). diff --git a/docs/DataDirectory.md b/docs/DataDirectory.md new file mode 100644 index 000000000..86802d91b --- /dev/null +++ b/docs/DataDirectory.md @@ -0,0 +1,48 @@ +# Indexer Data Directory + +The Indexer data directory is the location where the Indexer can store and/or load data needed for runtime operation and configuration. It is a required argument for Indexer daemon operation. Supply it to the Indexer via the `--data-dir` flag. + +# Storage Requirements + +As of mid-2022, approximately 20 GiB for Mainnet. + +# Configuration Files + +The data directory is the first place to check for different configuration files, for example: +- `indexer.yml` - Indexer Configuration File +- `api_config.yml` - API Parameter Enable/Disable Configuration File + +# Account Cache + +Indexer writers maintain an account cache in the data directory. This cache is used during block processing to compute things like the new account balances after processing transactions. Prior to this local cache, the database was queried on each round to fetch the initial account states. + +The following files are created: +- ledger.block.sqlite +- ledger.block.sqlite-shm +- ledger.block.sqlite-wal +- ledger.tracker.sqlite +- ledger.tracker.sqlite-shm +- ledger.tracker.sqlite-wal + + +## Read-Only Mode + +The account cache is not required when in read-only mode. While the data directory is still required, it will only be used for configuration. + +# Initialization + +If a new data directory must be created, the following process should be used: +1. Review the Indexer log to find the most recent round that was processed. For example, `22212765` in the following line: + ``` + {"level":"info","msg":"round r=22212765 (49 txn) imported in 139.782694ms","time":"2022-07-18T19:23:13Z"} + ``` +2. Lookup the most recent catchpoint for your network **without going over the indexer's current round** from the following links. For example, with `22212765` from step 1, on mainnet you would choose `22210000#MZZIOYXYPPGNYRQHROXCPILIWIMQQRN7ZNLQJVM2QVSKT3QX6O4A` from the Mainnet consolidated catchpoint list. +Full list of available catchpoints for each network can be found at the following links: + - [Mainnet](https://algorand-catchpoints.s3.us-east-2.amazonaws.com/consolidated/mainnet_catchpoints.txt) + - [Testnet](https://algorand-catchpoints.s3.us-east-2.amazonaws.com/consolidated/testnet_catchpoints.txt) + - [Betanet](https://algorand-catchpoints.s3.us-east-2.amazonaws.com/consolidated/betanet_catchpoints.txt) +3. Supply the catchpoint label when starting Indexer using the command line setting `--catchpoint 22210000#MZZIOYXYPPGNYRQHROXCPILIWIMQQRN7ZNLQJVM2QVSKT3QX6O4A`, setting `catchpoint` in `indexer.yml`, or setting the `INDEXER_CATCHPOINT` environment variable. + +While Indexer starts, you can see progress information printed periodically in the log file. + +Note: You are not required to unset the catchpoint label after initialization. During startup, if Indexer is ahead of the supplied catchpoint label, it is ignored. From e7e14280cf1994d82f448664f007e3cabcd31868 Mon Sep 17 00:00:00 2001 From: Will Winder Date: Fri, 22 Jul 2022 16:05:38 -0400 Subject: [PATCH 04/39] Don't lookup big foreign assets. (#1141) --- accounting/eval_preload.go | 14 ++++++++++++++ idb/postgres/postgres.go | 22 ---------------------- 2 files changed, 14 insertions(+), 22 deletions(-) diff --git a/accounting/eval_preload.go b/accounting/eval_preload.go index 72b5269a4..35a8af74c 100644 --- a/accounting/eval_preload.go +++ b/accounting/eval_preload.go @@ -1,6 +1,8 @@ package accounting import ( + "math" + "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/data/transactions" "github.com/algorand/go-algorand/ledger" @@ -34,9 +36,15 @@ func addToCreatorsRequest(stxnad *transactions.SignedTxnWithAD, assetsReq map[ba appsReq[fields.ApplicationID] = struct{}{} } for _, index := range fields.ForeignApps { + if index > basics.AppIndex(math.MaxInt64) { + continue + } appsReq[index] = struct{}{} } for _, index := range fields.ForeignAssets { + if index > basics.AssetIndex(math.MaxInt64) { + continue + } assetsReq[index] = struct{}{} } } @@ -161,6 +169,9 @@ func addToAccountsResourcesRequest(stxnad *transactions.SignedTxnWithAD, assetCr addressesReq[address] = struct{}{} } for _, index := range fields.ForeignApps { + if index > basics.AppIndex(math.MaxInt64) { + continue + } if creator := appCreators[index]; creator.Exists { creatable := ledger.Creatable{ Index: basics.CreatableIndex(index), @@ -170,6 +181,9 @@ func addToAccountsResourcesRequest(stxnad *transactions.SignedTxnWithAD, assetCr } } for _, index := range fields.ForeignAssets { + if index > basics.AssetIndex(math.MaxInt64) { + continue + } if creator := assetCreators[index]; creator.Exists { creatable := ledger.Creatable{ Index: basics.CreatableIndex(index), diff --git a/idb/postgres/postgres.go b/idb/postgres/postgres.go index 69c440d29..dd87ee252 100644 --- a/idb/postgres/postgres.go +++ b/idb/postgres/postgres.go @@ -9,7 +9,6 @@ import ( "database/sql" "errors" "fmt" - "math" "os" "strings" "sync" @@ -181,19 +180,6 @@ func (db *IndexerDb) init(opts idb.IndexerDbOptions) (chan struct{}, error) { // Preload asset and app creators. func prepareCreators(l *ledger_for_evaluator.LedgerForEvaluator, payset transactions.Payset) (map[basics.AssetIndex]ledger.FoundAddress, map[basics.AppIndex]ledger.FoundAddress, error) { assetsReq, appsReq := accounting.MakePreloadCreatorsRequest(payset) - - for aidx := range assetsReq { - if aidx >= basics.AssetIndex(math.MaxInt64) { - delete(assetsReq, aidx) - } - } - - for aidx := range appsReq { - if aidx >= basics.AppIndex(math.MaxInt64) { - delete(appsReq, aidx) - } - } - assets, err := l.GetAssetCreator(assetsReq) if err != nil { return nil, nil, fmt.Errorf("prepareCreators() err: %w", err) @@ -211,14 +197,6 @@ func prepareAccountsResources(l *ledger_for_evaluator.LedgerForEvaluator, payset addressesReq, resourcesReq := accounting.MakePreloadAccountsResourcesRequest(payset, assetCreators, appCreators) - for addr := range resourcesReq { - for cidx := range resourcesReq[addr] { - if cidx.Index >= basics.CreatableIndex(math.MaxInt64) { - delete(resourcesReq[addr], cidx) - } - } - } - accounts, err := l.LookupWithoutRewards(addressesReq) if err != nil { return nil, nil, fmt.Errorf("prepareAccountsResources() err: %w", err) From 8c917ef13ee91a97c207db0ae265813bb1cdf1a3 Mon Sep 17 00:00:00 2001 From: Barbara Poon Date: Mon, 25 Jul 2022 09:19:28 -0400 Subject: [PATCH 05/39] Revert "Bump version to 2.13.0" This reverts commit 0a8af6136a2e2f9405f6b21e46b94c826343c6fc. --- .version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.version b/.version index fb2c0766b..7b75d8034 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -2.13.0 +2.13.0-rc1 From 7915890baf377ec38dcc02c8143035ffd4955d2d Mon Sep 17 00:00:00 2001 From: DevOps Service Date: Mon, 25 Jul 2022 13:20:52 +0000 Subject: [PATCH 06/39] Bump version to 2.13.0 --- .version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.version b/.version index 7b75d8034..fb2c0766b 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -2.13.0-rc1 +2.13.0 From cfd3c553219160d2b90316ad9e153c05826d3971 Mon Sep 17 00:00:00 2001 From: Will Winder Date: Mon, 25 Jul 2022 16:07:31 -0400 Subject: [PATCH 07/39] Fix import performance test runner. (#1133) * Start on round 1 since round 0 is now computed from the genesis file. * Wait for indexer processor to exit. * Better logging for metric collection errors. * Proper support for data directory. * New test script for future release automation. --- api/server.go | 4 +- cmd/block-generator/generator/generate.go | 2 +- cmd/block-generator/run_tests.sh | 98 +++++++++++++++++++++++ cmd/block-generator/runner/run.go | 30 ++++--- cmd/block-generator/runner/runner.go | 1 + 5 files changed, 124 insertions(+), 11 deletions(-) create mode 100755 cmd/block-generator/run_tests.sh diff --git a/api/server.go b/api/server.go index 6854eb7a8..c006d82ca 100644 --- a/api/server.go +++ b/api/server.go @@ -148,7 +148,9 @@ func Serve(ctx context.Context, serveAddr string, db idb.IndexerDb, fetcherError } go func() { - log.Fatal(e.StartServer(s)) + if err := e.StartServer(s); err != nil { + log.Fatalf("Serve() err: %s", err) + } }() <-ctx.Done() diff --git a/cmd/block-generator/generator/generate.go b/cmd/block-generator/generator/generate.go index 0f7dcb67e..3a217ebeb 100644 --- a/cmd/block-generator/generator/generate.go +++ b/cmd/block-generator/generator/generate.go @@ -101,7 +101,7 @@ func MakeGenerator(config GenerationConfig) (Generator, error) { genesisHash: [32]byte{}, genesisID: "blockgen-test", prevBlockHash: "", - round: 0, + round: 1, txnCounter: 0, timestamp: 0, rewardsLevel: 0, diff --git a/cmd/block-generator/run_tests.sh b/cmd/block-generator/run_tests.sh new file mode 100755 index 000000000..0a1c6df49 --- /dev/null +++ b/cmd/block-generator/run_tests.sh @@ -0,0 +1,98 @@ +#!/usr/bin/env bash + +CONNECTION_STRING="" +INDEXER_BINARY="" +REPORT_DIR="" +DURATION="1h" +LOG_LEVEL="error" +SCENARIOS="" + +help() { + echo "Usage:" + echo " -v|--verbose enable verbose script output." + echo " -c|--connection-string" + echo " PostgreSQL connection string." + echo " -i|--indexer path to indexer binary." + echo " -s|--scenarios path to indexer test scenarios." + echo " -r|--report-dir directory where the report should be written." + echo " -d|--duration test duration." + echo " -l|--level log level to pass to Indexer." + echo " -g|--generator use a different indexer binary to run the generator." + exit +} + +while :; do + case "${1-}" in + -h | --help) help ;; + -v | --verbose) set -x ;; + -c | --connection-string) + CONNECTION_STRING="${2-}" + shift + ;; + -g | --generator) + GENERATOR_BINARY="${2-}" + shift + ;; + -i | --indexer) + INDEXER_BINARY="${2-}" + shift + ;; + -r | --report-dir) + REPORT_DIR="${2-}" + shift + ;; + -s | --scenarios) + SCENARIOS="${2-}" + shift + ;; + -d | --duration) + DURATION="${2-}" + shift + ;; + -l | --level) + LOG_LEVEL="${2-}" + shift + ;; + -?*) echo "Unknown option: $1" && exit 1;; + *) break ;; + esac + shift +done + +args=("$@") + +if [ -z "$CONNECTION_STRING" ]; then + echo "Missing required connection string parameter (-c / --connection-string)." + exit 1 +fi + +if [ -z "$INDEXER_BINARY" ]; then + echo "Missing required indexer binary parameter (-i / --indexer)." + exit 1 +fi + +if [ -z "$SCENARIOS" ]; then + echo "Missing required indexer test scenario parameter (-s / --scenarios)." + exit 1 +fi + +if [ -z "$GENERATOR_BINARY" ]; then + echo "Using indexer binary for generator, override with (-g / --generator)." + GENERATOR_BINARY="$INDEXER_BINARY" +fi + +echo "Running with binary: $INDEXER_BINARY" +echo "Report directory: $REPORT_DIR" +echo "Duration: $DURATION" +echo "Log Level: $LOG_LEVEL" + +"$GENERATOR_BINARY" \ + util block-generator runner \ + -i "$INDEXER_BINARY" \ + -s "$SCENARIOS" \ + -d "$DURATION" \ + -c "$CONNECTION_STRING" \ + --report-directory "$REPORT_DIR" \ + --log-level "$LOG_LEVEL" \ + --reset + diff --git a/cmd/block-generator/runner/run.go b/cmd/block-generator/runner/run.go index 8c1141e6e..67844d21f 100644 --- a/cmd/block-generator/runner/run.go +++ b/cmd/block-generator/runner/run.go @@ -13,7 +13,6 @@ import ( "strconv" "strings" "sync" - "syscall" "time" "github.com/jackc/pgx/v4" @@ -37,6 +36,7 @@ type Args struct { ReportDirectory string ResetReportDir bool RunValidation bool + KeepDataDir bool } // Run is a public helper to run the tests. @@ -73,6 +73,10 @@ func (r *Args) run() error { baseNameNoExt := strings.TrimSuffix(baseName, filepath.Ext(baseName)) reportfile := path.Join(r.ReportDirectory, fmt.Sprintf("%s.report", baseNameNoExt)) logfile := path.Join(r.ReportDirectory, fmt.Sprintf("%s.indexer-log", baseNameNoExt)) + dataDir := path.Join(r.ReportDirectory, fmt.Sprintf("%s_data", baseNameNoExt)) + if !r.KeepDataDir { + defer os.RemoveAll(dataDir) + } // This middleware allows us to lock the block endpoint var freezeMutex sync.Mutex @@ -94,7 +98,7 @@ func (r *Args) run() error { } }() - indexerShutdownFunc, err := startIndexer(logfile, r.LogLevel, r.IndexerBinary, algodNet, indexerNet, r.PostgresConnectionString, r.CPUProfilePath) + indexerShutdownFunc, err := startIndexer(dataDir, logfile, r.LogLevel, r.IndexerBinary, algodNet, indexerNet, r.PostgresConnectionString, r.CPUProfilePath) if err != nil { return fmt.Errorf("failed to start indexer: %w", err) } @@ -270,15 +274,17 @@ func (r *Args) runTest(report *os.File, indexerURL string, generatorURL string) // Run for r.RunDuration start := time.Now() + count := 1 for time.Since(start) < r.RunDuration { time.Sleep(r.RunDuration / 10) if err := collector.Collect(metrics.AllMetricNames...); err != nil { - return fmt.Errorf("problem collecting metrics: %w", err) + return fmt.Errorf("problem collecting metrics (%d / %s): %w", count, time.Since(start), err) } + count++ } if err := collector.Collect(metrics.AllMetricNames...); err != nil { - return fmt.Errorf("problem collecting metrics: %w", err) + return fmt.Errorf("problem collecting final metrics (%d / %s): %w", count, time.Since(start), err) } // Collect results. @@ -396,7 +402,7 @@ func startGenerator(configFile string, addr string, blockMiddleware func(http.Ha // startIndexer resets the postgres database and executes the indexer binary. It performs some simple verification to // ensure that the service has started properly. -func startIndexer(logfile string, loglevel string, indexerBinary string, algodNet string, indexerNet string, postgresConnectionString string, cpuprofile string) (func() error, error) { +func startIndexer(dataDir string, logfile string, loglevel string, indexerBinary string, algodNet string, indexerNet string, postgresConnectionString string, cpuprofile string) (func() error, error) { { conn, err := pgx.Connect(context.Background(), postgresConnectionString) if err != nil { @@ -421,7 +427,8 @@ func startIndexer(logfile string, loglevel string, indexerBinary string, algodNe "--server", indexerNet, "--logfile", logfile, "--loglevel", loglevel, - "--cpuprofile", cpuprofile) + "--cpuprofile", cpuprofile, + "--data-dir", dataDir) var stdout bytes.Buffer var stderr bytes.Buffer @@ -444,10 +451,15 @@ func startIndexer(logfile string, loglevel string, indexerBinary string, algodNe resp.Body.Close() return func() error { - if err := cmd.Process.Signal(syscall.SIGTERM); err != nil { - return fmt.Errorf("failed to kill indexer process: %w", err) + if err := cmd.Process.Signal(os.Interrupt); err != nil { + fmt.Printf("failed to kill indexer process: %s\n", err) + if err := cmd.Process.Kill(); err != nil { + return fmt.Errorf("failed to kill indexer process: %w", err) + } + } + if err := cmd.Wait(); err != nil { + fmt.Printf("ignoring error while waiting for process to stop: %s\n", err) } - return nil }, nil } diff --git a/cmd/block-generator/runner/runner.go b/cmd/block-generator/runner/runner.go index 5d42a879a..c0bbf7cbe 100644 --- a/cmd/block-generator/runner/runner.go +++ b/cmd/block-generator/runner/runner.go @@ -36,6 +36,7 @@ func init() { RunnerCmd.Flags().StringVarP(&runnerArgs.CPUProfilePath, "cpuprofile", "", "", "Path where Indexer writes its CPU profile.") RunnerCmd.Flags().BoolVarP(&runnerArgs.ResetReportDir, "reset", "", false, "If set any existing report directory will be deleted before running tests.") RunnerCmd.Flags().BoolVarP(&runnerArgs.RunValidation, "validate", "", false, "If set the validator will run after test-duration has elapsed to verify data is correct. An extra line in each report indicates validator success or failure.") + RunnerCmd.Flags().BoolVarP(&runnerArgs.KeepDataDir, "keep-data-dir", "k", false, "If set the validator will not delete the data directory after tests complete.") RunnerCmd.MarkFlagRequired("scenario") RunnerCmd.MarkFlagRequired("indexer-binary") From 42a7445d51f69bb7cbe7407e500942dd8ee9ea4b Mon Sep 17 00:00:00 2001 From: Barbara Poon Date: Mon, 25 Jul 2022 16:10:03 -0400 Subject: [PATCH 08/39] Revert "Bump version to 2.13.0" This reverts commit 7915890baf377ec38dcc02c8143035ffd4955d2d. --- .version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.version b/.version index fb2c0766b..7b75d8034 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -2.13.0 +2.13.0-rc1 From 4126e35b9c984c60962f05047f9b66b960d06bc3 Mon Sep 17 00:00:00 2001 From: DevOps Service Date: Mon, 25 Jul 2022 20:11:42 +0000 Subject: [PATCH 09/39] Bump version to 2.13.0 --- .version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.version b/.version index 7b75d8034..fb2c0766b 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -2.13.0-rc1 +2.13.0 From ed2a991532a104eb655c8d44d8f307ee6e0753c5 Mon Sep 17 00:00:00 2001 From: Eric Warehime Date: Mon, 25 Jul 2022 14:54:05 -0700 Subject: [PATCH 10/39] test fixes: Submodule updates (#1144) * Update go-algorand submodule * Fix test failure due to duplicate txns * Add new ledger interface method --- go.mod | 2 +- go.sum | 2 ++ idb/postgres/postgres_integration_test.go | 19 ++++++++------- processor/eval/ledger_for_evaluator.go | 5 ++++ third_party/go-algorand | 2 +- util/test/account_testutil.go | 28 ++++++++++++++++++++++- 6 files changed, 47 insertions(+), 11 deletions(-) diff --git a/go.mod b/go.mod index 7cbfab537..7fe6dcd03 100644 --- a/go.mod +++ b/go.mod @@ -33,7 +33,6 @@ require ( github.com/algorand/falcon v0.0.0-20220130164023-c9e1d466f123 // indirect github.com/algorand/go-deadlock v0.2.2 // indirect github.com/algorand/go-sumhash v0.1.0 // indirect - github.com/algorand/graphtrace v0.1.0 // indirect github.com/algorand/msgp v1.1.52 // indirect github.com/algorand/websocket v1.4.5 // indirect github.com/aws/aws-sdk-go v1.30.19 // indirect @@ -51,6 +50,7 @@ require ( github.com/fsnotify/fsnotify v1.5.1 // indirect github.com/ghodss/yaml v1.0.0 // indirect github.com/golang/protobuf v1.5.2 // indirect + github.com/golang/snappy v0.0.4 // indirect github.com/google/go-querystring v1.0.0 // indirect github.com/google/uuid v1.1.2 // indirect github.com/gorilla/mux v1.7.4 // indirect diff --git a/go.sum b/go.sum index b5a0fb097..2129abf7d 100644 --- a/go.sum +++ b/go.sum @@ -333,6 +333,8 @@ github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= diff --git a/idb/postgres/postgres_integration_test.go b/idb/postgres/postgres_integration_test.go index 6cbb19368..69e093dd4 100644 --- a/idb/postgres/postgres_integration_test.go +++ b/idb/postgres/postgres_integration_test.go @@ -165,7 +165,8 @@ func TestAssetCloseReopenTransfer(t *testing.T) { // Given // A round scenario requiring subround accounting: AccountA is funded, closed, opts back, and funded again. /////////// createAsset := test.MakeAssetConfigTxn(0, total, uint64(6), false, "mcn", "my coin", "http://antarctica.com", test.AccountD) - optInA := test.MakeAssetOptInTxn(assetid, test.AccountA) + optInA1 := test.MakeAssetOptInTxn(assetid, test.AccountA) + optInA2 := test.MakeAssetOptInTxn(assetid, test.AccountA) fundA := test.MakeAssetTransferTxn(assetid, amt, test.AccountD, test.AccountA, basics.Address{}) optInB := test.MakeAssetOptInTxn(assetid, test.AccountB) optInC := test.MakeAssetOptInTxn(assetid, test.AccountC) @@ -173,8 +174,8 @@ func TestAssetCloseReopenTransfer(t *testing.T) { payMain := test.MakeAssetTransferTxn(assetid, amt, test.AccountD, test.AccountA, basics.Address{}) block, err := test.MakeBlockForTxns( - test.MakeGenesisBlock().BlockHeader, &createAsset, &optInA, &fundA, &optInB, - &optInC, &closeA, &optInA, &payMain) + test.MakeGenesisBlock().BlockHeader, &createAsset, &optInA1, &fundA, &optInB, + &optInC, &closeA, &optInA2, &payMain) require.NoError(t, err) ////////// @@ -215,7 +216,8 @@ func TestReCreateAssetHolding(t *testing.T) { createAssetFrozen := test.MakeAssetConfigTxn( 0, total, uint64(6), frozen, "icicles", "frozen coin", "http://antarctica.com", test.AccountA) - optinB := test.MakeAssetOptInTxn(assetid, test.AccountB) + optinB1 := test.MakeAssetOptInTxn(assetid, test.AccountB) + optinB2 := test.MakeAssetOptInTxn(assetid, test.AccountB) unfreezeB := test.MakeAssetFreezeTxn( assetid, !frozen, test.AccountA, test.AccountB) optoutB := test.MakeAssetTransferTxn( @@ -223,8 +225,8 @@ func TestReCreateAssetHolding(t *testing.T) { var err error block, err = test.MakeBlockForTxns( - block.BlockHeader, &createAssetFrozen, &optinB, &unfreezeB, - &optoutB, &optinB) + block.BlockHeader, &createAssetFrozen, &optinB1, &unfreezeB, + &optoutB, &optinB2) require.NoError(t, err) ////////// @@ -256,11 +258,12 @@ func TestNoopOptins(t *testing.T) { createAsset := test.MakeAssetConfigTxn( 0, uint64(1000000), uint64(6), true, "icicles", "frozen coin", "http://antarctica.com", test.AccountD) - optinB := test.MakeAssetOptInTxn(assetid, test.AccountB) + optinB1 := test.MakeAssetOptInTxn(assetid, test.AccountB) + optinB2 := test.MakeAssetOptInTxn(assetid, test.AccountB) unfreezeB := test.MakeAssetFreezeTxn(assetid, false, test.AccountD, test.AccountB) block, err := test.MakeBlockForTxns( - test.MakeGenesisBlock().BlockHeader, &createAsset, &optinB, &unfreezeB, &optinB) + test.MakeGenesisBlock().BlockHeader, &createAsset, &optinB1, &unfreezeB, &optinB2) require.NoError(t, err) ////////// diff --git a/processor/eval/ledger_for_evaluator.go b/processor/eval/ledger_for_evaluator.go index 762ea96ed..5000a8131 100644 --- a/processor/eval/ledger_for_evaluator.go +++ b/processor/eval/ledger_for_evaluator.go @@ -148,3 +148,8 @@ func (l LedgerForEvaluator) LatestTotals() (ledgercore.AccountTotals, error) { _, totals, err := l.Ledger.LatestTotals() return totals, err } + +// BlockHdrCached is part of go-algorand's indexerLedgerForEval interface. +func (l LedgerForEvaluator) BlockHdrCached(round basics.Round) (bookkeeping.BlockHeader, error) { + panic("not implemented") +} diff --git a/third_party/go-algorand b/third_party/go-algorand index 688b3d715..3f6439873 160000 --- a/third_party/go-algorand +++ b/third_party/go-algorand @@ -1 +1 @@ -Subproject commit 688b3d7159b4644e1d6d6993dcef221c3eea7c96 +Subproject commit 3f643987336fb85ef61d70ae4cfed0bd60175bd0 diff --git a/util/test/account_testutil.go b/util/test/account_testutil.go index 2e3441eb6..6b7e359c6 100644 --- a/util/test/account_testutil.go +++ b/util/test/account_testutil.go @@ -2,12 +2,13 @@ package test import ( "fmt" - + "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/crypto" "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/data/bookkeeping" "github.com/algorand/go-algorand/data/transactions" "github.com/algorand/go-algorand/protocol" + "math/rand" ) var ( @@ -58,6 +59,7 @@ func MakeAssetConfigTxn(configid, total, decimals uint64, defaultFrozen bool, un Sender: addr, Fee: basics.MicroAlgos{Raw: 1000}, GenesisHash: GenesisHash, + Note: ArbitraryString(), }, AssetConfigTxnFields: transactions.AssetConfigTxnFields{ ConfigAsset: basics.AssetIndex(configid), @@ -91,6 +93,7 @@ func MakeAssetFreezeTxn(assetid uint64, frozen bool, sender, freezeAccount basic Sender: sender, Fee: basics.MicroAlgos{Raw: 1000}, GenesisHash: GenesisHash, + Note: ArbitraryString(), }, AssetFreezeTxnFields: transactions.AssetFreezeTxnFields{ FreezeAccount: freezeAccount, @@ -113,6 +116,7 @@ func MakeAssetTransferTxn(assetid, amt uint64, sender, receiver, close basics.Ad Sender: sender, Fee: basics.MicroAlgos{Raw: 1000}, GenesisHash: GenesisHash, + Note: ArbitraryString(), }, AssetTransferTxnFields: transactions.AssetTransferTxnFields{ XferAsset: basics.AssetIndex(assetid), @@ -142,6 +146,7 @@ func MakeAssetDestroyTxn(assetID uint64, sender basics.Address) transactions.Sig Header: transactions.Header{ Sender: sender, GenesisHash: GenesisHash, + Note: ArbitraryString(), }, AssetConfigTxnFields: transactions.AssetConfigTxnFields{ ConfigAsset: basics.AssetIndex(assetID), @@ -165,6 +170,7 @@ func MakePaymentTxn(fee, amt, closeAmt, sendRewards, receiveRewards, GenesisHash: GenesisHash, RekeyTo: rekeyTo, LastValid: 10, + Note: ArbitraryString(), }, PaymentTxnFields: transactions.PaymentTxnFields{ Receiver: receiver, @@ -193,6 +199,7 @@ func MakeCreateAppTxn(sender basics.Address) transactions.SignedTxnWithAD { Header: transactions.Header{ Sender: sender, GenesisHash: GenesisHash, + Note: ArbitraryString(), }, ApplicationCallTxnFields: transactions.ApplicationCallTxnFields{ ApprovalProgram: []byte{0x02, 0x20, 0x01, 0x01, 0x22}, @@ -213,6 +220,7 @@ func MakeAppDestroyTxn(appid uint64, sender basics.Address) transactions.SignedT Header: transactions.Header{ Sender: sender, GenesisHash: GenesisHash, + Note: ArbitraryString(), }, ApplicationCallTxnFields: transactions.ApplicationCallTxnFields{ ApplicationID: basics.AppIndex(appid), @@ -235,6 +243,7 @@ func MakeAppOptInTxn(appid uint64, sender basics.Address) transactions.SignedTxn Header: transactions.Header{ Sender: sender, GenesisHash: GenesisHash, + Note: ArbitraryString(), }, ApplicationCallTxnFields: transactions.ApplicationCallTxnFields{ ApplicationID: basics.AppIndex(appid), @@ -255,6 +264,7 @@ func MakeAppOptOutTxn(appid uint64, sender basics.Address) transactions.SignedTx Header: transactions.Header{ Sender: sender, GenesisHash: GenesisHash, + Note: ArbitraryString(), }, ApplicationCallTxnFields: transactions.ApplicationCallTxnFields{ ApplicationID: basics.AppIndex(appid), @@ -275,6 +285,7 @@ func MakeAppCallTxn(appid uint64, sender basics.Address) transactions.SignedTxnW Header: transactions.Header{ Sender: sender, GenesisHash: GenesisHash, + Note: ArbitraryString(), }, ApplicationCallTxnFields: transactions.ApplicationCallTxnFields{ ApplicationID: basics.AppIndex(appid), @@ -315,6 +326,7 @@ func MakeAppCallWithInnerTxn(appSender, paymentSender, paymentReceiver, assetSen Type: protocol.PaymentTx, Header: transactions.Header{ Sender: paymentSender, + Note: ArbitraryString(), }, PaymentTxnFields: transactions.PaymentTxnFields{ Receiver: paymentReceiver, @@ -329,6 +341,7 @@ func MakeAppCallWithInnerTxn(appSender, paymentSender, paymentReceiver, assetSen Type: protocol.ApplicationCallTx, Header: transactions.Header{ Sender: assetSender, + Note: ArbitraryString(), }, ApplicationCallTxnFields: transactions.ApplicationCallTxnFields{ ApplicationID: 789, @@ -349,6 +362,7 @@ func MakeAppCallWithInnerTxn(appSender, paymentSender, paymentReceiver, assetSen Type: protocol.AssetTransferTx, Header: transactions.Header{ Sender: assetSender, + Note: ArbitraryString(), }, AssetTransferTxnFields: transactions.AssetTransferTxnFields{ AssetReceiver: assetReceiver, @@ -393,6 +407,7 @@ func MakeAppCallWithMultiLogs(appSender basics.Address) transactions.SignedTxnWi Type: protocol.ApplicationCallTx, Header: transactions.Header{ Sender: appSender, + Note: ArbitraryString(), }, ApplicationCallTxnFields: transactions.ApplicationCallTxnFields{ ApplicationID: 789, @@ -457,6 +472,7 @@ func MakeAppCallWithInnerAppCall(appSender basics.Address) transactions.SignedTx Type: protocol.ApplicationCallTx, Header: transactions.Header{ Sender: appSender, + Note: ArbitraryString(), }, ApplicationCallTxnFields: transactions.ApplicationCallTxnFields{ ApplicationID: 789, @@ -478,6 +494,7 @@ func MakeAppCallWithInnerAppCall(appSender basics.Address) transactions.SignedTx Type: protocol.ApplicationCallTx, Header: transactions.Header{ Sender: appSender, + Note: ArbitraryString(), }, ApplicationCallTxnFields: transactions.ApplicationCallTxnFields{ ApplicationID: 789, @@ -494,6 +511,7 @@ func MakeAppCallWithInnerAppCall(appSender basics.Address) transactions.SignedTx Header: transactions.Header{ Sender: appSender, GenesisHash: GenesisHash, + Note: ArbitraryString(), }, ApplicationCallTxnFields: transactions.ApplicationCallTxnFields{ ApprovalProgram: []byte{0x02, 0x20, 0x01, 0x01, 0x22}, @@ -602,3 +620,11 @@ func MakeGenesisBlock() bookkeeping.Block { } return genesisBlock } + +// ArbitraryString should be used to generate a pseudo-random string to put in the Note field of a Txn Header. +// This is necessary to ensure the hash of any two txns used in tests are never the same. +func ArbitraryString() []byte { + arb := make([]byte, config.MaxTxnNoteBytes) + rand.Read(arb) + return arb +} From 646ca85db9899eead7b71a4a96ad52ec9ea543f4 Mon Sep 17 00:00:00 2001 From: Zeph Grunschlag Date: Tue, 26 Jul 2022 10:51:13 -0400 Subject: [PATCH 11/39] Enhancement: remove import validator utility and obsolete ledger for evaluator (#1146) removing a bunch of code and make the random test pass with the new ledger for evaluator --- cmd/algorand-indexer/main.go | 2 - cmd/import-validator/README.md | 49 - cmd/import-validator/core/command.go | 34 - cmd/import-validator/core/service.go | 420 -------- cmd/import-validator/main.go | 9 - go.mod | 1 + .../ledger_for_evaluator.go | 516 --------- .../ledger_for_evaluator_test.go | 981 ------------------ idb/postgres/postgres.go | 124 --- idb/postgres/postgres_rand_test.go | 151 ++- 10 files changed, 70 insertions(+), 2217 deletions(-) delete mode 100644 cmd/import-validator/README.md delete mode 100644 cmd/import-validator/core/command.go delete mode 100644 cmd/import-validator/core/service.go delete mode 100644 cmd/import-validator/main.go delete mode 100644 idb/postgres/internal/ledger_for_evaluator/ledger_for_evaluator.go delete mode 100644 idb/postgres/internal/ledger_for_evaluator/ledger_for_evaluator_test.go diff --git a/cmd/algorand-indexer/main.go b/cmd/algorand-indexer/main.go index 72f3667c2..c1540fcca 100644 --- a/cmd/algorand-indexer/main.go +++ b/cmd/algorand-indexer/main.go @@ -12,7 +12,6 @@ import ( "github.com/spf13/viper" bg "github.com/algorand/indexer/cmd/block-generator/core" - iv "github.com/algorand/indexer/cmd/import-validator/core" v "github.com/algorand/indexer/cmd/validator/core" "github.com/algorand/indexer/config" "github.com/algorand/indexer/idb" @@ -101,7 +100,6 @@ func init() { Short: "Utilities for testing Indexer operation and correctness.", Long: "Utilities used for Indexer development. These are low level tools that may require low level knowledge of Indexer deployment and operation. They are included as part of this binary for ease of deployment and automation, and to publicize their existance to people who may find them useful. More detailed documention may be found on github in README files located the different 'cmd' directories.", } - utilsCmd.AddCommand(iv.ImportValidatorCmd) utilsCmd.AddCommand(v.ValidatorCmd) utilsCmd.AddCommand(bg.BlockGenerator) rootCmd.AddCommand(utilsCmd) diff --git a/cmd/import-validator/README.md b/cmd/import-validator/README.md deleted file mode 100644 index aaffa31e7..000000000 --- a/cmd/import-validator/README.md +++ /dev/null @@ -1,49 +0,0 @@ -# Import validation tool - -The import validator tool imports blocks into indexer database and algod's -sqlite database in lockstep and checks that the modified accounts and resources -are the same in the two databases. -It lets us detect the first round where an accounting discrepancy occurs -and it prints out the difference before crashing. - -There is a small limitation, however. -The list of modified address and resources is computed using the sqlite database. -Thus, if indexer's accounting were to modify a superset of that data, -this tool would not detect it. -This, however, should be unlikely. - -# Using the tool - -Running the tool is similar to running `algorand-indexer` with the exception -that one has to specify the path to the sqlite (go-algorand) database. - -Create a new postgres (indexer) database. -``` -createdb db0 -``` - -Create a directory for the sqlite (go-algorand) database. -This will essentially serve as a non-archival algod database. -``` -mkdir ledger -``` - -Run the tool. -``` -./import-validator --algod-net localhost:8080 --algod-token ALGOD_TOKEN --algod-ledger ledger --postgres "user=ubuntu host=localhost database=db0 sslmode=disable" -``` - -The tool can be safely stopped and started again. -Also, the provided indexer database can be created by indexer itself, and the -provided ledger sqlite database can be created by algod. -Since the import validator essentially exercises indexer's and go-algorand's -database code, this should work. -However, the sqlite database must be at the same round as the postgres database -or one round behind; otherwise, the import validator will fail to start. - -# Performance - -Reading and writing to/from the sqlite database is negligible compared to -importing blocks into the postgres database. -However, the tool has to read the modified state after importing each block. -Thus, we can expect the import validator to be about 1.5 times slower than indexer. diff --git a/cmd/import-validator/core/command.go b/cmd/import-validator/core/command.go deleted file mode 100644 index 8c07a8f5b..000000000 --- a/cmd/import-validator/core/command.go +++ /dev/null @@ -1,34 +0,0 @@ -package core - -import "github.com/spf13/cobra" - -// ImportValidatorCmd is the real-time import validator command. -var ImportValidatorCmd *cobra.Command - -func init() { - var args ImportValidatorArgs - - ImportValidatorCmd = &cobra.Command{ - Use: "import-validator", - Short: "Import validator", - Long: "Run with the special import validator mode. A sqlite ledger will be maintained along with the standard Indexer database. Each will increment the round in lock-step, and compare the account state of each modified account before moving on to the next round. If a data discrepency is detected, an error will be printed to stderr and the program will terminate.", - Run: func(cmd *cobra.Command, _ []string) { - Run(args) - }, - } - - ImportValidatorCmd.Flags().StringVar(&args.AlgodAddr, "algod-net", "", "host:port of algod") - ImportValidatorCmd.MarkFlagRequired("algod-net") - - ImportValidatorCmd.Flags().StringVar( - &args.AlgodToken, "algod-token", "", "api access token for algod") - ImportValidatorCmd.MarkFlagRequired("algod-token") - - ImportValidatorCmd.Flags().StringVar( - &args.AlgodLedger, "algod-ledger", "", "path to algod ledger directory") - ImportValidatorCmd.MarkFlagRequired("algod-ledger") - - ImportValidatorCmd.Flags().StringVar( - &args.PostgresConnStr, "postgres", "", "connection string for postgres database") - ImportValidatorCmd.MarkFlagRequired("postgres") -} diff --git a/cmd/import-validator/core/service.go b/cmd/import-validator/core/service.go deleted file mode 100644 index a066425c0..000000000 --- a/cmd/import-validator/core/service.go +++ /dev/null @@ -1,420 +0,0 @@ -package core - -import ( - "context" - "fmt" - "os" - "path" - "reflect" - "sync" - "time" - - log "github.com/sirupsen/logrus" - - "github.com/algorand/go-algorand-sdk/client/v2/algod" - "github.com/algorand/go-algorand/agreement" - "github.com/algorand/go-algorand/config" - "github.com/algorand/go-algorand/data/basics" - "github.com/algorand/go-algorand/data/bookkeeping" - "github.com/algorand/go-algorand/ledger" - "github.com/algorand/go-algorand/ledger/ledgercore" - "github.com/algorand/go-algorand/logging" - "github.com/algorand/go-algorand/protocol" - "github.com/algorand/go-algorand/rpcs" - - "github.com/algorand/indexer/fetcher" - "github.com/algorand/indexer/idb" - "github.com/algorand/indexer/idb/postgres" - "github.com/algorand/indexer/processor/blockprocessor" - "github.com/algorand/indexer/util" -) - -// ImportValidatorArgs required parameters for the import validator servies. -type ImportValidatorArgs struct { - AlgodAddr string - AlgodToken string - AlgodLedger string - PostgresConnStr string -} - -func getGenesis(client *algod.Client) (bookkeeping.Genesis, error) { - data, err := client.GetGenesis().Do(context.Background()) - if err != nil { - return bookkeeping.Genesis{}, fmt.Errorf("getGenesis() client err: %w", err) - } - - var res bookkeeping.Genesis - err = protocol.DecodeJSON([]byte(data), &res) - if err != nil { - return bookkeeping.Genesis{}, fmt.Errorf("getGenesis() decode err: %w", err) - } - - return res, nil -} - -func openIndexerDb(postgresConnStr string, genesis *bookkeeping.Genesis, logger *log.Logger) (*postgres.IndexerDb, error) { - db, availableCh, err := - postgres.OpenPostgres(postgresConnStr, idb.IndexerDbOptions{}, logger) - if err != nil { - return nil, fmt.Errorf("openIndexerDb() err: %w", err) - } - <-availableCh - - _, err = db.GetNextRoundToAccount() - if err != idb.ErrorNotInitialized { - if err != nil { - return nil, fmt.Errorf("openIndexerDb() err: %w", err) - } - } else { - err = db.LoadGenesis(*genesis) - if err != nil { - return nil, fmt.Errorf("openIndexerDb() err: %w", err) - } - } - - nextRound, err := db.GetNextRoundToAccount() - if err != nil { - return nil, fmt.Errorf("openIndexerDb() err: %w", err) - } - - if nextRound == 0 { - genesisBlock, err := genesis.Block() - if err != nil { - return nil, fmt.Errorf("error getting genesis block err: %w", err) - } - vb := ledgercore.MakeValidatedBlock(genesisBlock, ledgercore.StateDelta{}) - err = db.AddBlock(&vb) - if err != nil { - return nil, fmt.Errorf("openIndexerDb() err: %w", err) - } - } - - return db, nil -} - -func openLedger(logger *log.Logger, ledgerPath string, genesis *bookkeeping.Genesis) (*ledger.Ledger, error) { - accounts := make(map[basics.Address]basics.AccountData) - for _, alloc := range genesis.Allocation { - address, err := basics.UnmarshalChecksumAddress(alloc.Address) - if err != nil { - return nil, fmt.Errorf("openLedger() decode address err: %w", err) - } - accounts[address] = alloc.State - } - genesisBlock, err := genesis.Block() - if err != nil { - return nil, fmt.Errorf("error getting genesis block err: %w", err) - - } - initState := ledgercore.InitState{ - Block: genesisBlock, - Accounts: accounts, - GenesisHash: genesisBlock.GenesisHash(), - } - - l, err := ledger.OpenLedger( - logging.NewWrappedLogger(logger), path.Join(ledgerPath, "ledger"), false, initState, config.GetDefaultLocal()) - if err != nil { - return nil, fmt.Errorf("openLedger() open err: %w", err) - } - - return l, nil -} - -func getModifiedState(l *ledger.Ledger, block *bookkeeping.Block) (map[basics.Address]struct{}, map[basics.Address]map[ledger.Creatable]struct{}, error) { - eval, err := l.StartEvaluator(block.BlockHeader, len(block.Payset), 0) - if err != nil { - return nil, nil, fmt.Errorf("getModifiedState() start evaluator err: %w", err) - } - - paysetgroups, err := block.DecodePaysetGroups() - if err != nil { - return nil, nil, fmt.Errorf("getModifiedState() decode payset groups err: %w", err) - } - - for _, group := range paysetgroups { - err = eval.TransactionGroup(group) - if err != nil { - return nil, nil, - fmt.Errorf("getModifiedState() apply transaction group err: %w", err) - } - } - - vb, err := eval.GenerateBlock() - if err != nil { - return nil, nil, fmt.Errorf("getModifiedState() generate block err: %w", err) - } - - accountDeltas := vb.Delta().Accts - - modifiedAccounts := make(map[basics.Address]struct{}) - for _, address := range accountDeltas.ModifiedAccounts() { - modifiedAccounts[address] = struct{}{} - } - - modifiedResources := make(map[basics.Address]map[ledger.Creatable]struct{}) - for _, r := range accountDeltas.GetAllAssetResources() { - c, ok := modifiedResources[r.Addr] - if !ok { - c = make(map[ledger.Creatable]struct{}) - modifiedResources[r.Addr] = c - } - creatable := ledger.Creatable{ - Index: basics.CreatableIndex(r.Aidx), - Type: basics.AssetCreatable, - } - c[creatable] = struct{}{} - } - for _, r := range accountDeltas.GetAllAppResources() { - c, ok := modifiedResources[r.Addr] - if !ok { - c = make(map[ledger.Creatable]struct{}) - modifiedResources[r.Addr] = c - } - creatable := ledger.Creatable{ - Index: basics.CreatableIndex(r.Aidx), - Type: basics.AppCreatable, - } - c[creatable] = struct{}{} - } - - return modifiedAccounts, modifiedResources, nil -} - -// Converts an `ledgercore.AppResource` to a `ledgercore.AccountResource`. -// Returns a copy with the `GlobalState` and `KeyValue` fields normalized if needed. -func convertAppResource(r ledgercore.AppResource) (ar ledgercore.AccountResource) { - ar.AppLocalState = r.AppLocalState - ar.AppParams = r.AppParams - if (r.AppParams != nil) && (len(r.AppParams.GlobalState) == 0) { - // Make a copy of `AppParams` to avoid modifying ledger's storage. - appParams := new(basics.AppParams) - *appParams = *r.AppParams - appParams.GlobalState = nil - ar.AppParams = appParams - } - if (r.AppLocalState != nil) && (len(r.AppLocalState.KeyValue) == 0) { - // Make a copy of `AppLocalState` to avoid modifying ledger's storage. - appLocalState := new(basics.AppLocalState) - *appLocalState = *r.AppLocalState - appLocalState.KeyValue = nil - ar.AppLocalState = appLocalState - } - - return ar -} - -func checkModifiedState(db *postgres.IndexerDb, l *ledger.Ledger, block *bookkeeping.Block, addresses map[basics.Address]struct{}, resources map[basics.Address]map[ledger.Creatable]struct{}) error { - var accountsIndexer map[basics.Address]ledgercore.AccountData - var resourcesIndexer map[basics.Address]map[ledger.Creatable]ledgercore.AccountResource - var err0 error - var accountsAlgod map[basics.Address]ledgercore.AccountData - var resourcesAlgod map[basics.Address]map[ledger.Creatable]ledgercore.AccountResource - var err1 error - var wg sync.WaitGroup - - wg.Add(1) - go func() { - defer wg.Done() - - var accounts map[basics.Address]*ledgercore.AccountData - accounts, resourcesIndexer, err0 = db.GetAccountState(addresses, resources) - if err0 != nil { - err0 = fmt.Errorf("checkModifiedState() err0: %w", err0) - return - } - - accountsIndexer = make(map[basics.Address]ledgercore.AccountData, len(accounts)) - for address, accountData := range accounts { - if accountData == nil { - accountsIndexer[address] = ledgercore.AccountData{} - } else { - accountsIndexer[address] = *accountData - } - } - }() - - wg.Add(1) - go func() { - defer wg.Done() - - accountsAlgod = make(map[basics.Address]ledgercore.AccountData, len(addresses)) - for address := range addresses { - accountsAlgod[address], _, err1 = l.LookupWithoutRewards(block.Round(), address) - if err1 != nil { - err1 = fmt.Errorf("checkModifiedState() lookup account err1: %w", err1) - return - } - } - resourcesAlgod = - make(map[basics.Address]map[ledger.Creatable]ledgercore.AccountResource) - for address, creatables := range resources { - resourcesForAddress := make(map[ledger.Creatable]ledgercore.AccountResource) - resourcesAlgod[address] = resourcesForAddress - for creatable := range creatables { - switch creatable.Type { - case basics.AssetCreatable: - var assetResource ledgercore.AssetResource - assetResource, err1 = l.LookupAsset(block.Round(), address, basics.AssetIndex(creatable.Index)) - if err1 != nil { - err1 = fmt.Errorf("checkModifiedState() lookup asset resource err1: %w", err1) - return - } - ar := ledgercore.AccountResource{ - AssetParams: assetResource.AssetParams, - AssetHolding: assetResource.AssetHolding, - } - resourcesForAddress[creatable] = ar - case basics.AppCreatable: - var appResource ledgercore.AppResource - appResource, err1 = l.LookupApplication(block.Round(), address, basics.AppIndex(creatable.Index)) - if err1 != nil { - err1 = fmt.Errorf("checkModifiedState() lookup application resource err1: %w", err1) - return - } - resourcesForAddress[creatable] = convertAppResource(appResource) - default: - err1 = fmt.Errorf("checkModifiedState() unexpected creatable type %v", creatable.Type) - return - } - } - } - }() - - wg.Wait() - if err0 != nil { - return err0 - } - if err1 != nil { - return err1 - } - - if !reflect.DeepEqual(accountsIndexer, accountsAlgod) { - diff := util.Diff(accountsAlgod, accountsIndexer) - return fmt.Errorf( - "checkModifiedState() accounts differ,"+ - "\naccountsIndexer: %+v,\naccountsAlgod: %+v,\ndiff: %s", - accountsIndexer, accountsAlgod, diff) - } - if !reflect.DeepEqual(resourcesIndexer, resourcesAlgod) { - diff := util.Diff(resourcesAlgod, resourcesIndexer) - return fmt.Errorf( - "checkModifiedState() resources differ,"+ - "\nresourcesIndexer: %+v,\nresourcesAlgod: %+v,\ndiff: %s", - resourcesIndexer, resourcesAlgod, diff) - } - - return nil -} - -func catchup(db *postgres.IndexerDb, l *ledger.Ledger, bot fetcher.Fetcher, logger *log.Logger) error { - nextRoundIndexer, err := db.GetNextRoundToAccount() - if err != nil { - return fmt.Errorf("catchup err: %w", err) - } - nextRoundLedger := uint64(l.Latest()) + 1 - - if nextRoundLedger > nextRoundIndexer { - return fmt.Errorf( - "catchup() ledger is ahead of indexer nextRoundIndexer: %d nextRoundLedger: %d", - nextRoundIndexer, nextRoundLedger) - } - - if nextRoundIndexer > nextRoundLedger+1 { - return fmt.Errorf( - "catchup() indexer is too ahead of ledger "+ - "nextRoundIndexer: %d nextRoundLedger: %d", - nextRoundIndexer, nextRoundLedger) - } - - blockHandlerFunc := func(ctx context.Context, block *rpcs.EncodedBlockCert) error { - var modifiedAccounts map[basics.Address]struct{} - var modifiedResources map[basics.Address]map[ledger.Creatable]struct{} - var err0 error - var err1 error - var wg sync.WaitGroup - - wg.Add(1) - go func() { - modifiedAccounts, modifiedResources, err0 = getModifiedState(l, &block.Block) - wg.Done() - }() - - if nextRoundLedger >= nextRoundIndexer { - wg.Add(1) - prc, err := blockprocessor.MakeProcessorWithLedger(logger, l, db.AddBlock) - if err != nil { - return fmt.Errorf("catchup() err: %w", err) - } - blockCert := rpcs.EncodedBlockCert{Block: block.Block, Certificate: block.Certificate} - go func() { - start := time.Now() - err1 = prc.Process(&blockCert) - fmt.Printf( - "%d transactions imported in %v\n", - len(block.Block.Payset), time.Since(start)) - wg.Done() - }() - } - - wg.Wait() - if err0 != nil { - return fmt.Errorf("catchup() err0: %w", err0) - } - if nextRoundLedger >= nextRoundIndexer { - if err1 != nil { - return fmt.Errorf("catchup() err1: %w", err1) - } - nextRoundIndexer++ - } - - err0 = l.AddBlock(block.Block, agreement.Certificate{}) - if err0 != nil { - return fmt.Errorf("catchup() err0: %w", err0) - } - nextRoundLedger++ - - return checkModifiedState( - db, l, &block.Block, modifiedAccounts, modifiedResources) - } - bot.SetBlockHandler(blockHandlerFunc) - bot.SetNextRound(nextRoundLedger) - err = bot.Run(context.Background()) - if err != nil { - return fmt.Errorf("catchup err: %w", err) - } - - return nil -} - -// Run is a blocking call that runs the import validator service. -func Run(args ImportValidatorArgs) { - logger := log.New() - - bot, err := fetcher.ForNetAndToken(args.AlgodAddr, args.AlgodToken, logger) - if err != nil { - fmt.Printf("error initializing fetcher err: %v", err) - os.Exit(1) - } - genesis, err := getGenesis(bot.Algod()) - if err != nil { - fmt.Printf("error getting genesis err: %v", err) - os.Exit(1) - } - db, err := openIndexerDb(args.PostgresConnStr, &genesis, logger) - if err != nil { - fmt.Printf("error opening indexer database err: %v", err) - os.Exit(1) - } - l, err := openLedger(logger, args.AlgodLedger, &genesis) - if err != nil { - fmt.Printf("error opening algod database err: %v", err) - os.Exit(1) - } - - err = catchup(db, l, bot, logger) - if err != nil { - fmt.Printf("error catching up err: %v", err) - os.Exit(1) - } -} diff --git a/cmd/import-validator/main.go b/cmd/import-validator/main.go deleted file mode 100644 index 71975a73c..000000000 --- a/cmd/import-validator/main.go +++ /dev/null @@ -1,9 +0,0 @@ -package main - -import ( - "github.com/algorand/indexer/cmd/import-validator/core" -) - -func main() { - core.ImportValidatorCmd.Execute() -} diff --git a/go.mod b/go.mod index 7fe6dcd03..ae45db9eb 100644 --- a/go.mod +++ b/go.mod @@ -33,6 +33,7 @@ require ( github.com/algorand/falcon v0.0.0-20220130164023-c9e1d466f123 // indirect github.com/algorand/go-deadlock v0.2.2 // indirect github.com/algorand/go-sumhash v0.1.0 // indirect + github.com/algorand/graphtrace v0.1.0 // indirect github.com/algorand/msgp v1.1.52 // indirect github.com/algorand/websocket v1.4.5 // indirect github.com/aws/aws-sdk-go v1.30.19 // indirect diff --git a/idb/postgres/internal/ledger_for_evaluator/ledger_for_evaluator.go b/idb/postgres/internal/ledger_for_evaluator/ledger_for_evaluator.go deleted file mode 100644 index fbd275dd6..000000000 --- a/idb/postgres/internal/ledger_for_evaluator/ledger_for_evaluator.go +++ /dev/null @@ -1,516 +0,0 @@ -package ledgerforevaluator - -import ( - "context" - "fmt" - - "github.com/algorand/go-algorand/data/basics" - "github.com/algorand/go-algorand/data/bookkeeping" - "github.com/algorand/go-algorand/ledger" - "github.com/algorand/go-algorand/ledger/ledgercore" - "github.com/jackc/pgx/v4" - - "github.com/algorand/indexer/idb/postgres/internal/encoding" - "github.com/algorand/indexer/idb/postgres/internal/schema" -) - -const ( - blockHeaderStmtName = "block_header" - assetCreatorStmtName = "asset_creator" - appCreatorStmtName = "app_creator" - accountStmtName = "account" - assetHoldingStmtName = "asset_holding" - assetParamsStmtName = "asset_params" - appParamsStmtName = "app_params" - appLocalStateStmtName = "app_local_state" - accountTotalsStmtName = "account_totals" -) - -var statements = map[string]string{ - blockHeaderStmtName: "SELECT header FROM block_header WHERE round = $1", - assetCreatorStmtName: "SELECT creator_addr FROM asset " + - "WHERE index = $1 AND NOT deleted", - appCreatorStmtName: "SELECT creator FROM app WHERE index = $1 AND NOT deleted", - accountStmtName: "SELECT microalgos, rewardsbase, rewards_total, account_data " + - "FROM account WHERE addr = $1 AND NOT deleted", - assetHoldingStmtName: "SELECT amount, frozen FROM account_asset " + - "WHERE addr = $1 AND assetid = $2 AND NOT deleted", - assetParamsStmtName: "SELECT creator_addr, params FROM asset " + - "WHERE index = $1 AND NOT deleted", - appParamsStmtName: "SELECT creator, params FROM app WHERE index = $1 AND NOT deleted", - appLocalStateStmtName: "SELECT localstate FROM account_app " + - "WHERE addr = $1 AND app = $2 AND NOT deleted", - accountTotalsStmtName: `SELECT v FROM metastate WHERE k = '` + - schema.AccountTotals + `'`, -} - -// LedgerForEvaluator implements the indexerLedgerForEval interface from -// go-algorand ledger/eval.go and is used for accounting. -type LedgerForEvaluator struct { - tx pgx.Tx - latestRound basics.Round -} - -// MakeLedgerForEvaluator creates a LedgerForEvaluator object. -func MakeLedgerForEvaluator(tx pgx.Tx, latestRound basics.Round) (LedgerForEvaluator, error) { - l := LedgerForEvaluator{ - tx: tx, - latestRound: latestRound, - } - - for name, query := range statements { - _, err := tx.Prepare(context.Background(), name, query) - if err != nil { - return LedgerForEvaluator{}, - fmt.Errorf("MakeLedgerForEvaluator() prepare statement err: %w", err) - } - } - - return l, nil -} - -// Close shuts down LedgerForEvaluator. -func (l *LedgerForEvaluator) Close() { - for name := range statements { - l.tx.Conn().Deallocate(context.Background(), name) - } -} - -// LatestBlockHdr is part of go-algorand's indexerLedgerForEval interface. -func (l LedgerForEvaluator) LatestBlockHdr() (bookkeeping.BlockHeader, error) { - row := l.tx.QueryRow(context.Background(), blockHeaderStmtName, uint64(l.latestRound)) - - var header []byte - err := row.Scan(&header) - if err != nil { - return bookkeeping.BlockHeader{}, fmt.Errorf("BlockHdr() scan row err: %w", err) - } - - res, err := encoding.DecodeBlockHeader(header) - if err != nil { - return bookkeeping.BlockHeader{}, fmt.Errorf("BlockHdr() decode header err: %w", err) - } - - return res, nil -} - -func (l *LedgerForEvaluator) parseAccountTable(row pgx.Row) (ledgercore.AccountData, bool /*exists*/, error) { - var microalgos uint64 - var rewardsbase uint64 - var rewardsTotal uint64 - var accountData []byte - - err := row.Scan(µalgos, &rewardsbase, &rewardsTotal, &accountData) - if err == pgx.ErrNoRows { - return ledgercore.AccountData{}, false, nil - } - if err != nil { - return ledgercore.AccountData{}, false, fmt.Errorf("parseAccountTable() scan row err: %w", err) - } - - var res ledgercore.AccountData - if accountData != nil { - res, err = encoding.DecodeTrimmedLcAccountData(accountData) - if err != nil { - return ledgercore.AccountData{}, false, - fmt.Errorf("parseAccountTable() decode account data err: %w", err) - } - } - - res.MicroAlgos = basics.MicroAlgos{Raw: microalgos} - res.RewardsBase = rewardsbase - res.RewardedMicroAlgos = basics.MicroAlgos{Raw: rewardsTotal} - - return res, true, nil -} - -// LookupWithoutRewards is part of go-algorand's indexerLedgerForEval interface. -func (l LedgerForEvaluator) LookupWithoutRewards(addresses map[basics.Address]struct{}) (map[basics.Address]*ledgercore.AccountData, error) { - addressesArr := make([]basics.Address, 0, len(addresses)) - for address := range addresses { - addressesArr = append(addressesArr, address) - } - - var batch pgx.Batch - for i := range addressesArr { - batch.Queue(accountStmtName, addressesArr[i][:]) - } - - results := l.tx.SendBatch(context.Background(), &batch) - defer results.Close() - - res := make(map[basics.Address]*ledgercore.AccountData, len(addresses)) - for _, address := range addressesArr { - row := results.QueryRow() - - lcAccountData := new(ledgercore.AccountData) - var exists bool - var err error - - *lcAccountData, exists, err = l.parseAccountTable(row) - if err != nil { - return nil, fmt.Errorf("LookupWithoutRewards() err: %w", err) - } - - if exists { - res[address] = lcAccountData - } else { - res[address] = nil - } - } - - err := results.Close() - if err != nil { - return nil, fmt.Errorf("LookupWithoutRewards() close results err: %w", err) - } - - return res, nil -} - -func (l *LedgerForEvaluator) parseAccountAssetTable(row pgx.Row) (basics.AssetHolding, bool /*exists*/, error) { - var amount uint64 - var frozen bool - - err := row.Scan(&amount, &frozen) - if err == pgx.ErrNoRows { - return basics.AssetHolding{}, false, nil - } - if err != nil { - return basics.AssetHolding{}, false, - fmt.Errorf("parseAccountAssetTable() scan row err: %w", err) - } - - assetHolding := basics.AssetHolding{ - Amount: amount, - Frozen: frozen, - } - return assetHolding, true, nil -} - -func (l *LedgerForEvaluator) parseAssetTable(row pgx.Row) (basics.Address /*creator*/, basics.AssetParams, bool /*exists*/, error) { - var creatorAddr []byte - var params []byte - - err := row.Scan(&creatorAddr, ¶ms) - if err == pgx.ErrNoRows { - return basics.Address{}, basics.AssetParams{}, false, nil - } - if err != nil { - return basics.Address{}, basics.AssetParams{}, false, - fmt.Errorf("parseAssetTable() scan row err: %w", err) - } - - var creator basics.Address - copy(creator[:], creatorAddr) - - assetParams, err := encoding.DecodeAssetParams(params) - if err != nil { - return basics.Address{}, basics.AssetParams{}, false, - fmt.Errorf("parseAssetTable() decode params err: %w", err) - } - - return creator, assetParams, true, nil -} - -func (l *LedgerForEvaluator) parseAppTable(row pgx.Row) (basics.Address /*creator*/, basics.AppParams, bool /*exists*/, error) { - var creatorAddr []byte - var params []byte - - err := row.Scan(&creatorAddr, ¶ms) - if err == pgx.ErrNoRows { - return basics.Address{}, basics.AppParams{}, false, nil - } - if err != nil { - return basics.Address{}, basics.AppParams{}, false, - fmt.Errorf("parseAppTable() scan row err: %w", err) - } - - var creator basics.Address - copy(creator[:], creatorAddr) - - appParams, err := encoding.DecodeAppParams(params) - if err != nil { - return basics.Address{}, basics.AppParams{}, false, - fmt.Errorf("parseAppTable() decode params err: %w", err) - } - - return creator, appParams, true, nil -} - -func (l *LedgerForEvaluator) parseAccountAppTable(row pgx.Row) (basics.AppLocalState, bool /*exists*/, error) { - var localstate []byte - - err := row.Scan(&localstate) - if err == pgx.ErrNoRows { - return basics.AppLocalState{}, false, nil - } - if err != nil { - return basics.AppLocalState{}, false, - fmt.Errorf("parseAccountAppTable() scan row err: %w", err) - } - - appLocalState, err := encoding.DecodeAppLocalState(localstate) - if err != nil { - return basics.AppLocalState{}, false, - fmt.Errorf("parseAccountAppTable() decode local state err: %w", err) - } - - return appLocalState, true, nil -} - -// LookupResources is part of go-algorand's indexerLedgerForEval interface. -func (l LedgerForEvaluator) LookupResources(input map[basics.Address]map[ledger.Creatable]struct{}) (map[basics.Address]map[ledger.Creatable]ledgercore.AccountResource, error) { - // Create request arrays since iterating over maps is non-deterministic. - type AddrID struct { - addr basics.Address - id basics.CreatableIndex - } - // Asset holdings to request. - assetHoldingsReq := make([]AddrID, 0, len(input)) - // Asset params to request. - assetParamsReq := make([]basics.CreatableIndex, 0, len(input)) - // For each asset id, record for which addresses it was requested. - assetParamsToAddresses := make(map[basics.CreatableIndex]map[basics.Address]struct{}) - // App local states to request. - appLocalStatesReq := make([]AddrID, 0, len(input)) - // App params to request. - appParamsReq := make([]basics.CreatableIndex, 0, len(input)) - // For each app id, record for which addresses it was requested. - appParamsToAddresses := make(map[basics.CreatableIndex]map[basics.Address]struct{}) - - for address, creatables := range input { - for creatable := range creatables { - switch creatable.Type { - case basics.AssetCreatable: - assetHoldingsReq = append(assetHoldingsReq, AddrID{address, creatable.Index}) - if addresses, ok := assetParamsToAddresses[creatable.Index]; ok { - addresses[address] = struct{}{} - } else { - assetParamsReq = append(assetParamsReq, creatable.Index) - addresses = make(map[basics.Address]struct{}) - addresses[address] = struct{}{} - assetParamsToAddresses[creatable.Index] = addresses - } - case basics.AppCreatable: - appLocalStatesReq = append(appLocalStatesReq, AddrID{address, creatable.Index}) - if addresses, ok := appParamsToAddresses[creatable.Index]; ok { - addresses[address] = struct{}{} - } else { - appParamsReq = append(appParamsReq, creatable.Index) - addresses = make(map[basics.Address]struct{}) - addresses[address] = struct{}{} - appParamsToAddresses[creatable.Index] = addresses - } - default: - return nil, fmt.Errorf( - "LookupResources() unknown creatable type %d", creatable.Type) - } - } - } - - // Prepare a batch of sql queries. - var batch pgx.Batch - for i := range assetHoldingsReq { - batch.Queue( - assetHoldingStmtName, assetHoldingsReq[i].addr[:], assetHoldingsReq[i].id) - } - for _, cidx := range assetParamsReq { - batch.Queue(assetParamsStmtName, cidx) - } - for _, cidx := range appParamsReq { - batch.Queue(appParamsStmtName, cidx) - } - for i := range appLocalStatesReq { - batch.Queue( - appLocalStateStmtName, appLocalStatesReq[i].addr[:], appLocalStatesReq[i].id) - } - - // Execute the sql queries. - results := l.tx.SendBatch(context.Background(), &batch) - defer results.Close() - - // Initialize the result `res` with the same structure as `input`. - res := make( - map[basics.Address]map[ledger.Creatable]ledgercore.AccountResource, len(input)) - for address, creatables := range input { - creatablesOutput := - make(map[ledger.Creatable]ledgercore.AccountResource, len(creatables)) - res[address] = creatablesOutput - for creatable := range creatables { - creatablesOutput[creatable] = ledgercore.AccountResource{} - } - } - - // Parse sql query results in the same order the queries were made. - for _, addrID := range assetHoldingsReq { - row := results.QueryRow() - assetHolding, exists, err := l.parseAccountAssetTable(row) - if err != nil { - return nil, fmt.Errorf("LookupResources() err: %w", err) - } - if exists { - creatable := ledger.Creatable{ - Index: addrID.id, - Type: basics.AssetCreatable, - } - resource := res[addrID.addr][creatable] - resource.AssetHolding = new(basics.AssetHolding) - *resource.AssetHolding = assetHolding - res[addrID.addr][creatable] = resource - } - } - for _, cidx := range assetParamsReq { - row := results.QueryRow() - creator, assetParams, exists, err := l.parseAssetTable(row) - if err != nil { - return nil, fmt.Errorf("LookupResources() err: %w", err) - } - if exists { - if _, ok := assetParamsToAddresses[cidx][creator]; ok { - creatable := ledger.Creatable{ - Index: cidx, - Type: basics.AssetCreatable, - } - resource := res[creator][creatable] - resource.AssetParams = new(basics.AssetParams) - *resource.AssetParams = assetParams - res[creator][creatable] = resource - } - } - } - for _, cidx := range appParamsReq { - row := results.QueryRow() - creator, appParams, exists, err := l.parseAppTable(row) - if err != nil { - return nil, fmt.Errorf("LookupResources() err: %w", err) - } - if exists { - if _, ok := appParamsToAddresses[cidx][creator]; ok { - creatable := ledger.Creatable{ - Index: cidx, - Type: basics.AppCreatable, - } - resource := res[creator][creatable] - resource.AppParams = new(basics.AppParams) - *resource.AppParams = appParams - res[creator][creatable] = resource - } - } - } - for _, addrID := range appLocalStatesReq { - row := results.QueryRow() - appLocalState, exists, err := l.parseAccountAppTable(row) - if err != nil { - return nil, fmt.Errorf("LookupResources() err: %w", err) - } - if exists { - creatable := ledger.Creatable{ - Index: addrID.id, - Type: basics.AppCreatable, - } - resource := res[addrID.addr][creatable] - resource.AppLocalState = new(basics.AppLocalState) - *resource.AppLocalState = appLocalState - res[addrID.addr][creatable] = resource - } - } - - err := results.Close() - if err != nil { - return nil, fmt.Errorf("LookupResources() close results err: %w", err) - } - - return res, nil -} - -func (l *LedgerForEvaluator) parseAddress(row pgx.Row) (basics.Address, bool /*exists*/, error) { - var buf []byte - err := row.Scan(&buf) - if err == pgx.ErrNoRows { - return basics.Address{}, false, nil - } - if err != nil { - return basics.Address{}, false, fmt.Errorf("parseAddress() err: %w", err) - } - - var address basics.Address - copy(address[:], buf) - - return address, true, nil -} - -// GetAssetCreator is part of go-algorand's indexerLedgerForEval interface. -func (l LedgerForEvaluator) GetAssetCreator(indices map[basics.AssetIndex]struct{}) (map[basics.AssetIndex]ledger.FoundAddress, error) { - indicesArr := make([]basics.AssetIndex, 0, len(indices)) - for index := range indices { - indicesArr = append(indicesArr, index) - } - - var batch pgx.Batch - for _, index := range indicesArr { - batch.Queue(assetCreatorStmtName, uint64(index)) - } - - results := l.tx.SendBatch(context.Background(), &batch) - res := make(map[basics.AssetIndex]ledger.FoundAddress, len(indices)) - for _, index := range indicesArr { - row := results.QueryRow() - - address, exists, err := l.parseAddress(row) - if err != nil { - return nil, fmt.Errorf("GetAssetCreator() err: %w", err) - } - - res[index] = ledger.FoundAddress{Address: address, Exists: exists} - } - results.Close() - - return res, nil -} - -// GetAppCreator is part of go-algorand's indexerLedgerForEval interface. -func (l LedgerForEvaluator) GetAppCreator(indices map[basics.AppIndex]struct{}) (map[basics.AppIndex]ledger.FoundAddress, error) { - indicesArr := make([]basics.AppIndex, 0, len(indices)) - for index := range indices { - indicesArr = append(indicesArr, index) - } - - var batch pgx.Batch - for _, index := range indicesArr { - batch.Queue(appCreatorStmtName, uint64(index)) - } - - results := l.tx.SendBatch(context.Background(), &batch) - res := make(map[basics.AppIndex]ledger.FoundAddress, len(indices)) - for _, index := range indicesArr { - row := results.QueryRow() - - address, exists, err := l.parseAddress(row) - if err != nil { - return nil, fmt.Errorf("GetAppCreator() err: %w", err) - } - - res[index] = ledger.FoundAddress{Address: address, Exists: exists} - } - results.Close() - - return res, nil -} - -// LatestTotals is part of go-algorand's indexerLedgerForEval interface. -func (l LedgerForEvaluator) LatestTotals() (ledgercore.AccountTotals, error) { - row := l.tx.QueryRow(context.Background(), accountTotalsStmtName) - - var json string - err := row.Scan(&json) - if err != nil { - return ledgercore.AccountTotals{}, fmt.Errorf("LatestTotals() scan err: %w", err) - } - - totals, err := encoding.DecodeAccountTotals([]byte(json)) - if err != nil { - return ledgercore.AccountTotals{}, fmt.Errorf("LatestTotals() decode err: %w", err) - } - - return totals, nil -} diff --git a/idb/postgres/internal/ledger_for_evaluator/ledger_for_evaluator_test.go b/idb/postgres/internal/ledger_for_evaluator/ledger_for_evaluator_test.go deleted file mode 100644 index cdccf7611..000000000 --- a/idb/postgres/internal/ledger_for_evaluator/ledger_for_evaluator_test.go +++ /dev/null @@ -1,981 +0,0 @@ -package ledgerforevaluator_test - -import ( - "context" - "fmt" - "math" - "testing" - - "github.com/algorand/go-algorand/crypto" - "github.com/algorand/go-algorand/crypto/merklesignature" - "github.com/algorand/go-algorand/data/basics" - "github.com/algorand/go-algorand/data/bookkeeping" - "github.com/algorand/go-algorand/ledger" - "github.com/algorand/go-algorand/ledger/ledgercore" - "github.com/jackc/pgx/v4" - "github.com/jackc/pgx/v4/pgxpool" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/algorand/indexer/idb/postgres/internal/encoding" - ledger_for_evaluator "github.com/algorand/indexer/idb/postgres/internal/ledger_for_evaluator" - "github.com/algorand/indexer/idb/postgres/internal/schema" - pgtest "github.com/algorand/indexer/idb/postgres/internal/testing" - pgutil "github.com/algorand/indexer/idb/postgres/internal/util" - "github.com/algorand/indexer/util/test" -) - -var readonlyRepeatableRead = pgx.TxOptions{IsoLevel: pgx.RepeatableRead, AccessMode: pgx.ReadOnly} - -func TestLedgerForEvaluatorLatestBlockHdr(t *testing.T) { - db, _, shutdownFunc := pgtest.SetupPostgresWithSchema(t) - defer shutdownFunc() - - query := - "INSERT INTO block_header (round, realtime, rewardslevel, header) " + - "VALUES (2, 'epoch', 0, $1)" - header := bookkeeping.BlockHeader{ - RewardsState: bookkeeping.RewardsState{ - FeeSink: test.FeeAddr, - }, - } - _, err := db.Exec(context.Background(), query, encoding.EncodeBlockHeader(header)) - require.NoError(t, err) - - tx, err := db.BeginTx(context.Background(), readonlyRepeatableRead) - require.NoError(t, err) - defer tx.Rollback(context.Background()) - - l, err := ledger_for_evaluator.MakeLedgerForEvaluator(tx, basics.Round(2)) - require.NoError(t, err) - defer l.Close() - - ret, err := l.LatestBlockHdr() - require.NoError(t, err) - - assert.Equal(t, header, ret) -} - -func TestLedgerForEvaluatorAccountTableBasic(t *testing.T) { - db, _, shutdownFunc := pgtest.SetupPostgresWithSchema(t) - defer shutdownFunc() - - query := `INSERT INTO account - (addr, microalgos, rewardsbase, rewards_total, deleted, created_at, account_data) - VALUES ($1, $2, $3, $4, false, 0, $5)` - - var voteID crypto.OneTimeSignatureVerifier - voteID[0] = 2 - var selectionID crypto.VRFVerifier - selectionID[0] = 3 - var stateProofID merklesignature.Verifier - stateProofID[0] = 10 - accountDataFull := ledgercore.AccountData{ - AccountBaseData: ledgercore.AccountBaseData{ - Status: basics.Online, - MicroAlgos: basics.MicroAlgos{Raw: 4}, - RewardsBase: 5, - RewardedMicroAlgos: basics.MicroAlgos{Raw: 6}, - AuthAddr: test.AccountA, - }, - VotingData: ledgercore.VotingData{ - VoteID: voteID, - SelectionID: selectionID, - StateProofID: stateProofID, - VoteFirstValid: basics.Round(7), - VoteLastValid: basics.Round(8), - VoteKeyDilution: 9, - }, - } - - accountDataWritten := encoding.TrimLcAccountData(accountDataFull) - - _, err := db.Exec( - context.Background(), - query, test.AccountB[:], accountDataFull.MicroAlgos.Raw, accountDataFull.RewardsBase, - accountDataFull.RewardedMicroAlgos.Raw, - encoding.EncodeTrimmedLcAccountData(accountDataWritten)) - require.NoError(t, err) - - tx, err := db.BeginTx(context.Background(), readonlyRepeatableRead) - require.NoError(t, err) - defer tx.Rollback(context.Background()) - - l, err := ledger_for_evaluator.MakeLedgerForEvaluator(tx, basics.Round(0)) - require.NoError(t, err) - defer l.Close() - - ret, err := - l.LookupWithoutRewards(map[basics.Address]struct{}{test.AccountB: {}}) - require.NoError(t, err) - - accountDataRet := ret[test.AccountB] - - require.NotNil(t, accountDataRet) - assert.Equal(t, accountDataFull, *accountDataRet) -} - -func insertDeletedAccount(db *pgxpool.Pool, address basics.Address) error { - query := `INSERT INTO account (addr, microalgos, rewardsbase, rewards_total, deleted, - created_at, account_data) - VALUES ($1, 0, 0, 0, true, 0, 'null'::jsonb)` - - _, err := db.Exec( - context.Background(), query, address[:]) - return err -} - -func insertAccount(db *pgxpool.Pool, address basics.Address, data ledgercore.AccountData) error { - query := `INSERT INTO account (addr, microalgos, rewardsbase, rewards_total, deleted, - created_at, account_data) - VALUES ($1, $2, $3, $4, false, 0, $5)` - - _, err := db.Exec( - context.Background(), query, - address[:], data.MicroAlgos.Raw, data.RewardsBase, data.RewardedMicroAlgos.Raw, - encoding.EncodeTrimmedLcAccountData(data)) - return err -} - -// TestLedgerForEvaluatorAccountTableBasicSingleAccount a table driven single account test. -func TestLedgerForEvaluatorAccountTableSingleAccount(t *testing.T) { - tests := []struct { - name string - deleted bool - data ledgercore.AccountData - err string - }{ - { - name: "small balance", - data: ledgercore.AccountData{ - AccountBaseData: ledgercore.AccountBaseData{ - MicroAlgos: basics.MicroAlgos{Raw: 1}, - }, - }, - }, - { - name: "max balance", - data: ledgercore.AccountData{ - AccountBaseData: ledgercore.AccountBaseData{ - MicroAlgos: basics.MicroAlgos{Raw: math.MaxInt64}, - }, - }, - }, - { - name: "over max balance", - data: ledgercore.AccountData{ - AccountBaseData: ledgercore.AccountBaseData{ - MicroAlgos: basics.MicroAlgos{Raw: math.MaxUint64}, - }, - }, - err: fmt.Sprintf( - "%d is greater than maximum value for Int8", uint64(math.MaxUint64)), - }, - { - name: "deleted", - deleted: true, - }, - } - - db, _, shutdownFunc := pgtest.SetupPostgresWithSchema(t) - defer shutdownFunc() - - for i, testcase := range tests { - tc := testcase - var addr basics.Address - addr[0] = byte(i + 1) - t.Run(tc.name, func(t *testing.T) { - // when returns true, exit test - checkError := func(err error) bool { - if err != nil && tc.err != "" { - require.Contains(t, err.Error(), tc.err) - return true - } - require.NoError(t, err) - return false - } - - var err error - if tc.deleted { - err = insertDeletedAccount(db, addr) - } else { - err = insertAccount(db, addr, tc.data) - } - if checkError(err) { - return - } - - require.NoError(t, err) - - tx, err := db.BeginTx(context.Background(), readonlyRepeatableRead) - if checkError(err) { - return - } - require.NoError(t, err) - defer tx.Rollback(context.Background()) - - l, err := ledger_for_evaluator.MakeLedgerForEvaluator(tx, basics.Round(0)) - if checkError(err) { - return - } - require.NoError(t, err) - defer l.Close() - - ret, err := l.LookupWithoutRewards(map[basics.Address]struct{}{addr: {}}) - if checkError(err) { - return - } - require.NoError(t, err) - - accountDataRet, ok := ret[addr] - require.True(t, ok) - - // should be no result if deleted - if tc.deleted { - assert.Nil(t, accountDataRet) - } else { - assert.Equal(t, &tc.data, accountDataRet) - } - }) - } -} - -func TestLedgerForEvaluatorAccountTableDeleted(t *testing.T) { - db, _, shutdownFunc := pgtest.SetupPostgresWithSchema(t) - defer shutdownFunc() - - query := - "INSERT INTO account (addr, microalgos, rewardsbase, rewards_total, deleted, " + - "created_at, account_data) " + - "VALUES ($1, 2, 3, 4, true, 0, $2)" - - accountData := ledgercore.AccountData{ - AccountBaseData: ledgercore.AccountBaseData{ - MicroAlgos: basics.MicroAlgos{Raw: 5}, - }, - } - _, err := db.Exec( - context.Background(), query, test.AccountB[:], - encoding.EncodeTrimmedLcAccountData(accountData)) - require.NoError(t, err) - - tx, err := db.BeginTx(context.Background(), readonlyRepeatableRead) - require.NoError(t, err) - defer tx.Rollback(context.Background()) - - l, err := ledger_for_evaluator.MakeLedgerForEvaluator(tx, basics.Round(0)) - require.NoError(t, err) - defer l.Close() - - ret, err := - l.LookupWithoutRewards(map[basics.Address]struct{}{test.AccountB: {}}) - require.NoError(t, err) - - accountDataRet := ret[test.AccountB] - assert.Nil(t, accountDataRet) -} - -func TestLedgerForEvaluatorAccountTableMissingAccount(t *testing.T) { - db, _, shutdownFunc := pgtest.SetupPostgresWithSchema(t) - defer shutdownFunc() - - tx, err := db.BeginTx(context.Background(), readonlyRepeatableRead) - require.NoError(t, err) - defer tx.Rollback(context.Background()) - - l, err := ledger_for_evaluator.MakeLedgerForEvaluator(tx, basics.Round(0)) - require.NoError(t, err) - defer l.Close() - - ret, err := - l.LookupWithoutRewards(map[basics.Address]struct{}{test.AccountB: {}}) - require.NoError(t, err) - - accountDataRet := ret[test.AccountB] - assert.Nil(t, accountDataRet) -} - -func insertDeletedAccountAsset(t *testing.T, db *pgxpool.Pool, addr basics.Address, assetid uint64) { - query := - "INSERT INTO account_asset (addr, assetid, amount, frozen, deleted, created_at) " + - "VALUES ($1, $2, 0, false, true, 0)" - - _, err := db.Exec( - context.Background(), query, addr[:], assetid) - require.NoError(t, err) -} - -func insertAccountAsset(t *testing.T, db *pgxpool.Pool, addr basics.Address, assetid uint64, amount uint64, frozen bool) { - query := - "INSERT INTO account_asset (addr, assetid, amount, frozen, deleted, created_at) " + - "VALUES ($1, $2, $3, $4, false, 0)" - - _, err := db.Exec( - context.Background(), query, addr[:], assetid, amount, frozen) - require.NoError(t, err) -} - -func TestLedgerForEvaluatorAccountAssetTable(t *testing.T) { - db, _, shutdownFunc := pgtest.SetupPostgresWithSchema(t) - defer shutdownFunc() - - insertAccountAsset(t, db, test.AccountA, 1, 2, false) - insertAccountAsset(t, db, test.AccountA, 3, 4, true) - insertDeletedAccountAsset(t, db, test.AccountA, 5) - insertAccountAsset(t, db, test.AccountB, 5, 6, true) - - tx, err := db.BeginTx(context.Background(), readonlyRepeatableRead) - require.NoError(t, err) - defer tx.Rollback(context.Background()) - - l, err := ledger_for_evaluator.MakeLedgerForEvaluator(tx, basics.Round(0)) - require.NoError(t, err) - defer l.Close() - - ret, err := l.LookupResources(map[basics.Address]map[ledger.Creatable]struct{}{ - test.AccountA: { - {Index: 1, Type: basics.AssetCreatable}: {}, - {Index: 3, Type: basics.AssetCreatable}: {}, - {Index: 5, Type: basics.AssetCreatable}: {}, - {Index: 8, Type: basics.AssetCreatable}: {}, - }, - test.AccountB: { - {Index: 5, Type: basics.AssetCreatable}: {}, - }, - }) - require.NoError(t, err) - - expected := map[basics.Address]map[ledger.Creatable]ledgercore.AccountResource{ - test.AccountA: { - ledger.Creatable{Index: 1, Type: basics.AssetCreatable}: { - AssetHolding: &basics.AssetHolding{ - Amount: 2, - Frozen: false, - }, - }, - ledger.Creatable{Index: 3, Type: basics.AssetCreatable}: { - AssetHolding: &basics.AssetHolding{ - Amount: 4, - Frozen: true, - }, - }, - ledger.Creatable{Index: 5, Type: basics.AssetCreatable}: {}, - ledger.Creatable{Index: 8, Type: basics.AssetCreatable}: {}, - }, - test.AccountB: { - ledger.Creatable{Index: 5, Type: basics.AssetCreatable}: { - AssetHolding: &basics.AssetHolding{ - Amount: 6, - Frozen: true, - }, - }, - }, - } - assert.Equal(t, expected, ret) -} - -func insertDeletedAsset(t *testing.T, db *pgxpool.Pool, index uint64, creatorAddr basics.Address) { - query := `INSERT INTO asset (index, creator_addr, params, deleted, created_at) - VALUES ($1, $2, 'null'::jsonb, true, 0)` - - _, err := db.Exec( - context.Background(), query, index, creatorAddr[:]) - require.NoError(t, err) -} - -func insertAsset(t *testing.T, db *pgxpool.Pool, index uint64, creatorAddr basics.Address, params *basics.AssetParams) { - query := `INSERT INTO asset (index, creator_addr, params, deleted, created_at) - VALUES ($1, $2, $3, false, 0)` - - _, err := db.Exec( - context.Background(), query, index, creatorAddr[:], - encoding.EncodeAssetParams(*params)) - require.NoError(t, err) -} - -func TestLedgerForEvaluatorAssetTable(t *testing.T) { - db, _, shutdownFunc := pgtest.SetupPostgresWithSchema(t) - defer shutdownFunc() - - insertAsset(t, db, 1, test.AccountA, &basics.AssetParams{Manager: test.AccountB}) - insertAsset(t, db, 2, test.AccountA, &basics.AssetParams{Total: 10}) - insertDeletedAsset(t, db, 3, test.AccountA) - insertAsset(t, db, 4, test.AccountC, &basics.AssetParams{Total: 12}) - insertAsset(t, db, 5, test.AccountD, &basics.AssetParams{Total: 13}) - - tx, err := db.BeginTx(context.Background(), readonlyRepeatableRead) - require.NoError(t, err) - defer tx.Rollback(context.Background()) - - l, err := ledger_for_evaluator.MakeLedgerForEvaluator(tx, basics.Round(0)) - require.NoError(t, err) - defer l.Close() - - ret, err := l.LookupResources(map[basics.Address]map[ledger.Creatable]struct{}{ - test.AccountA: { - {Index: 1, Type: basics.AssetCreatable}: {}, - {Index: 2, Type: basics.AssetCreatable}: {}, - {Index: 3, Type: basics.AssetCreatable}: {}, - {Index: 4, Type: basics.AssetCreatable}: {}, - {Index: 6, Type: basics.AssetCreatable}: {}, - }, - test.AccountD: { - {Index: 5, Type: basics.AssetCreatable}: {}, - }, - }) - require.NoError(t, err) - - expected := map[basics.Address]map[ledger.Creatable]ledgercore.AccountResource{ - test.AccountA: { - ledger.Creatable{Index: 1, Type: basics.AssetCreatable}: { - AssetParams: &basics.AssetParams{ - Manager: test.AccountB, - }, - }, - ledger.Creatable{Index: 2, Type: basics.AssetCreatable}: { - AssetParams: &basics.AssetParams{ - Total: 10, - }, - }, - ledger.Creatable{Index: 3, Type: basics.AssetCreatable}: {}, - ledger.Creatable{Index: 4, Type: basics.AssetCreatable}: {}, - ledger.Creatable{Index: 6, Type: basics.AssetCreatable}: {}, - }, - test.AccountD: { - ledger.Creatable{Index: 5, Type: basics.AssetCreatable}: { - AssetParams: &basics.AssetParams{ - Total: 13, - }, - }, - }, - } - assert.Equal(t, expected, ret) -} - -func insertDeletedApp(t *testing.T, db *pgxpool.Pool, index uint64, creator basics.Address) { - query := `INSERT INTO app (index, creator, params, deleted, created_at) - VALUES ($1, $2, 'null'::jsonb, true, 0)` - - _, err := db.Exec(context.Background(), query, index, creator[:]) - require.NoError(t, err) -} - -func insertApp(t *testing.T, db *pgxpool.Pool, index uint64, creator basics.Address, params *basics.AppParams) { - query := `INSERT INTO app (index, creator, params, deleted, created_at) - VALUES ($1, $2, $3, false, 0)` - - _, err := db.Exec( - context.Background(), query, index, creator[:], encoding.EncodeAppParams(*params)) - require.NoError(t, err) -} - -func TestLedgerForEvaluatorAppTable(t *testing.T) { - db, _, shutdownFunc := pgtest.SetupPostgresWithSchema(t) - defer shutdownFunc() - - params1 := basics.AppParams{ - GlobalState: map[string]basics.TealValue{ - string([]byte{0xff}): {}, // try a non-utf8 string - }, - } - insertApp(t, db, 1, test.AccountA, ¶ms1) - - params2 := basics.AppParams{ - ApprovalProgram: []byte{1, 2, 3, 10}, - } - insertApp(t, db, 2, test.AccountA, ¶ms2) - - insertDeletedApp(t, db, 3, test.AccountA) - - params4 := basics.AppParams{ - ApprovalProgram: []byte{1, 2, 3, 12}, - } - insertApp(t, db, 4, test.AccountB, ¶ms4) - - params5 := basics.AppParams{ - ApprovalProgram: []byte{1, 2, 3, 13}, - } - insertApp(t, db, 5, test.AccountC, ¶ms5) - - tx, err := db.BeginTx(context.Background(), readonlyRepeatableRead) - require.NoError(t, err) - defer tx.Rollback(context.Background()) - - l, err := ledger_for_evaluator.MakeLedgerForEvaluator(tx, basics.Round(0)) - require.NoError(t, err) - defer l.Close() - - ret, err := l.LookupResources(map[basics.Address]map[ledger.Creatable]struct{}{ - test.AccountA: { - {Index: 1, Type: basics.AppCreatable}: {}, - {Index: 2, Type: basics.AppCreatable}: {}, - {Index: 3, Type: basics.AppCreatable}: {}, - {Index: 4, Type: basics.AppCreatable}: {}, - {Index: 6, Type: basics.AppCreatable}: {}, - }, - test.AccountC: { - {Index: 5, Type: basics.AppCreatable}: {}, - }, - }) - require.NoError(t, err) - - expected := map[basics.Address]map[ledger.Creatable]ledgercore.AccountResource{ - test.AccountA: { - ledger.Creatable{Index: 1, Type: basics.AppCreatable}: { - AppParams: ¶ms1, - }, - ledger.Creatable{Index: 2, Type: basics.AppCreatable}: { - AppParams: ¶ms2, - }, - ledger.Creatable{Index: 3, Type: basics.AppCreatable}: {}, - ledger.Creatable{Index: 4, Type: basics.AppCreatable}: {}, - ledger.Creatable{Index: 6, Type: basics.AppCreatable}: {}, - }, - test.AccountC: { - ledger.Creatable{Index: 5, Type: basics.AppCreatable}: { - AppParams: ¶ms5, - }, - }, - } - assert.Equal(t, expected, ret) -} - -func insertDeletedAccountApp(t *testing.T, db *pgxpool.Pool, addr basics.Address, app uint64) { - query := `INSERT INTO account_app (addr, app, localstate, deleted, created_at) - VALUES ($1, $2, 'null'::jsonb, true, 0)` - - _, err := db.Exec( - context.Background(), query, addr[:], app) - require.NoError(t, err) -} - -func insertAccountApp(t *testing.T, db *pgxpool.Pool, addr basics.Address, app uint64, localstate *basics.AppLocalState) { - query := `INSERT INTO account_app (addr, app, localstate, deleted, created_at) - VALUES ($1, $2, $3, false, 0)` - - _, err := db.Exec( - context.Background(), query, addr[:], app, - encoding.EncodeAppLocalState(*localstate)) - require.NoError(t, err) -} - -func TestLedgerForEvaluatorAccountAppTable(t *testing.T) { - db, _, shutdownFunc := pgtest.SetupPostgresWithSchema(t) - defer shutdownFunc() - - stateA1 := basics.AppLocalState{ - KeyValue: map[string]basics.TealValue{ - string([]byte{0xff}): {}, // try a non-utf8 string - }, - } - insertAccountApp(t, db, test.AccountA, 1, &stateA1) - - stateA2 := basics.AppLocalState{ - KeyValue: map[string]basics.TealValue{ - "abc": {}, - }, - } - insertAccountApp(t, db, test.AccountA, 2, &stateA2) - - insertDeletedAccountApp(t, db, test.AccountA, 3) - - stateB3 := basics.AppLocalState{ - KeyValue: map[string]basics.TealValue{ - "abf": {}, - }, - } - insertAccountApp(t, db, test.AccountB, 3, &stateB3) - - tx, err := db.BeginTx(context.Background(), readonlyRepeatableRead) - require.NoError(t, err) - defer tx.Rollback(context.Background()) - - l, err := ledger_for_evaluator.MakeLedgerForEvaluator(tx, basics.Round(0)) - require.NoError(t, err) - defer l.Close() - - ret, err := l.LookupResources(map[basics.Address]map[ledger.Creatable]struct{}{ - test.AccountA: { - {Index: 1, Type: basics.AppCreatable}: {}, - {Index: 2, Type: basics.AppCreatable}: {}, - {Index: 3, Type: basics.AppCreatable}: {}, - {Index: 4, Type: basics.AppCreatable}: {}, - }, - test.AccountB: { - {Index: 3, Type: basics.AppCreatable}: {}, - }, - }) - require.NoError(t, err) - - expected := map[basics.Address]map[ledger.Creatable]ledgercore.AccountResource{ - test.AccountA: { - ledger.Creatable{Index: 1, Type: basics.AppCreatable}: { - AppLocalState: &stateA1, - }, - ledger.Creatable{Index: 2, Type: basics.AppCreatable}: { - AppLocalState: &stateA2, - }, - ledger.Creatable{Index: 3, Type: basics.AppCreatable}: {}, - ledger.Creatable{Index: 4, Type: basics.AppCreatable}: {}, - }, - test.AccountB: { - ledger.Creatable{Index: 3, Type: basics.AppCreatable}: { - AppLocalState: &stateB3, - }, - }, - } - assert.Equal(t, expected, ret) -} - -func TestLedgerForEvaluatorFetchAllResourceTypes(t *testing.T) { - db, _, shutdownFunc := pgtest.SetupPostgresWithSchema(t) - defer shutdownFunc() - - insertAccountAsset(t, db, test.AccountA, 1, 2, true) - insertAsset(t, db, 1, test.AccountA, &basics.AssetParams{Total: 3}) - insertAccountApp( - t, db, test.AccountA, 4, - &basics.AppLocalState{Schema: basics.StateSchema{NumUint: 5}}) - insertApp(t, db, 4, test.AccountA, &basics.AppParams{ExtraProgramPages: 6}) - - tx, err := db.BeginTx(context.Background(), readonlyRepeatableRead) - require.NoError(t, err) - defer tx.Rollback(context.Background()) - - l, err := ledger_for_evaluator.MakeLedgerForEvaluator(tx, basics.Round(0)) - require.NoError(t, err) - defer l.Close() - - ret, err := l.LookupResources(map[basics.Address]map[ledger.Creatable]struct{}{ - test.AccountA: { - {Index: 1, Type: basics.AssetCreatable}: {}, - {Index: 4, Type: basics.AppCreatable}: {}, - }, - }) - require.NoError(t, err) - - expected := map[basics.Address]map[ledger.Creatable]ledgercore.AccountResource{ - test.AccountA: { - ledger.Creatable{Index: 1, Type: basics.AssetCreatable}: { - AssetHolding: &basics.AssetHolding{ - Amount: 2, - Frozen: true, - }, - AssetParams: &basics.AssetParams{ - Total: 3, - }, - }, - ledger.Creatable{Index: 4, Type: basics.AppCreatable}: { - AppLocalState: &basics.AppLocalState{ - Schema: basics.StateSchema{ - NumUint: 5, - }, - }, - AppParams: &basics.AppParams{ - ExtraProgramPages: 6, - }, - }, - }, - } - assert.Equal(t, expected, ret) -} - -// Tests that queuing and reading from a batch is in the same order. -func TestLedgerForEvaluatorLookupMultipleAccounts(t *testing.T) { - db, _, shutdownFunc := pgtest.SetupPostgresWithSchema(t) - defer shutdownFunc() - - addAccountQuery := `INSERT INTO account - (addr, microalgos, rewardsbase, rewards_total, deleted, created_at, account_data) - VALUES ($1, 0, 0, 0, false, 0, 'null'::jsonb)` - - addresses := []basics.Address{ - test.AccountA, test.AccountB, test.AccountC, test.AccountD, test.AccountE} - - for _, address := range addresses { - _, err := db.Exec(context.Background(), addAccountQuery, address[:]) - require.NoError(t, err) - } - - tx, err := db.BeginTx(context.Background(), readonlyRepeatableRead) - require.NoError(t, err) - defer tx.Rollback(context.Background()) - - l, err := ledger_for_evaluator.MakeLedgerForEvaluator(tx, basics.Round(0)) - require.NoError(t, err) - defer l.Close() - - addressesMap := make(map[basics.Address]struct{}) - for _, address := range addresses { - addressesMap[address] = struct{}{} - } - addressesMap[test.FeeAddr] = struct{}{} - addressesMap[test.RewardAddr] = struct{}{} - - ret, err := l.LookupWithoutRewards(addressesMap) - require.NoError(t, err) - - for _, address := range addresses { - accountData, _ := ret[address] - require.NotNil(t, accountData) - } -} - -func TestLedgerForEvaluatorAssetCreatorBasic(t *testing.T) { - db, _, shutdownFunc := pgtest.SetupPostgresWithSchema(t) - defer shutdownFunc() - - query := - "INSERT INTO asset (index, creator_addr, params, deleted, created_at) " + - "VALUES (2, $1, '{}', false, 0)" - _, err := db.Exec(context.Background(), query, test.AccountA[:]) - require.NoError(t, err) - - tx, err := db.BeginTx(context.Background(), readonlyRepeatableRead) - require.NoError(t, err) - defer tx.Rollback(context.Background()) - - l, err := ledger_for_evaluator.MakeLedgerForEvaluator(tx, basics.Round(0)) - require.NoError(t, err) - defer l.Close() - - ret, err := l.GetAssetCreator( - map[basics.AssetIndex]struct{}{basics.AssetIndex(2): {}}) - require.NoError(t, err) - - foundAddress, ok := ret[basics.AssetIndex(2)] - require.True(t, ok) - - expected := ledger.FoundAddress{ - Address: test.AccountA, - Exists: true, - } - assert.Equal(t, expected, foundAddress) -} - -func TestLedgerForEvaluatorAssetCreatorDeleted(t *testing.T) { - db, _, shutdownFunc := pgtest.SetupPostgresWithSchema(t) - defer shutdownFunc() - - query := - "INSERT INTO asset (index, creator_addr, params, deleted, created_at) " + - "VALUES (2, $1, '{}', true, 0)" - _, err := db.Exec(context.Background(), query, test.AccountA[:]) - require.NoError(t, err) - - tx, err := db.BeginTx(context.Background(), readonlyRepeatableRead) - require.NoError(t, err) - defer tx.Rollback(context.Background()) - - l, err := ledger_for_evaluator.MakeLedgerForEvaluator(tx, basics.Round(0)) - require.NoError(t, err) - defer l.Close() - - ret, err := l.GetAssetCreator( - map[basics.AssetIndex]struct{}{basics.AssetIndex(2): {}}) - require.NoError(t, err) - - foundAddress, ok := ret[basics.AssetIndex(2)] - require.True(t, ok) - - assert.False(t, foundAddress.Exists) -} - -func TestLedgerForEvaluatorAssetCreatorMultiple(t *testing.T) { - db, _, shutdownFunc := pgtest.SetupPostgresWithSchema(t) - defer shutdownFunc() - - creatorsMap := map[basics.AssetIndex]basics.Address{ - 1: test.AccountA, - 2: test.AccountB, - 3: test.AccountC, - 4: test.AccountD, - 5: test.AccountE, - } - - query := - "INSERT INTO asset (index, creator_addr, params, deleted, created_at) " + - "VALUES ($1, $2, '{}', false, 0)" - for index, address := range creatorsMap { - _, err := db.Exec(context.Background(), query, index, address[:]) - require.NoError(t, err) - } - - tx, err := db.BeginTx(context.Background(), readonlyRepeatableRead) - require.NoError(t, err) - defer tx.Rollback(context.Background()) - - l, err := ledger_for_evaluator.MakeLedgerForEvaluator(tx, basics.Round(0)) - require.NoError(t, err) - defer l.Close() - - indices := map[basics.AssetIndex]struct{}{ - 1: {}, 2: {}, 3: {}, 4: {}, 5: {}, 6: {}, 7: {}, 8: {}} - ret, err := l.GetAssetCreator(indices) - require.NoError(t, err) - - assert.Equal(t, len(indices), len(ret)) - for i := 1; i <= 5; i++ { - index := basics.AssetIndex(i) - - foundAddress, ok := ret[index] - require.True(t, ok) - - expected := ledger.FoundAddress{ - Address: creatorsMap[index], - Exists: true, - } - assert.Equal(t, expected, foundAddress) - } - for i := 6; i <= 8; i++ { - index := basics.AssetIndex(i) - - foundAddress, ok := ret[index] - require.True(t, ok) - - assert.False(t, foundAddress.Exists) - } -} - -func TestLedgerForEvaluatorAppCreatorBasic(t *testing.T) { - db, _, shutdownFunc := pgtest.SetupPostgresWithSchema(t) - defer shutdownFunc() - - query := - "INSERT INTO app (index, creator, params, deleted, created_at) " + - "VALUES (2, $1, '{}', false, 0)" - _, err := db.Exec(context.Background(), query, test.AccountA[:]) - require.NoError(t, err) - - tx, err := db.BeginTx(context.Background(), readonlyRepeatableRead) - require.NoError(t, err) - defer tx.Rollback(context.Background()) - - l, err := ledger_for_evaluator.MakeLedgerForEvaluator(tx, basics.Round(0)) - require.NoError(t, err) - defer l.Close() - - ret, err := l.GetAppCreator( - map[basics.AppIndex]struct{}{basics.AppIndex(2): {}}) - require.NoError(t, err) - - foundAddress, ok := ret[basics.AppIndex(2)] - require.True(t, ok) - - expected := ledger.FoundAddress{ - Address: test.AccountA, - Exists: true, - } - assert.Equal(t, expected, foundAddress) -} - -func TestLedgerForEvaluatorAppCreatorDeleted(t *testing.T) { - db, _, shutdownFunc := pgtest.SetupPostgresWithSchema(t) - defer shutdownFunc() - - query := - "INSERT INTO app (index, creator, params, deleted, created_at) " + - "VALUES (2, $1, '{}', true, 0)" - _, err := db.Exec(context.Background(), query, test.AccountA[:]) - require.NoError(t, err) - - tx, err := db.BeginTx(context.Background(), readonlyRepeatableRead) - require.NoError(t, err) - defer tx.Rollback(context.Background()) - - l, err := ledger_for_evaluator.MakeLedgerForEvaluator(tx, basics.Round(0)) - require.NoError(t, err) - defer l.Close() - - ret, err := l.GetAppCreator( - map[basics.AppIndex]struct{}{basics.AppIndex(2): {}}) - require.NoError(t, err) - - foundAddress, ok := ret[basics.AppIndex(2)] - require.True(t, ok) - - assert.False(t, foundAddress.Exists) -} - -func TestLedgerForEvaluatorAppCreatorMultiple(t *testing.T) { - db, _, shutdownFunc := pgtest.SetupPostgresWithSchema(t) - defer shutdownFunc() - - creatorsMap := map[basics.AppIndex]basics.Address{ - 1: test.AccountA, - 2: test.AccountB, - 3: test.AccountC, - 4: test.AccountD, - 5: test.AccountE, - } - - query := - "INSERT INTO app (index, creator, params, deleted, created_at) " + - "VALUES ($1, $2, '{}', false, 0)" - for index, address := range creatorsMap { - _, err := db.Exec(context.Background(), query, index, address[:]) - require.NoError(t, err) - } - - tx, err := db.BeginTx(context.Background(), readonlyRepeatableRead) - require.NoError(t, err) - defer tx.Rollback(context.Background()) - - l, err := ledger_for_evaluator.MakeLedgerForEvaluator(tx, basics.Round(0)) - require.NoError(t, err) - defer l.Close() - - indices := map[basics.AppIndex]struct{}{ - 1: {}, 2: {}, 3: {}, 4: {}, 5: {}, 6: {}, 7: {}, 8: {}} - ret, err := l.GetAppCreator(indices) - require.NoError(t, err) - - assert.Equal(t, len(indices), len(ret)) - for i := 1; i <= 5; i++ { - index := basics.AppIndex(i) - - foundAddress, ok := ret[index] - require.True(t, ok) - - expected := ledger.FoundAddress{ - Address: creatorsMap[index], - Exists: true, - } - assert.Equal(t, expected, foundAddress) - } - for i := 6; i <= 8; i++ { - index := basics.AppIndex(i) - - foundAddress, ok := ret[index] - require.True(t, ok) - - assert.False(t, foundAddress.Exists) - } -} - -func TestLedgerForEvaluatorAccountTotals(t *testing.T) { - db, _, shutdownFunc := pgtest.SetupPostgresWithSchema(t) - defer shutdownFunc() - - accountTotals := ledgercore.AccountTotals{ - Online: ledgercore.AlgoCount{ - Money: basics.MicroAlgos{Raw: 33}, - }, - } - err := pgutil.SetMetastate( - db, nil, schema.AccountTotals, string(encoding.EncodeAccountTotals(&accountTotals))) - require.NoError(t, err) - - tx, err := db.BeginTx(context.Background(), readonlyRepeatableRead) - require.NoError(t, err) - defer tx.Rollback(context.Background()) - - l, err := ledger_for_evaluator.MakeLedgerForEvaluator(tx, basics.Round(0)) - require.NoError(t, err) - defer l.Close() - - accountTotalsRead, err := l.LatestTotals() - require.NoError(t, err) - - assert.Equal(t, accountTotals, accountTotalsRead) -} diff --git a/idb/postgres/postgres.go b/idb/postgres/postgres.go index 69c440d29..bb77594ac 100644 --- a/idb/postgres/postgres.go +++ b/idb/postgres/postgres.go @@ -9,7 +9,6 @@ import ( "database/sql" "errors" "fmt" - "math" "os" "strings" "sync" @@ -20,7 +19,6 @@ import ( "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/data/bookkeeping" "github.com/algorand/go-algorand/data/transactions" - "github.com/algorand/go-algorand/ledger" "github.com/algorand/go-algorand/ledger/ledgercore" "github.com/jackc/pgconn" @@ -29,12 +27,10 @@ import ( "github.com/jackc/pgx/v4/pgxpool" log "github.com/sirupsen/logrus" - "github.com/algorand/indexer/accounting" models "github.com/algorand/indexer/api/generated/v2" "github.com/algorand/indexer/idb" "github.com/algorand/indexer/idb/migration" "github.com/algorand/indexer/idb/postgres/internal/encoding" - ledger_for_evaluator "github.com/algorand/indexer/idb/postgres/internal/ledger_for_evaluator" "github.com/algorand/indexer/idb/postgres/internal/schema" "github.com/algorand/indexer/idb/postgres/internal/types" pgutil "github.com/algorand/indexer/idb/postgres/internal/util" @@ -178,98 +174,6 @@ func (db *IndexerDb) init(opts idb.IndexerDbOptions) (chan struct{}, error) { return db.runAvailableMigrations(opts) } -// Preload asset and app creators. -func prepareCreators(l *ledger_for_evaluator.LedgerForEvaluator, payset transactions.Payset) (map[basics.AssetIndex]ledger.FoundAddress, map[basics.AppIndex]ledger.FoundAddress, error) { - assetsReq, appsReq := accounting.MakePreloadCreatorsRequest(payset) - - for aidx := range assetsReq { - if aidx >= basics.AssetIndex(math.MaxInt64) { - delete(assetsReq, aidx) - } - } - - for aidx := range appsReq { - if aidx >= basics.AppIndex(math.MaxInt64) { - delete(appsReq, aidx) - } - } - - assets, err := l.GetAssetCreator(assetsReq) - if err != nil { - return nil, nil, fmt.Errorf("prepareCreators() err: %w", err) - } - apps, err := l.GetAppCreator(appsReq) - if err != nil { - return nil, nil, fmt.Errorf("prepareCreators() err: %w", err) - } - - return assets, apps, nil -} - -// Preload account data and account resources. -func prepareAccountsResources(l *ledger_for_evaluator.LedgerForEvaluator, payset transactions.Payset, assetCreators map[basics.AssetIndex]ledger.FoundAddress, appCreators map[basics.AppIndex]ledger.FoundAddress) (map[basics.Address]*ledgercore.AccountData, map[basics.Address]map[ledger.Creatable]ledgercore.AccountResource, error) { - addressesReq, resourcesReq := - accounting.MakePreloadAccountsResourcesRequest(payset, assetCreators, appCreators) - - for addr := range resourcesReq { - for cidx := range resourcesReq[addr] { - if cidx.Index >= basics.CreatableIndex(math.MaxInt64) { - delete(resourcesReq[addr], cidx) - } - } - } - - accounts, err := l.LookupWithoutRewards(addressesReq) - if err != nil { - return nil, nil, fmt.Errorf("prepareAccountsResources() err: %w", err) - } - resources, err := l.LookupResources(resourcesReq) - if err != nil { - return nil, nil, fmt.Errorf("prepareAccountsResources() err: %w", err) - } - - return accounts, resources, nil -} - -// Preload all resources (account data, account resources, asset/app creators) for the -// evaluator. -func prepareEvalResources(l *ledger_for_evaluator.LedgerForEvaluator, block *bookkeeping.Block) (ledger.EvalForIndexerResources, error) { - assetCreators, appCreators, err := prepareCreators(l, block.Payset) - if err != nil { - return ledger.EvalForIndexerResources{}, - fmt.Errorf("prepareEvalResources() err: %w", err) - } - - res := ledger.EvalForIndexerResources{ - Accounts: nil, - Resources: nil, - Creators: make(map[ledger.Creatable]ledger.FoundAddress), - } - - for index, foundAddress := range assetCreators { - creatable := ledger.Creatable{ - Index: basics.CreatableIndex(index), - Type: basics.AssetCreatable, - } - res.Creators[creatable] = foundAddress - } - for index, foundAddress := range appCreators { - creatable := ledger.Creatable{ - Index: basics.CreatableIndex(index), - Type: basics.AppCreatable, - } - res.Creators[creatable] = foundAddress - } - - res.Accounts, res.Resources, err = prepareAccountsResources(l, block.Payset, assetCreators, appCreators) - if err != nil { - return ledger.EvalForIndexerResources{}, - fmt.Errorf("prepareEvalResources() err: %w", err) - } - - return res, nil -} - // AddBlock is part of idb.IndexerDb. func (db *IndexerDb) AddBlock(vb *ledgercore.ValidatedBlock) error { block := vb.Block() @@ -2572,34 +2476,6 @@ func (db *IndexerDb) GetSpecialAccounts(ctx context.Context) (transactions.Speci return accounts, nil } -// GetAccountState returns account data and account resources for the given input. -// For accounts that are not found, empty AccountData is returned. -// This function is only used for debugging. -func (db *IndexerDb) GetAccountState(addressesReq map[basics.Address]struct{}, resourcesReq map[basics.Address]map[ledger.Creatable]struct{}) (map[basics.Address]*ledgercore.AccountData, map[basics.Address]map[ledger.Creatable]ledgercore.AccountResource, error) { - tx, err := db.db.BeginTx(context.Background(), readonlyRepeatableRead) - if err != nil { - return nil, nil, fmt.Errorf("GetAccountState() begin tx err: %w", err) - } - defer tx.Rollback(context.Background()) - - l, err := ledger_for_evaluator.MakeLedgerForEvaluator(tx, basics.Round(0)) - if err != nil { - return nil, nil, fmt.Errorf("GetAccountState() err: %w", err) - } - defer l.Close() - - accounts, err := l.LookupWithoutRewards(addressesReq) - if err != nil { - return nil, nil, fmt.Errorf("GetAccountState() err: %w", err) - } - resources, err := l.LookupResources(resourcesReq) - if err != nil { - return nil, nil, fmt.Errorf("GetAccountState() err: %w", err) - } - - return accounts, resources, nil -} - // GetNetworkState is part of idb.IndexerDB func (db *IndexerDb) GetNetworkState() (idb.NetworkState, error) { state, err := db.getNetworkState(context.Background(), nil) diff --git a/idb/postgres/postgres_rand_test.go b/idb/postgres/postgres_rand_test.go index af9ba4012..50f041d7d 100644 --- a/idb/postgres/postgres_rand_test.go +++ b/idb/postgres/postgres_rand_test.go @@ -2,25 +2,27 @@ package postgres import ( "context" + "encoding/base64" + "fmt" "math/rand" "testing" + "github.com/jackc/pgx/v4" + "github.com/stretchr/testify/require" + "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/data/bookkeeping" "github.com/algorand/go-algorand/data/transactions" - "github.com/algorand/go-algorand/ledger" "github.com/algorand/go-algorand/ledger/ledgercore" - ledgerforevaluator "github.com/algorand/indexer/idb/postgres/internal/ledger_for_evaluator" + + models "github.com/algorand/indexer/api/generated/v2" + "github.com/algorand/indexer/idb" "github.com/algorand/indexer/idb/postgres/internal/writer" "github.com/algorand/indexer/util/test" - "github.com/jackc/pgx/v4" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" ) func generateAddress(t *testing.T) basics.Address { var res basics.Address - _, err := rand.Read(res[:]) require.NoError(t, err) @@ -33,8 +35,6 @@ func generateAccountData() ledgercore.AccountData { return ledgercore.AccountData{} } - const numCreatables = 20 - res := ledgercore.AccountData{ AccountBaseData: ledgercore.AccountBaseData{ MicroAlgos: basics.MicroAlgos{Raw: uint64(rand.Int63())}, @@ -44,6 +44,20 @@ func generateAccountData() ledgercore.AccountData { return res } +func maybeGetAccount(t *testing.T, db *IndexerDb, address basics.Address) *models.Account { + resultCh, _ := db.GetAccounts(context.Background(), idb.AccountQueryOptions{EqualToAddress: address[:]}) + num := 0 + var result *models.Account + for row := range resultCh { + num++ + require.NoError(t, row.Error) + acct := row.Account + result = &acct + } + require.LessOrEqual(t, num, 1, "There should be at most one result for the address.") + return result +} + // Write random account data for many random accounts, then read it and compare. // Tests in particular that batch writing and reading is done in the same order // and that there are no problems around passing account address pointers to the postgres @@ -53,13 +67,14 @@ func TestWriteReadAccountData(t *testing.T) { defer shutdownFunc() defer ld.Close() - addresses := make(map[basics.Address]struct{}) + data := make(map[basics.Address]ledgercore.AccountData) var delta ledgercore.StateDelta for i := 0; i < 1000; i++ { address := generateAddress(t) - addresses[address] = struct{}{} - delta.Accts.Upsert(address, generateAccountData()) + acctData := generateAccountData() + data[address] = acctData + delta.Accts.Upsert(address, acctData) } f := func(tx pgx.Tx) error { @@ -79,24 +94,13 @@ func TestWriteReadAccountData(t *testing.T) { require.NoError(t, err) defer tx.Rollback(context.Background()) - l, err := ledgerforevaluator.MakeLedgerForEvaluator(tx, basics.Round(0)) - require.NoError(t, err) - defer l.Close() - - ret, err := l.LookupWithoutRewards(addresses) - require.NoError(t, err) - - for address := range addresses { - expected, ok := delta.Accts.GetData(address) - require.True(t, ok) + for address, expected := range data { + account := maybeGetAccount(t, db, address) - ret, ok := ret[address] - require.True(t, ok) - - if ret == nil { - require.True(t, expected.IsZero()) + if expected.IsZero() { + require.Nil(t, account) } else { - require.Equal(t, &expected, ret) + require.Equal(t, expected.AccountBaseData.MicroAlgos.Raw, account.Amount) } } } @@ -218,36 +222,39 @@ func TestWriteReadResources(t *testing.T) { defer shutdownFunc() defer ld.Close() - resources := make(map[basics.Address]map[ledger.Creatable]struct{}) + type datum struct { + assetIndex basics.AssetIndex + assetParams ledgercore.AssetParamsDelta + holding ledgercore.AssetHoldingDelta + appIndex basics.AppIndex + appParams ledgercore.AppParamsDelta + localState ledgercore.AppLocalStateDelta + } + + data := make(map[basics.Address]datum) var delta ledgercore.StateDelta for i := 0; i < 1000; i++ { address := generateAddress(t) + assetIndex := basics.AssetIndex(rand.Int63()) - appIndex := basics.AppIndex(rand.Int63()) + assetParams := generateAssetParamsDelta() + holding := generateAssetHoldingDelta() - { - c := make(map[ledger.Creatable]struct{}) - resources[address] = c - - creatable := ledger.Creatable{ - Index: basics.CreatableIndex(assetIndex), - Type: basics.AssetCreatable, - } - c[creatable] = struct{}{} - - creatable = ledger.Creatable{ - Index: basics.CreatableIndex(appIndex), - Type: basics.AppCreatable, - } - c[creatable] = struct{}{} + appIndex := basics.AppIndex(rand.Int63()) + appParamsDelta := generateAppParamsDelta(t) + localState := generateAppLocalStateDelta(t) + + data[address] = datum{ + assetIndex: assetIndex, + assetParams: assetParams, + holding: holding, + appIndex: appIndex, + appParams: appParamsDelta, + localState: localState, } - delta.Accts.UpsertAssetResource( - address, assetIndex, generateAssetParamsDelta(), - generateAssetHoldingDelta()) - delta.Accts.UpsertAppResource( - address, appIndex, generateAppParamsDelta(t), - generateAppLocalStateDelta(t)) + delta.Accts.UpsertAssetResource(address, assetIndex, assetParams, holding) + delta.Accts.UpsertAppResource(address, appIndex, appParamsDelta, localState) } f := func(tx pgx.Tx) error { @@ -267,39 +274,19 @@ func TestWriteReadResources(t *testing.T) { require.NoError(t, err) defer tx.Rollback(context.Background()) - l, err := ledgerforevaluator.MakeLedgerForEvaluator(tx, basics.Round(0)) - require.NoError(t, err) - defer l.Close() + for address, datum := range data { + fmt.Println(base64.StdEncoding.EncodeToString(address[:])) - ret, err := l.LookupResources(resources) - require.NoError(t, err) + // asset info + assetParams, _ := delta.Accts.GetAssetParams(address, datum.assetIndex) + require.Equal(t, datum.assetParams, assetParams) + holding, _ := delta.Accts.GetAssetHolding(address, datum.assetIndex) + require.Equal(t, datum.holding, holding) - for address, creatables := range resources { - ret, ok := ret[address] - require.True(t, ok) - - for creatable := range creatables { - ret, ok := ret[creatable] - require.True(t, ok) - - switch creatable.Type { - case basics.AssetCreatable: - assetParamsDelta, _ := - delta.Accts.GetAssetParams(address, basics.AssetIndex(creatable.Index)) - assert.Equal(t, assetParamsDelta.Params, ret.AssetParams) - - assetHoldingDelta, _ := - delta.Accts.GetAssetHolding(address, basics.AssetIndex(creatable.Index)) - assert.Equal(t, assetHoldingDelta.Holding, ret.AssetHolding) - case basics.AppCreatable: - appParamsDelta, _ := - delta.Accts.GetAppParams(address, basics.AppIndex(creatable.Index)) - assert.Equal(t, appParamsDelta.Params, ret.AppParams) - - appLocalStateDelta, _ := - delta.Accts.GetAppLocalState(address, basics.AppIndex(creatable.Index)) - assert.Equal(t, appLocalStateDelta.LocalState, ret.AppLocalState) - } - } + // app info + appParams, _ := delta.Accts.GetAppParams(address, datum.appIndex) + require.Equal(t, datum.appParams, appParams) + localState, _ := delta.Accts.GetAppLocalState(address, datum.appIndex) + require.Equal(t, datum.localState, localState) } } From 63a6c2b313f0c9a2cc5b06b6b2a6c97aa3ab63d4 Mon Sep 17 00:00:00 2001 From: Eric Warehime Date: Wed, 27 Jul 2022 16:06:46 -0700 Subject: [PATCH 12/39] Docs: Readme update (#1149) * Update README header --- README.md | 14 ++++++++++++-- docs/assets/algorand_logo_mark_black.svg | 1 + docs/assets/algorand_logo_mark_white.svg | 1 + 3 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 docs/assets/algorand_logo_mark_black.svg create mode 100644 docs/assets/algorand_logo_mark_white.svg diff --git a/README.md b/README.md index dd09bd328..30d7d3575 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,15 @@ -| master
[![CircleCI](https://circleci.com/gh/algorand/indexer/tree/master.svg?style=svg)](https://circleci.com/gh/algorand/indexer/tree/master) | develop
[![CircleCI](https://circleci.com/gh/algorand/indexer/tree/develop.svg?style=svg)](https://circleci.com/gh/algorand/indexer/tree/develop) | -| --- | --- | +
+ + Algorand + + + + +[![CircleCI](https://img.shields.io/circleci/build/github/algorand/indexer/develop?label=develop)](https://circleci.com/gh/algorand/indexer/tree/develop) +[![CircleCI](https://img.shields.io/circleci/build/github/algorand/indexer/master?label=master)](https://circleci.com/gh/algorand/indexer/tree/master) +![Github](https://img.shields.io/github/license/algorand/indexer) +[![Contribute](https://img.shields.io/badge/contributor-guide-blue?logo=github)](https://github.com/algorand/go-algorand/blob/master/CONTRIBUTING.md) +
# Algorand Indexer diff --git a/docs/assets/algorand_logo_mark_black.svg b/docs/assets/algorand_logo_mark_black.svg new file mode 100644 index 000000000..382aae997 --- /dev/null +++ b/docs/assets/algorand_logo_mark_black.svg @@ -0,0 +1 @@ +ALGO_Logos_190320 \ No newline at end of file diff --git a/docs/assets/algorand_logo_mark_white.svg b/docs/assets/algorand_logo_mark_white.svg new file mode 100644 index 000000000..8c7a3667b --- /dev/null +++ b/docs/assets/algorand_logo_mark_white.svg @@ -0,0 +1 @@ +ALGO_Logos_190320 \ No newline at end of file From 69f707d8cf7513f1eaa092807388eab7b7fcb183 Mon Sep 17 00:00:00 2001 From: Will Winder Date: Fri, 29 Jul 2022 14:20:55 -0400 Subject: [PATCH 13/39] Testing: Use tempdir instead of /tmp for e2elive test (#1152) --- misc/e2elive.py | 2 +- misc/util.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/misc/e2elive.py b/misc/e2elive.py index 7197a247b..cbeaecf28 100644 --- a/misc/e2elive.py +++ b/misc/e2elive.py @@ -89,7 +89,7 @@ def main(): psqlstring = ensure_test_db(args.connection_string, args.keep_temps) algoddir = os.path.join(tempnet, 'Primary') aiport = args.indexer_port or random.randint(4000,30000) - cmd = [indexer_bin, 'daemon', '--data-dir', '/tmp', '-P', psqlstring, '--dev-mode', '--algod', algoddir, '--server', ':{}'.format(aiport)] + cmd = [indexer_bin, 'daemon', '--data-dir', tempdir, '-P', psqlstring, '--dev-mode', '--algod', algoddir, '--server', ':{}'.format(aiport)] logger.debug("%s", ' '.join(map(repr,cmd))) indexerdp = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) indexerout = subslurp(indexerdp.stdout) diff --git a/misc/util.py b/misc/util.py index 27be070f8..e2fc503d8 100644 --- a/misc/util.py +++ b/misc/util.py @@ -145,7 +145,7 @@ def ensure_test_db(connection_string, keep_temps=False): # whoever calls this will need to import boto and get the s3 client def firstFromS3Prefix(s3, bucket, prefix, desired_filename, outdir=None, outpath=None): - response = s3.list_objects_v2(Bucket=bucket, Prefix=prefix, MaxKeys=10) + response = s3.list_objects_v2(Bucket=bucket, Prefix=prefix, MaxKeys=50) if (not response.get('KeyCount')) or ('Contents' not in response): raise Exception('nothing found in s3://{}/{}'.format(bucket, prefix)) for x in response['Contents']: @@ -159,3 +159,4 @@ def firstFromS3Prefix(s3, bucket, prefix, desired_filename, outdir=None, outpath logger.info('s3://%s/%s -> %s', bucket, x['Key'], outpath) s3.download_file(bucket, x['Key'], outpath) return + logger.warning('file not found in s3://{}/{}'.format(bucket, prefix)) From 1766a0d2e0e464856983bad2484bdb371a371627 Mon Sep 17 00:00:00 2001 From: Zeph Grunschlag Date: Fri, 29 Jul 2022 14:39:54 -0400 Subject: [PATCH 14/39] Format misc/*.py with `black` (#1153) --- misc/blockarchiver.py | 263 ++++++++++------- misc/liveindextest.py | 177 ++++++++---- misc/release.py | 234 +++++++++------ misc/speedtest.py | 176 ++++++++---- misc/util.py | 95 ++++--- misc/validate_accounting.py | 547 +++++++++++++++++++++++------------- 6 files changed, 953 insertions(+), 539 deletions(-) diff --git a/misc/blockarchiver.py b/misc/blockarchiver.py index e62893dbf..d8f4627df 100755 --- a/misc/blockarchiver.py +++ b/misc/blockarchiver.py @@ -27,17 +27,18 @@ # b=algod.block_info(algod.status()['lastRound']) # print(json.dumps(b, indent=2)) def token_addr_from_algod(algorand_data): - addr = open(os.path.join(algorand_data, 'algod.net'), 'rt').read().strip() - if not addr.startswith('http'): - addr = 'http://' + addr - token = open(os.path.join(algorand_data, 'algod.token'), 'rt').read().strip() + addr = open(os.path.join(algorand_data, "algod.net"), "rt").read().strip() + if not addr.startswith("http"): + addr = "http://" + addr + token = open(os.path.join(algorand_data, "algod.token"), "rt").read().strip() return token, addr + # b = nextblock(algod, b['round']) def nextblock(algod, lastround=None): if lastround is None: - lastround = algod.status()['lastRound'] - logger.debug('nextblock status lastRound %s', lastround) + lastround = algod.status()["lastRound"] + logger.debug("nextblock status lastRound %s", lastround) else: try: b = algod.block_info(lastround + 1) @@ -45,22 +46,33 @@ def nextblock(algod, lastround=None): except: pass status = algod.status_after_block(lastround) - nbr = status['lastRound'] + nbr = status["lastRound"] b = algod.block_info(nbr) return b def make_ob_json_polite(ob): if isinstance(ob, dict): - return {k:make_ob_json_polite(v) for k,v in ob.items()} + return {k: make_ob_json_polite(v) for k, v in ob.items()} if isinstance(ob, list): return [make_ob_json_polite(x) for x in ob] if isinstance(ob, bytes): return base64.b64encode(ob).decode() return ob + class Algobot: - def __init__(self, algorand_data=None, token=None, addr=None, headers=None, block_handlers=None, txn_handlers=None, progress_log_path=None, raw_api=None): + def __init__( + self, + algorand_data=None, + token=None, + addr=None, + headers=None, + block_handlers=None, + txn_handlers=None, + progress_log_path=None, + raw_api=None, + ): self.algorand_data = algorand_data self.token = token self.addr = addr @@ -91,19 +103,21 @@ def rawblock(self, xround): "if possible fetches and returns raw block msgpack including block and cert; otherwise None" algod = self.algod() if self.algod_has_block_raw or (self.algod_has_block_raw is None): - response = algod.algod_request("GET", "/block/" + str(xround), params={'raw':1}, raw_response=True) - contentType = response.getheader('Content-Type') - if contentType == 'application/json': - logger.debug('got json response, disabling rawblock') + response = algod.algod_request( + "GET", "/block/" + str(xround), params={"raw": 1}, raw_response=True + ) + contentType = response.getheader("Content-Type") + if contentType == "application/json": + logger.debug("got json response, disabling rawblock") self.algod_has_block_raw = False return None - if contentType == 'application/x-algorand-block-v1': + if contentType == "application/x-algorand-block-v1": self.algod_has_block_raw = True raw = response.read() block = unmsgpack(mloads(raw)) return block - raise Exception('unknown response content type {!r}'.format(contentType)) - logger.debug('rawblock passing out') + raise Exception("unknown response content type {!r}".format(contentType)) + logger.debug("rawblock passing out") return None def eitherblock(self, xround): @@ -118,19 +132,19 @@ def eitherblock(self, xround): def nextblock_from_files(self): if not self.blockfiles: - logger.debug('empty blockfiles') + logger.debug("empty blockfiles") self.go = False - return {'block':{'rnd':None}} - #raise Exception("end of blockfiles") + return {"block": {"rnd": None}} + # raise Exception("end of blockfiles") bf = self.blockfiles[0] - logger.debug('block from file %s', bf) + logger.debug("block from file %s", bf) self.blockfiles = self.blockfiles[1:] - with open(bf, 'rb') as fin: + with open(bf, "rb") as fin: raw = fin.read() try: return unmsgpack(mloads(raw)) except Exception as e: - logger.debug('%s: failed to msgpack decode, %s', bf, e) + logger.debug("%s: failed to msgpack decode, %s", bf, e) return json.loads(raw.decode()) def nextblock(self, lastround=None, retries=3): @@ -142,10 +156,10 @@ def nextblock(self, lastround=None, retries=3): return self._nextblock_inner(lastround) except Exception as e: if trycount >= retries: - logger.error('too many errors in nextblock retries') + logger.error("too many errors in nextblock retries") raise else: - logger.warn('error in nextblock(%r) (retrying): %s', lastround, e) + logger.warn("error in nextblock(%r) (retrying): %s", lastround, e) return None def _nextblock_inner(self, lastround): @@ -154,15 +168,15 @@ def _nextblock_inner(self, lastround): algod = self.algod() # TODO: algod block raw if lastround is None: - lastround = algod.status()['lastRound'] - logger.debug('nextblock status lastRound %s', lastround) + lastround = algod.status()["lastRound"] + logger.debug("nextblock status lastRound %s", lastround) else: try: return self.eitherblock(lastround + 1) except: pass status = algod.status_after_block(lastround) - nbr = status['lastRound'] + nbr = status["lastRound"] while (nbr > lastround + 1) and self.go: # try lastround+1 one last time try: @@ -187,17 +201,17 @@ def _loop_inner(self, lastround): return nowround = blockround(b) if (lastround is not None) and (nowround != lastround + 1): - logger.info('round jump %d to %d', lastround, nowround) + logger.info("round jump %d to %d", lastround, nowround) for bh in self.block_handlers: bh(self, b) - bb = b.get('block') + bb = b.get("block") if bb: # raw block case - transactions = bb.get('txns', []) + transactions = bb.get("txns", []) else: # json block_info case - txns = b.get('txns', {}) - transactions = txns.get('transactions', []) + txns = b.get("txns", {}) + transactions = txns.get("transactions", []) for txn in transactions: for th in self.txn_handlers: th(self, b, txn) @@ -209,11 +223,15 @@ def record_block_progress(self, round_number): if self._progresslog is not None: self._progresslog.close() self._progresslog = None - nextpath = self.progress_log_path + '_next_' + time.strftime('%Y%m%d_%H%M%S', time.gmtime()) - nextlog = open(nextpath, 'xt') - nextlog.write('{}\n'.format(round_number)) + nextpath = ( + self.progress_log_path + + "_next_" + + time.strftime("%Y%m%d_%H%M%S", time.gmtime()) + ) + nextlog = open(nextpath, "xt") + nextlog.write("{}\n".format(round_number)) nextlog.flush() - nextlog.close() # could probably leave this open and keep writing to it + nextlog.close() # could probably leave this open and keep writing to it os.replace(nextpath, self.progress_log_path) self._progresslog_write_count = 0 # new log at standard location will be opened next time @@ -221,9 +239,9 @@ def record_block_progress(self, round_number): if self._progresslog is None: if self.progress_log_path is None: return - self._progresslog = open(self.progress_log_path, 'at') + self._progresslog = open(self.progress_log_path, "at") self._progresslog_write_count = 0 - self._progresslog.write('{}\n'.format(round_number)) + self._progresslog.write("{}\n".format(round_number)) self._progresslog.flush() self._progresslog_write_count += 1 @@ -231,7 +249,7 @@ def recover_progress(self): if self.progress_log_path is None: return None try: - with open(self.progress_log_path, 'rt') as fin: + with open(self.progress_log_path, "rt") as fin: fin.seek(0, 2) endpos = fin.tell() fin.seek(max(0, endpos - 100)) @@ -239,7 +257,7 @@ def recover_progress(self): lines = raw.splitlines() return int(lines[-1]) except Exception as e: - logger.info('could not recover progress: %s', e) + logger.info("could not recover progress: %s", e) return None def close(self): @@ -247,10 +265,20 @@ def close(self): self._progresslog.close() self._progresslog = None -blocktarParseRe = re.compile(r'(\d+)_(\d+).tar.bz2') + +blocktarParseRe = re.compile(r"(\d+)_(\d+).tar.bz2") + class BlockArchiver: - def __init__(self, algorand_data=None, token=None, addr=None, headers=None, blockdir=None, tardir=None): + def __init__( + self, + algorand_data=None, + token=None, + addr=None, + headers=None, + blockdir=None, + tardir=None, + ): self.algorand_data = algorand_data self.token = token self.addr = addr @@ -259,7 +287,7 @@ def __init__(self, algorand_data=None, token=None, addr=None, headers=None, bloc self.tardir = tardir self.storedBlocks = set() - self.lastBlockOkTime = time.time() # pretend things are okay when we start + self.lastBlockOkTime = time.time() # pretend things are okay when we start self.go = True self._algod = None return @@ -283,7 +311,9 @@ def lastroundFromBlockdir(self): if maxround is None or fround > maxround: maxround = fround except: - logger.warning('junk in blockdir: %r', os.path.join(self.blockdir, fname)) + logger.warning( + "junk in blockdir: %r", os.path.join(self.blockdir, fname) + ) return maxround def lastroundFromTardir(self): @@ -296,16 +326,18 @@ def lastroundFromTardir(self): if maxround is None or endblock > maxround: maxround = endblock except: - logger.warning('junk in tardir: %r', os.path.join(self.tardir, fname)) + logger.warning("junk in tardir: %r", os.path.join(self.tardir, fname)) return maxround def rawblock(self, xround): algod = self.algod() - logger.debug('get %d', xround) + logger.debug("get %d", xround) try: - response = algod.algod_request("GET", "/block/" + str(xround), params={'raw':1}, raw_response=True) - contentType = response.getheader('Content-Type') - if contentType == 'application/x-algorand-block-v1': + response = algod.algod_request( + "GET", "/block/" + str(xround), params={"raw": 1}, raw_response=True + ) + contentType = response.getheader("Content-Type") + if contentType == "application/x-algorand-block-v1": raw = response.read() return raw return None @@ -316,22 +348,26 @@ def rawblock(self, xround): def fetchAndStoreBlock(self, xround): raw = self.rawblock(xround) if raw is None: - raise Exception('could not get block {}'.format(xround)) + raise Exception("could not get block {}".format(xround)) # trivial check bl = mloads(raw) if xround == 0: - blockround = bl[b'block'].get(b'rnd', 0) + blockround = bl[b"block"].get(b"rnd", 0) else: - blockround = bl[b'block'][b'rnd'] + blockround = bl[b"block"][b"rnd"] if blockround != xround: - raise Exception('fetching round {} retrieved block for round {}'.format(xround, bl[b'block'][b'rnd'])) + raise Exception( + "fetching round {} retrieved block for round {}".format( + xround, bl[b"block"][b"rnd"] + ) + ) blockpath = os.path.join(self.blockdir, str(xround)) - with open(blockpath, 'wb') as fout: + with open(blockpath, "wb") as fout: fout.write(raw) if xround % 100 == 0: - logger.info('got block %s', blockpath) + logger.info("got block %s", blockpath) else: - logger.debug('got block %s', blockpath) + logger.debug("got block %s", blockpath) self.storedBlocks.add(xround) self.lastBlockOkTime = time.time() @@ -341,10 +377,10 @@ def maybeTarBlocks(self): xm = minround - (minround % 1000) if xm < minround: xm += 1000 - if xm+1000 > maxround: + if xm + 1000 > maxround: # not enough blocks return - for r in range(xm, xm+1000): + for r in range(xm, xm + 1000): if r not in self.storedBlocks: self.fetchAndStoreBlock(r) # okay, we have them all @@ -353,17 +389,20 @@ def maybeTarBlocks(self): for x in list(self.storedBlocks): if x < xm: self.storedBlocks.discard(x) - logger.warning('stale block in blockdir: %r', os.path.join(self.blockdir, str(x))) - tarname = '{}_{}.tar.bz2'.format(xm, xm+1000-1) + logger.warning( + "stale block in blockdir: %r", + os.path.join(self.blockdir, str(x)), + ) + tarname = "{}_{}.tar.bz2".format(xm, xm + 1000 - 1) outpath = os.path.join(self.tardir, tarname) - tf = tarfile.open(outpath, 'w:bz2') - for r in range(xm, xm+1000): + tf = tarfile.open(outpath, "w:bz2") + for r in range(xm, xm + 1000): bs = str(r) tf.add(os.path.join(self.blockdir, bs), arcname=bs) tf.close() - logger.info('%s', tarname) + logger.info("%s", tarname) # tar made, cleanup block files - for r in range(xm, xm+1000): + for r in range(xm, xm + 1000): bs = str(r) os.remove(os.path.join(self.blockdir, bs)) self.storedBlocks.discard(r) @@ -379,7 +418,7 @@ def _fetchloop(self, lastround): some = True except Exception as e: if not some: - logger.warning('err in fetch (%d), %s', lastround + 1, e) + logger.warning("err in fetch (%d), %s", lastround + 1, e) break lastround += 1 return lastround @@ -387,11 +426,11 @@ def _fetchloop(self, lastround): def run(self): lastround = self.lastroundFromBlockdir() if lastround is not None: - logger.debug('lastround from blockdir %d', lastround) + logger.debug("lastround from blockdir %d", lastround) if lastround is None: lastround = self.lastroundFromTardir() if lastround is not None: - logger.debug('lastround from tardir %d', lastround) + logger.debug("lastround from tardir %d", lastround) algod = self.algod() if lastround is None: lastround = 0 @@ -402,96 +441,109 @@ def run(self): try: algod = self.algod() status = algod.status_after_block(lastround) - logger.debug('status %r', status) + logger.debug("status %r", status) lastround = self._fetchloop(lastround) except Exception as e: - logger.warning('err in run, %s', e) + logger.warning("err in run, %s", e) # reset the connection self._algod = None now = time.time() dt = now - self.lastBlockOkTime if dt > 30: if (lastlog is None) or ((now - lastlog) > 30): - logger.warning('no block for %.1fs',dt) + logger.warning("no block for %.1fs", dt) lastlog = now time.sleep(1) def blockround(b): - bb = b.get('block') + bb = b.get("block") if bb: # raw mode - return bb.get('rnd') + return bb.get("rnd") else: # block_info json mode - return b.get('round') + return b.get("round") + # block_printer is an example block handler; it takes two args, the bot and the block def block_printer(bot, b): - txns = b.get('txns') + txns = b.get("txns") if txns: print(json.dumps(b, indent=2)) else: - bround = b.get('round') + bround = b.get("round") if bround % 10 == 0: print(bround) + # block_counter is an example block handler; it takes two args, the bot and the block def block_counter(bot, b): bround = blockround(b) if bround % 10 == 0: print(bround) + # big_tx_printer is an example txn handler; it takes three args, the bot the block and the transaction def big_tx_printer(bot, b, tx): - txn = tx.get('txn') + txn = tx.get("txn") if txn: # raw style - amount = txn.get('amt') + amount = txn.get("amt") if amount is not None and amount > 10000000: print(json.dumps(make_ob_json_polite(tx), indent=2)) return # block_info style - payment = tx.get('payment') + payment = tx.get("payment") if not payment: return - amount = payment.get('amount') + amount = payment.get("amount") if amount > 10000000: print(json.dumps(tx, indent=2)) + def make_arg_parser(): ap = argparse.ArgumentParser() - ap.add_argument('-d', '--algod', default=None, help='algod data dir') - ap.add_argument('-a', '--addr', default=None, help='algod host:port address') - ap.add_argument('-t', '--token', default=None, help='algod API access token') - ap.add_argument('--header', dest='headers', nargs='*', help='"Name: value" HTTP header (repeatable)') - ap.add_argument('--verbose', default=False, action='store_true') - #ap.add_argument('--progress-file', default=None, help='file to write progress to') - #ap.add_argument('--blockfile-glob', default=None, help='file glob of block files') - #ap.add_argument('--raw-api', default=False, action='store_true', help='use raw msgpack api with more data but different layout than json block_info api') - ap.add_argument('--blockdir') - ap.add_argument('--tardir') + ap.add_argument("-d", "--algod", default=None, help="algod data dir") + ap.add_argument("-a", "--addr", default=None, help="algod host:port address") + ap.add_argument("-t", "--token", default=None, help="algod API access token") + ap.add_argument( + "--header", + dest="headers", + nargs="*", + help='"Name: value" HTTP header (repeatable)', + ) + ap.add_argument("--verbose", default=False, action="store_true") + # ap.add_argument('--progress-file', default=None, help='file to write progress to') + # ap.add_argument('--blockfile-glob', default=None, help='file glob of block files') + # ap.add_argument('--raw-api', default=False, action='store_true', help='use raw msgpack api with more data but different layout than json block_info api') + ap.add_argument("--blockdir") + ap.add_argument("--tardir") return ap + def header_list_to_dict(hlist): if not hlist: return None - p = re.compile(r':\s+') + p = re.compile(r":\s+") out = {} for x in hlist: a, b = p.split(x, 1) out[a] = b return out + def setup(args): if args.verbose: logging.basicConfig(level=logging.DEBUG) else: logging.basicConfig(level=logging.INFO) - algorand_data = args.algod or os.getenv('ALGORAND_DATA') + algorand_data = args.algod or os.getenv("ALGORAND_DATA") if not algorand_data and not (args.token and args.addr): - sys.stderr.write('must specify algod data dir by $ALGORAND_DATA or -d/--algod; OR --a/--addr and -t/--token\n') + sys.stderr.write( + "must specify algod data dir by $ALGORAND_DATA or -d/--algod; OR --a/--addr and -t/--token\n" + ) sys.exit(1) bot = BlockArchiver( @@ -503,47 +555,55 @@ def setup(args): tardir=args.tardir, ) - #if args.blockfile_glob: + # if args.blockfile_glob: # bot.blockfiles = glob.glob(args.blockfile_glob) killcount = [0] + def gogently(signum, stackframe): count = killcount[0] + 1 if count == 1: - sys.stderr.write('signal received. starting graceful shutdown\n') + sys.stderr.write("signal received. starting graceful shutdown\n") bot.go = False killcount[0] = count return - sys.stderr.write('second signal received. bye\n') + sys.stderr.write("second signal received. bye\n") sys.exit(1) signal.signal(signal.SIGTERM, gogently) signal.signal(signal.SIGINT, gogently) return bot + def tar_whatever_blocks(args): # whatever blocks there are in --blockdir, tar them into a file in --tardir blocknames = os.listdir(args.blockdir) if not blocknames: - logger.debug('no blocks. done.') + logger.debug("no blocks. done.") return blocknumbers = [int(x) for x in blocknames] minblock = min(blocknumbers) maxblock = max(blocknumbers) - tarname = '{}_{}.tar.bz2'.format(minblock, maxblock) + tarname = "{}_{}.tar.bz2".format(minblock, maxblock) outpath = os.path.join(args.tardir, tarname) - tf = tarfile.open(outpath, 'w:bz2') + tf = tarfile.open(outpath, "w:bz2") for bs in blocknames: tf.add(os.path.join(args.blockdir, bs), arcname=bs) tf.close() - logger.info('%s', tarname) + logger.info("%s", tarname) # cleanup for bs in blocknames: os.remove(os.path.join(args.blockdir, bs)) + def main(arghook=None): ap = make_arg_parser() - ap.add_argument('--just-tar-blocks', default=False, action='store_true', help='tar all blocks in --blockdir into a file in --tardir') + ap.add_argument( + "--just-tar-blocks", + default=False, + action="store_true", + help="tar all blocks in --blockdir into a file in --tardir", + ) args = ap.parse_args() if args.just_tar_blocks: @@ -557,5 +617,6 @@ def main(arghook=None): bot.run() return -if __name__ == '__main__': + +if __name__ == "__main__": main() diff --git a/misc/liveindextest.py b/misc/liveindextest.py index 12158531c..43bb09441 100644 --- a/misc/liveindextest.py +++ b/misc/liveindextest.py @@ -38,46 +38,53 @@ logger = logging.getLogger(__name__) + def find_go_algorand(): - gopath = os.getenv('GOPATH') - for path in gopath.split(':'): - goa = os.path.join(path, 'src', 'github.com', 'algorand', 'go-algorand') + gopath = os.getenv("GOPATH") + for path in gopath.split(":"): + goa = os.path.join(path, "src", "github.com", "algorand", "go-algorand") if os.path.isdir(goa): return goa return None + already_stopped = False already_deleted = False + + def goal_network_stop(netdir, normal_cleanup=False): global already_stopped, already_deleted if already_stopped or already_deleted: return - logger.info('stop network in %s', netdir) + logger.info("stop network in %s", netdir) try: - xrun(['goal', 'network', 'stop', '-r', netdir], timeout=10) + xrun(["goal", "network", "stop", "-r", netdir], timeout=10) except Exception as e: - logger.error('error stopping network', exc_info=True) + logger.error("error stopping network", exc_info=True) if normal_cleanup: raise e already_stopped = True + def openkmd(algodata): - kmdnetpath = sorted(glob.glob(os.path.join(algodata,'kmd-*','kmd.net')))[-1] - kmdnet = open(kmdnetpath, 'rt').read().strip() - kmdtokenpath = sorted(glob.glob(os.path.join(algodata,'kmd-*','kmd.token')))[-1] - kmdtoken = open(kmdtokenpath, 'rt').read().strip() - kmd = algosdk.kmd.KMDClient(kmdtoken, 'http://' + kmdnet) + kmdnetpath = sorted(glob.glob(os.path.join(algodata, "kmd-*", "kmd.net")))[-1] + kmdnet = open(kmdnetpath, "rt").read().strip() + kmdtokenpath = sorted(glob.glob(os.path.join(algodata, "kmd-*", "kmd.token")))[-1] + kmdtoken = open(kmdtokenpath, "rt").read().strip() + kmd = algosdk.kmd.KMDClient(kmdtoken, "http://" + kmdnet) return kmd + def openalgod(algodata): - algodnetpath = os.path.join(algodata,'algod.net') - algodnet = open(algodnetpath, 'rt').read().strip() - algodtokenpath = os.path.join(algodata,'algod.token') - algodtoken = open(algodtokenpath, 'rt').read().strip() - algod = algosdk.algod.AlgodClient(algodtoken, 'http://' + algodnet) + algodnetpath = os.path.join(algodata, "algod.net") + algodnet = open(algodnetpath, "rt").read().strip() + algodtokenpath = os.path.join(algodata, "algod.token") + algodtoken = open(algodtokenpath, "rt").read().strip() + algod = algosdk.algod.AlgodClient(algodtoken, "http://" + algodnet) return algod + class RunContext: def __init__(self, env): self.env = env @@ -96,8 +103,8 @@ def _connect(self): if self.algod and self.kmd: return # should run from inside self.lock - xrun(['goal', 'kmd', 'start', '-t', '200'], env=self.env, timeout=5) - algodata = self.env['ALGORAND_DATA'] + xrun(["goal", "kmd", "start", "-t", "200"], env=self.env, timeout=5) + algodata = self.env["ALGORAND_DATA"] self.kmd = openkmd(algodata) self.algod = openalgod(algodata) @@ -109,18 +116,18 @@ def get_pub_wallet(self): wallets = self.kmd.list_wallets() pubwid = None for xw in wallets: - if xw['name'] == 'unencrypted-default-wallet': - pubwid = xw['id'] - pubw = self.kmd.init_wallet_handle(pubwid, '') + if xw["name"] == "unencrypted-default-wallet": + pubwid = xw["id"] + pubw = self.kmd.init_wallet_handle(pubwid, "") pubaddrs = self.kmd.list_keys(pubw) pubbalances = [] maxamount = 0 maxpubaddr = None for pa in pubaddrs: pai = self.algod.account_info(pa) - if pai['amount'] > maxamount: - maxamount = pai['amount'] - maxpubaddr = pai['address'] + if pai["amount"] > maxamount: + maxamount = pai["amount"] + maxpubaddr = pai["address"] self.pubw = pubw self.maxpubaddr = maxpubaddr return self.pubw, self.maxpubaddr @@ -131,33 +138,61 @@ def do_txn(self): # create a wallet with an addr to send to walletname = base64.b16encode(os.urandom(16)).decode() - winfo = kmd.create_wallet(walletname, '') - handle = kmd.init_wallet_handle(winfo['id'], '') + winfo = kmd.create_wallet(walletname, "") + handle = kmd.init_wallet_handle(winfo["id"], "") addr = kmd.generate_key(handle) # send one million Algos to the test wallet's account params = algod.suggested_params() - round = params['lastRound'] - txn = algosdk.transaction.PaymentTxn(sender=maxpubaddr, fee=params['minFee'], first=round, last=round+100, gh=params['genesishashb64'], receiver=addr, amt=1000000000000, flat_fee=True) - stxn = kmd.sign_transaction(pubw, '', txn) + round = params["lastRound"] + txn = algosdk.transaction.PaymentTxn( + sender=maxpubaddr, + fee=params["minFee"], + first=round, + last=round + 100, + gh=params["genesishashb64"], + receiver=addr, + amt=1000000000000, + flat_fee=True, + ) + stxn = kmd.sign_transaction(pubw, "", txn) txid = algod.send_transaction(stxn) for i in range(50): txinfo = algod.pending_transaction_info(txid) - if txinfo.get('round'): + if txinfo.get("round"): break time.sleep(0.1) return txid, txinfo + def main(): start = time.time() import argparse + ap = argparse.ArgumentParser() - ap.add_argument('--go-algorand', help='path to go-algorand checkout') - ap.add_argument('--keep-temps', default=False, action='store_true', help='if set, keep all the test files') - ap.add_argument('--indexer-bin', default=None, help='path to algorand-indexer binary, otherwise search PATH') - ap.add_argument('--indexer-port', default=None, type=int, help='port to run indexer on. defaults to random in [4000,30000]') - ap.add_argument('--connection-string', help='Use this connection string instead of attempting to manage a local database.') - ap.add_argument('--verbose', default=False, action='store_true') + ap.add_argument("--go-algorand", help="path to go-algorand checkout") + ap.add_argument( + "--keep-temps", + default=False, + action="store_true", + help="if set, keep all the test files", + ) + ap.add_argument( + "--indexer-bin", + default=None, + help="path to algorand-indexer binary, otherwise search PATH", + ) + ap.add_argument( + "--indexer-port", + default=None, + type=int, + help="port to run indexer on. defaults to random in [4000,30000]", + ) + ap.add_argument( + "--connection-string", + help="Use this connection string instead of attempting to manage a local database.", + ) + ap.add_argument("--verbose", default=False, action="store_true") args = ap.parse_args() if args.verbose: logging.basicConfig(level=logging.DEBUG) @@ -170,58 +205,82 @@ def main(): # env for child processes env = dict(os.environ) - tempdir = os.getenv('TEMPDIR') + tempdir = os.getenv("TEMPDIR") if not tempdir: tempdir = tempfile.mkdtemp() - env['TEMPDIR'] = tempdir - logger.info('created TEMPDIR %r', tempdir) + env["TEMPDIR"] = tempdir + logger.info("created TEMPDIR %r", tempdir) if not args.keep_temps: # If we created a tmpdir and we're not keeping it, clean it up. # If an outer process specified $TEMPDIR, let them clean it up. atexit.register(shutil.rmtree, tempdir, onerror=logger.error) else: - atexit.register(print, 'keeping temps. to clean up:\nrm -rf {}'.format(tempdir)) + atexit.register( + print, "keeping temps. to clean up:\nrm -rf {}".format(tempdir) + ) - netdir = os.path.join(tempdir, 'net') - env['NETDIR'] = netdir + netdir = os.path.join(tempdir, "net") + env["NETDIR"] = netdir - template = os.path.join(goalgorand, 'test/testdata/nettemplates/TwoNodes50EachFuture.json') - xrun(['goal', 'network', 'create', '-r', netdir, '-n', 'tbd', '-t', template], timeout=30) - xrun(['goal', 'network', 'start', '-r', netdir], timeout=30) + template = os.path.join( + goalgorand, "test/testdata/nettemplates/TwoNodes50EachFuture.json" + ) + xrun( + ["goal", "network", "create", "-r", netdir, "-n", "tbd", "-t", template], + timeout=30, + ) + xrun(["goal", "network", "start", "-r", netdir], timeout=30) atexit.register(goal_network_stop, netdir) - algodata = os.path.join(netdir, 'Node') - env['ALGORAND_DATA'] = algodata + algodata = os.path.join(netdir, "Node") + env["ALGORAND_DATA"] = algodata psqlstring = ensure_test_db(args.connection_string, args.keep_temps) - primary = os.path.join(netdir, 'Primary') - aiport = args.indexer_port or random.randint(4000,30000) - indexer_token = 'security-theater' - indexerp = subprocess.Popen([indexer_bin, 'daemon', '--algod', primary, '--postgres', psqlstring, '--dev-mode', '--server', ':{}'.format(aiport), '--token', indexer_token]) + primary = os.path.join(netdir, "Primary") + aiport = args.indexer_port or random.randint(4000, 30000) + indexer_token = "security-theater" + indexerp = subprocess.Popen( + [ + indexer_bin, + "daemon", + "--algod", + primary, + "--postgres", + psqlstring, + "--dev-mode", + "--server", + ":{}".format(aiport), + "--token", + indexer_token, + ] + ) atexit.register(indexerp.kill) rc = RunContext(env) txid, txinfo = rc.do_txn() - logger.debug('submitted txid %s, %r', txid, txinfo) + logger.debug("submitted txid %s, %r", txid, txinfo) - indexer = algosdk.v2client.indexer.IndexerClient(indexer_token, 'http://localhost:{}'.format(aiport)) + indexer = algosdk.v2client.indexer.IndexerClient( + indexer_token, "http://localhost:{}".format(aiport) + ) ok = False retcode = 1 for i in range(30): result = indexer.search_transactions(txid=txid) - logger.debug('seacrh_transactions: %r', result) - they = result.get('transactions') - if they and they[0].get('confirmed-round'): - logger.info('OK: Got txn') + logger.debug("seacrh_transactions: %r", result) + they = result.get("transactions") + if they and they[0].get("confirmed-round"): + logger.info("OK: Got txn") ok = True retcode = 0 break time.sleep(1.0) dt = time.time() - start - ok = (ok and 'OK') or 'FAIL' + ok = (ok and "OK") or "FAIL" sys.stdout.write("indexer live test {} ({:.1f}s)\n".format(ok, dt)) return retcode -if __name__ == '__main__': + +if __name__ == "__main__": sys.exit(main()) diff --git a/misc/release.py b/misc/release.py index abe3afd06..18967725d 100755 --- a/misc/release.py +++ b/misc/release.py @@ -18,50 +18,53 @@ try: import grp + def groupname(gid): return grp.getgrgid(gid)[0] + except: + def groupname(gid): return str(gid) + import markdown2 logger = logging.getLogger(__name__) -#GOOS GOARCH DEB_HOST_ARCH +# GOOS GOARCH DEB_HOST_ARCH osArchArch = [ - ('linux', 'amd64', 'amd64'), - ('linux', 'arm', 'armhf'), - ('linux', 'arm64', 'arm64'), - ('darwin', 'amd64', None), + ("linux", "amd64", "amd64"), + ("linux", "arm", "armhf"), + ("linux", "arm64", "arm64"), + ("darwin", "amd64", None), ] -channel = 'indexer' +channel = "indexer" filespec = [ # [files], source path, deb path, tar path [ - ['algorand-indexer.service', 'algorand-indexer@.service'], - 'misc/systemd', - 'lib/systemd/system', - '', + ["algorand-indexer.service", "algorand-indexer@.service"], + "misc/systemd", + "lib/systemd/system", + "", ], [ - ['algorand-indexer'], - 'cmd/algorand-indexer', - 'usr/bin', - '', + ["algorand-indexer"], + "cmd/algorand-indexer", + "usr/bin", + "", ], [ - ['LICENSE'], - '', + ["LICENSE"], + "", None, - '', + "", ], ] -debian_copyright_top = ( -'''Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +debian_copyright_top = """Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: Algorand Indexer Upstream-Contact: Algorand developers Source: https://github.com/algorand/indexer @@ -69,40 +72,47 @@ def groupname(gid): Files: * Copyright: Algorand developers License: MIT -''') +""" + def debian_copyright(outpath): - with open(outpath, 'wt') as fout: + with open(outpath, "wt") as fout: fout.write(debian_copyright_top) - with open('LICENSE') as fin: + with open("LICENSE") as fin: for line in fin: line = line.strip() if not line: - line = ' .\n' + line = " .\n" else: - line = ' ' + line + '\n' + line = " " + line + "\n" fout.write(line) + def arch_ver(outpath, inpath, debarch, version): - with open(outpath, 'wt') as fout: + with open(outpath, "wt") as fout: with open(inpath) as fin: for line in fin: - line = line.replace('@ARCH@', debarch) - line = line.replace('@VER@', version) - line = line.replace('@CHANNEL@', channel) + line = line.replace("@ARCH@", debarch) + line = line.replace("@VER@", version) + line = line.replace("@CHANNEL@", channel) fout.write(line) + def link(sourcepath, destpath): if os.path.exists(destpath): - if (os.path.getmtime(destpath) >= os.path.getmtime(sourcepath)): - return # nothing to do + if os.path.getmtime(destpath) >= os.path.getmtime(sourcepath): + return # nothing to do os.remove(destpath) os.link(sourcepath, destpath) -_tagpat = re.compile(r'tag:\s+([^,\n]+)') + +_tagpat = re.compile(r"tag:\s+([^,\n]+)") + def compile_version_opts(release_version=None, allow_mismatch=False): - result = subprocess.run(['git', 'log', '-n', '1', '--pretty=%H %D'], stdout=subprocess.PIPE) + result = subprocess.run( + ["git", "log", "-n", "1", "--pretty=%H %D"], stdout=subprocess.PIPE + ) result.check_returncode() so = result.stdout.decode() githash, desc = so.split(None, 1) @@ -115,61 +125,84 @@ def compile_version_opts(release_version=None, allow_mismatch=False): break if tag != release_version: if not allow_mismatch: - raise Exception('.version is {!r} but tags {!r}'.format(release_version, tags)) + raise Exception( + ".version is {!r} but tags {!r}".format(release_version, tags) + ) else: - logger.warning('.version is %r but tags %r', release_version, tags) - now = time.strftime('%Y-%m-%dT%H:%M:%S', time.gmtime()) + '+0000' - result = subprocess.run(['git', 'status', '--porcelain'], stdout=subprocess.PIPE) + logger.warning(".version is %r but tags %r", release_version, tags) + now = time.strftime("%Y-%m-%dT%H:%M:%S", time.gmtime()) + "+0000" + result = subprocess.run(["git", "status", "--porcelain"], stdout=subprocess.PIPE) result.check_returncode() if len(result.stdout) > 2: dirty = "true" else: dirty = "" # Note: keep these in sync with Makefile - ldflags = '-ldflags=-X github.com/algorand/indexer/version.Hash={}'.format(githash) - ldflags += ' -X github.com/algorand/indexer/version.Dirty={}'.format(dirty) - ldflags += ' -X github.com/algorand/indexer/version.CompileTime={}'.format(now) - ldflags += ' -X github.com/algorand/indexer/version.GitDecorateBase64={}'.format(base64.b64encode(desc.encode()).decode()) + ldflags = "-ldflags=-X github.com/algorand/indexer/version.Hash={}".format(githash) + ldflags += " -X github.com/algorand/indexer/version.Dirty={}".format(dirty) + ldflags += " -X github.com/algorand/indexer/version.CompileTime={}".format(now) + ldflags += " -X github.com/algorand/indexer/version.GitDecorateBase64={}".format( + base64.b64encode(desc.encode()).decode() + ) if release_version: - ldflags += ' -X github.com/algorand/indexer/version.ReleaseVersion={}'.format(release_version) - logger.debug('Hash=%r Dirty=%r CompileTime=%r decorate=%r ReleaseVersion=%r', githash, dirty, now, desc, release_version) - logger.debug('%s', ldflags) + ldflags += " -X github.com/algorand/indexer/version.ReleaseVersion={}".format( + release_version + ) + logger.debug( + "Hash=%r Dirty=%r CompileTime=%r decorate=%r ReleaseVersion=%r", + githash, + dirty, + now, + desc, + release_version, + ) + logger.debug("%s", ldflags) return ldflags + def compile(goos=None, goarch=None, ldflags=None): env = dict(os.environ) if goos is not None: - env['GOOS'] = goos + env["GOOS"] = goos if goarch is not None: - env['GOARCH'] = goarch - cmd = ['go', 'build'] + env["GOARCH"] = goarch + cmd = ["go", "build"] if ldflags is not None: cmd.append(ldflags) - subprocess.run(cmd, cwd='cmd/algorand-indexer', env=env).check_returncode() + subprocess.run(cmd, cwd="cmd/algorand-indexer", env=env).check_returncode() + def build_deb(debarch, version, outdir): - os.makedirs('.deb_tmp/DEBIAN', exist_ok=True) - debian_copyright('.deb_tmp/DEBIAN/copyright') - arch_ver('.deb_tmp/DEBIAN/control', 'misc/debian/control', debarch, version) - os.makedirs('.deb_tmp/etc/apt/apt.conf.d', exist_ok=True) - arch_ver('.deb_tmp/etc/apt/apt.conf.d/52algorand-indexer-upgrades', 'misc/debian/52algorand-indexer-upgrades', debarch, version) + os.makedirs(".deb_tmp/DEBIAN", exist_ok=True) + debian_copyright(".deb_tmp/DEBIAN/copyright") + arch_ver(".deb_tmp/DEBIAN/control", "misc/debian/control", debarch, version) + os.makedirs(".deb_tmp/etc/apt/apt.conf.d", exist_ok=True) + arch_ver( + ".deb_tmp/etc/apt/apt.conf.d/52algorand-indexer-upgrades", + "misc/debian/52algorand-indexer-upgrades", + debarch, + version, + ) for files, source_path, deb_path, _ in filespec: if deb_path is None: continue for fname in files: if deb_path: - os.makedirs(os.path.join('.deb_tmp', deb_path), exist_ok=True) - link(os.path.join(source_path, fname), os.path.join('.deb_tmp', deb_path, fname)) - debname = 'algorand-indexer_{}_{}.deb'.format(version, debarch) + os.makedirs(os.path.join(".deb_tmp", deb_path), exist_ok=True) + link( + os.path.join(source_path, fname), + os.path.join(".deb_tmp", deb_path, fname), + ) + debname = "algorand-indexer_{}_{}.deb".format(version, debarch) debpath = os.path.join(outdir, debname) - subprocess.run( - ['dpkg-deb', '--build', '.deb_tmp', debpath]) + subprocess.run(["dpkg-deb", "--build", ".deb_tmp", debpath]) return debpath + def extract_usage(): usage = False usageBuffer = "" - with open('README.md') as infile: + with open("README.md") as infile: for line in infile: if "USAGE_START_MARKER" in line: usage = True @@ -181,7 +214,10 @@ def extract_usage(): usageBuffer += line return usageBuffer + _usage_html = None + + def usage_html(): global _usage_html if _usage_html is not None: @@ -190,48 +226,79 @@ def usage_html(): _usage_html = markdown2.markdown(md, extras=["tables", "fenced-code-blocks"]) return _usage_html + def build_tar(goos, goarch, version, outdir): - rootdir = 'algorand-indexer_{}_{}_{}'.format(goos, goarch, version) - tarname = os.path.join(outdir, rootdir) + '.tar.bz2' - tf = tarfile.open(tarname, 'w:bz2') + rootdir = "algorand-indexer_{}_{}_{}".format(goos, goarch, version) + tarname = os.path.join(outdir, rootdir) + ".tar.bz2" + tf = tarfile.open(tarname, "w:bz2") for files, source_path, _, tar_path in filespec: if tar_path is None: continue for fname in files: - tf.add(os.path.join(source_path, fname), os.path.join(rootdir, tar_path, fname)) + tf.add( + os.path.join(source_path, fname), os.path.join(rootdir, tar_path, fname) + ) ti = tarfile.TarInfo(name=os.path.join(rootdir, "usage.html")) ti.mtime = time.time() ti.mode = 0o444 ti.type = tarfile.REGTYPE ti.uid = os.getuid() - ti.uname = os.getenv('USER') or '' + ti.uname = os.getenv("USER") or "" ti.gid = os.getgid() ti.gname = groupname(os.getgid()) - uhtml = usage_html().encode('utf-8') - ti.size=len(uhtml) + uhtml = usage_html().encode("utf-8") + ti.size = len(uhtml) tf.addfile(ti, io.BytesIO(uhtml)) tf.close() return tarname + def hostOsArch(): - result = subprocess.run(['go', 'env'], stdout=subprocess.PIPE) + result = subprocess.run(["go", "env"], stdout=subprocess.PIPE) result.check_returncode() goenv = {} for line in result.stdout.decode().splitlines(): line = line.strip() - k,v = line.split('=', 1) + k, v = line.split("=", 1) goenv[k] = shlex.split(v)[0] - return goenv['GOHOSTOS'], goenv['GOHOSTARCH'] + return goenv["GOHOSTOS"], goenv["GOHOSTARCH"] + def main(): start = time.time() ap = argparse.ArgumentParser() - ap.add_argument('-o', '--outdir', help='The output directory for the build assets', type=str, default='.') - ap.add_argument('--no-deb', action='store_true', default=False, help='disable debian package building') - ap.add_argument('--host-only', action='store_true', default=False, help='only build for host OS and CPU') - ap.add_argument('--build-only', action='store_true', default=False, help="don't make tar or deb release") - ap.add_argument('--fake-release', action='store_true', default=False, help='relax some checks during release script development') - ap.add_argument('--verbose', action='store_true', default=False) + ap.add_argument( + "-o", + "--outdir", + help="The output directory for the build assets", + type=str, + default=".", + ) + ap.add_argument( + "--no-deb", + action="store_true", + default=False, + help="disable debian package building", + ) + ap.add_argument( + "--host-only", + action="store_true", + default=False, + help="only build for host OS and CPU", + ) + ap.add_argument( + "--build-only", + action="store_true", + default=False, + help="don't make tar or deb release", + ) + ap.add_argument( + "--fake-release", + action="store_true", + default=False, + help="relax some checks during release script development", + ) + ap.add_argument("--verbose", action="store_true", default=False) args = ap.parse_args() if args.verbose: @@ -242,27 +309,28 @@ def main(): if args.host_only: hostos, hostarch = hostOsArch() - logger.info('will only run %s %s', hostos, hostarch) - with open('.version') as fin: + logger.info("will only run %s %s", hostos, hostarch) + with open(".version") as fin: version = fin.read().strip() ldflags = compile_version_opts(version, allow_mismatch=args.fake_release) for goos, goarch, debarch in osArchArch: if args.host_only and (goos != hostos or goarch != hostarch): - logger.debug('skip %s %s', goos, goarch) + logger.debug("skip %s %s", goos, goarch) continue - logger.info('GOOS=%s GOARCH=%s DEB_HOST_ARCH=%s', goos, goarch, debarch) + logger.info("GOOS=%s GOARCH=%s DEB_HOST_ARCH=%s", goos, goarch, debarch) compile(goos, goarch, ldflags) if args.build_only: - logger.debug('skip packaging') + logger.debug("skip packaging") continue tarname = build_tar(goos, goarch, version, outdir) - logger.info('\t%s', tarname) + logger.info("\t%s", tarname) if (not args.no_deb) and (debarch is not None): debname = build_deb(debarch, version, outdir) - logger.info('\t%s', debname) + logger.info("\t%s", debname) dt = time.time() - start - logger.info('done %0.1fs', dt) + logger.info("done %0.1fs", dt) return -if __name__ == '__main__': + +if __name__ == "__main__": main() diff --git a/misc/speedtest.py b/misc/speedtest.py index c76f6b87d..076a278d9 100644 --- a/misc/speedtest.py +++ b/misc/speedtest.py @@ -14,37 +14,40 @@ logger = logging.getLogger(__name__) -_localhost_rooturl = 'http://localhost:8980' +_localhost_rooturl = "http://localhost:8980" # getAccountsPage(pageurl string, accounts set()) # return nextToken or None def getAccountsPage(pageurl, accounts): try: - logger.debug('GET %r', pageurl) + logger.debug("GET %r", pageurl) response = urllib.request.urlopen(pageurl) except urllib.error.HTTPError as e: - logger.error('failed to fetch %r', pageurl) - logger.error('msg: %s', e.file.read()) + logger.error("failed to fetch %r", pageurl) + logger.error("msg: %s", e.file.read()) raise except Exception as e: - logger.error('%r', pageurl, exc_info=True) + logger.error("%r", pageurl, exc_info=True) raise - if (response.code != 200) or not response.getheader('Content-Type').startswith('application/json'): + if (response.code != 200) or not response.getheader("Content-Type").startswith( + "application/json" + ): raise Exception("bad response to {!r}: {}".format(pageurl, response.reason)) ob = json.loads(response.read()) - qa = ob.get('accounts',[]) + qa = ob.get("accounts", []) if not qa: return None for acct in qa: - accounts.add(acct['address']) - return ob.get('next-token') + accounts.add(acct["address"]) + return ob.get("next-token") + # /v2/acccounts def getAccountList(rooturl): rootparts = urllib.parse.urlparse(rooturl) rawurl = list(rootparts) accountsurl = list(rootparts) - accountsurl[2] = os.path.join(rawurl[2], 'v2', 'accounts') + accountsurl[2] = os.path.join(rawurl[2], "v2", "accounts") query = {} accounts = set() start = time.time() @@ -52,7 +55,7 @@ def getAccountList(rooturl): reporturl = None while True: if nextToken is not None: - query['next'] = nextToken + query["next"] = nextToken if query: accountsurl[4] = urllib.parse.urlencode(query) pageurl = urllib.parse.urlunparse(accountsurl) @@ -62,8 +65,14 @@ def getAccountList(rooturl): if nextToken is None: break dt = time.time() - start - logger.info('account list: %d accounts in %0.2f seconds, %.1f /s', len(accounts), dt, len(accounts)/dt) - return accounts, {'url':reporturl, 'accounts': len(accounts), 'seconds': dt} + logger.info( + "account list: %d accounts in %0.2f seconds, %.1f /s", + len(accounts), + dt, + len(accounts) / dt, + ) + return accounts, {"url": reporturl, "accounts": len(accounts), "seconds": dt} + # /v2/accounts/AAAAA # TODO: multithreading, because a single client won't find the limit of the server @@ -77,13 +86,15 @@ def accountRandom(rooturl, accounts, n=1000, minTime=None, maxTime=30): start = time.time() reporturl = None for addr in accounts: - accountsurl[2] = os.path.join(rawurl[2], 'v2', 'accounts', addr) + accountsurl[2] = os.path.join(rawurl[2], "v2", "accounts", addr) pageurl = urllib.parse.urlunparse(accountsurl) if reporturl is None: reporturl = pageurl - logger.debug('GET %s', pageurl) + logger.debug("GET %s", pageurl) response = urllib.request.urlopen(pageurl) - if (response.code != 200) or not response.getheader('Content-Type').startswith('application/json'): + if (response.code != 200) or not response.getheader("Content-Type").startswith( + "application/json" + ): raise Exception("bad response to {!r}: {}".format(pageurl, response.reason)) # don't actually care about content, just check that it parses json.loads(response.read()) @@ -95,8 +106,11 @@ def accountRandom(rooturl, accounts, n=1000, minTime=None, maxTime=30): break if maxTime and (dt > maxTime): break - logger.info('account random: %d accounts in %0.2f seconds, %.1f /s', count, dt, count/dt) - return {'url':reporturl, 'accounts': count, 'seconds': dt} + logger.info( + "account random: %d accounts in %0.2f seconds, %.1f /s", count, dt, count / dt + ) + return {"url": reporturl, "accounts": count, "seconds": dt} + # /v2/transactions?addr= # equivalent to @@ -112,18 +126,20 @@ def accountRecents(rooturl, accounts, n=1000, minTime=None, maxTime=10, ntxns=10 start = time.time() reporturl = None for addr in accounts: - atxnsurl[2] = os.path.join(rawurl[2], 'v2', 'transactions') - query = {'limit':ntxns, 'address':addr} + atxnsurl[2] = os.path.join(rawurl[2], "v2", "transactions") + query = {"limit": ntxns, "address": addr} atxnsurl[4] = urllib.parse.urlencode(query) pageurl = urllib.parse.urlunparse(atxnsurl) if reporturl is None: reporturl = pageurl - logger.debug('GET %s', pageurl) + logger.debug("GET %s", pageurl) response = urllib.request.urlopen(pageurl) - if (response.code != 200) or not response.getheader('Content-Type').startswith('application/json'): + if (response.code != 200) or not response.getheader("Content-Type").startswith( + "application/json" + ): raise Exception("bad response to {!r}: {}".format(pageurl, response.reason)) ob = json.loads(response.read()) - txns = ob.get('transactions', []) + txns = ob.get("transactions", []) txcount += len(txns) count += 1 dt = time.time() - start @@ -133,15 +149,23 @@ def accountRecents(rooturl, accounts, n=1000, minTime=None, maxTime=10, ntxns=10 break if maxTime and (dt > maxTime): break - logger.info('account recent txns: %d accounts in %0.2f seconds, %.1f /s; %d txns, %.1f txn/s', count, dt, count/dt, txcount, txcount/dt) - return {'url':reporturl, 'accounts': count, 'seconds': dt, 'txns': txcount} + logger.info( + "account recent txns: %d accounts in %0.2f seconds, %.1f /s; %d txns, %.1f txn/s", + count, + dt, + count / dt, + txcount, + txcount / dt, + ) + return {"url": reporturl, "accounts": count, "seconds": dt, "txns": txcount} + # /v2/assets def getAssets(rooturl): rootparts = urllib.parse.urlparse(rooturl) rawurl = list(rootparts) accountsurl = list(rootparts) - accountsurl[2] = os.path.join(rawurl[2], 'v2', 'assets') + accountsurl[2] = os.path.join(rawurl[2], "v2", "assets") query = {} assets = {} start = time.time() @@ -149,25 +173,33 @@ def getAssets(rooturl): reporturl = None while True: if nextToken is not None: - query['next'] = nextToken + query["next"] = nextToken if query: accountsurl[4] = urllib.parse.urlencode(query) pageurl = urllib.parse.urlunparse(accountsurl) if reporturl is None: reporturl = pageurl - logger.debug('GET %s', pageurl) + logger.debug("GET %s", pageurl) response = urllib.request.urlopen(pageurl) - if (response.code != 200) or not response.getheader('Content-Type').startswith('application/json'): + if (response.code != 200) or not response.getheader("Content-Type").startswith( + "application/json" + ): raise Exception("bad response to {!r}: {}".format(pageurl, response.reason)) page = json.loads(response.read()) - for arec in page.get('assets', []): - assets[arec['index']] = arec['params'] - nextToken = page.get('next-token') + for arec in page.get("assets", []): + assets[arec["index"]] = arec["params"] + nextToken = page.get("next-token") if nextToken is None: break dt = time.time() - start - logger.info('asset list: %d assets in %0.2f seconds, %.1f /s', len(assets), dt, len(assets)/dt) - return assets, {'url':reporturl, 'assets': len(assets), 'seconds': dt} + logger.info( + "asset list: %d assets in %0.2f seconds, %.1f /s", + len(assets), + dt, + len(assets) / dt, + ) + return assets, {"url": reporturl, "assets": len(assets), "seconds": dt} + # /v2/assets/{asset-id}/transactions # equivalent to @@ -186,18 +218,22 @@ def assetTxns(rooturl, assets, n=1000, minTime=None, maxTime=10, ntxns=1000): start = time.time() reporturl = None for assetid in assets: - atxnsurl[2] = os.path.join(rawurl[2], 'v2', 'assets', str(assetid), 'transactions') - query = {'limit':ntxns} + atxnsurl[2] = os.path.join( + rawurl[2], "v2", "assets", str(assetid), "transactions" + ) + query = {"limit": ntxns} atxnsurl[4] = urllib.parse.urlencode(query) pageurl = urllib.parse.urlunparse(atxnsurl) if reporturl is None: reporturl = pageurl - logger.debug('GET %s', pageurl) + logger.debug("GET %s", pageurl) response = urllib.request.urlopen(pageurl) - if (response.code != 200) or not response.getheader('Content-Type').startswith('application/json'): + if (response.code != 200) or not response.getheader("Content-Type").startswith( + "application/json" + ): raise Exception("bad response to {!r}: {}".format(pageurl, response.reason)) ob = json.loads(response.read()) - txns = ob.get('transactions', []) + txns = ob.get("transactions", []) txcount += len(txns) count += 1 dt = time.time() - start @@ -207,8 +243,16 @@ def assetTxns(rooturl, assets, n=1000, minTime=None, maxTime=10, ntxns=1000): break if maxTime and (dt > maxTime): break - logger.info('asset txns: %d assets in %0.2f seconds, %.1f /s; %d txns, %.1f txn/s', count, dt, count/dt, txcount, txcount/dt) - return {'url':reporturl, 'assets': count, 'seconds': dt, 'txns': txcount} + logger.info( + "asset txns: %d assets in %0.2f seconds, %.1f /s; %d txns, %.1f txn/s", + count, + dt, + count / dt, + txcount, + txcount / dt, + ) + return {"url": reporturl, "assets": count, "seconds": dt, "txns": txcount} + # /v2/assets/{asset-id}/balances -- maybe add index to account_asset table? # @@ -225,18 +269,20 @@ def assetBalances(rooturl, assets, n=1000, minTime=None, maxTime=10, ntxns=1000) start = time.time() reporturl = None for assetid in assets: - atxnsurl[2] = os.path.join(rawurl[2], 'v2', 'assets', str(assetid), 'balances') - query = {'limit':ntxns} + atxnsurl[2] = os.path.join(rawurl[2], "v2", "assets", str(assetid), "balances") + query = {"limit": ntxns} atxnsurl[4] = urllib.parse.urlencode(query) pageurl = urllib.parse.urlunparse(atxnsurl) if reporturl is None: reporturl = pageurl - logger.debug('GET %s', pageurl) + logger.debug("GET %s", pageurl) response = urllib.request.urlopen(pageurl) - if (response.code != 200) or not response.getheader('Content-Type').startswith('application/json'): + if (response.code != 200) or not response.getheader("Content-Type").startswith( + "application/json" + ): raise Exception("bad response to {!r}: {}".format(pageurl, response.reason)) ob = json.loads(response.read()) - bals = ob.get('balances', []) + bals = ob.get("balances", []) balcount += len(bals) count += 1 dt = time.time() - start @@ -246,8 +292,16 @@ def assetBalances(rooturl, assets, n=1000, minTime=None, maxTime=10, ntxns=1000) break if maxTime and (dt > maxTime): break - logger.info('asset balances: %d assets in %0.2f seconds, %.1f /s; %d bals, %.1f bal/s', count, dt, count/dt, balcount, balcount/dt) - return {'url':reporturl, 'assets': count, 'seconds': dt, 'balances': balcount} + logger.info( + "asset balances: %d assets in %0.2f seconds, %.1f /s; %d bals, %.1f bal/s", + count, + dt, + count / dt, + balcount, + balcount / dt, + ) + return {"url": reporturl, "assets": count, "seconds": dt, "balances": balcount} + # TODO: # /v2/applications -- this should be fast because it's a single table scan @@ -259,13 +313,18 @@ def assetBalances(rooturl, assets, n=1000, minTime=None, maxTime=10, ntxns=1000) def main(): import argparse + ap = argparse.ArgumentParser() - ap.add_argument('--indexer', default='http://localhost:8980', help='URL to indexer to fetch from, default http://localhost:8980') - ap.add_argument('--accounts', type=bool, default=True) - ap.add_argument('--no-accounts', dest='accounts', action='store_false') - ap.add_argument('--assets', type=bool, default=True) - ap.add_argument('--no-assets', dest='assets', action='store_false') - ap.add_argument('--verbose', default=False, action='store_true') + ap.add_argument( + "--indexer", + default="http://localhost:8980", + help="URL to indexer to fetch from, default http://localhost:8980", + ) + ap.add_argument("--accounts", type=bool, default=True) + ap.add_argument("--no-accounts", dest="accounts", action="store_false") + ap.add_argument("--assets", type=bool, default=True) + ap.add_argument("--no-assets", dest="assets", action="store_false") + ap.add_argument("--verbose", default=False, action="store_true") args = ap.parse_args() if args.verbose: @@ -274,8 +333,8 @@ def main(): logging.basicConfig(level=logging.INFO) indexerurl = args.indexer - if not indexerurl.startswith('http://'): - indexerurl = 'http://' + indexerurl + if not indexerurl.startswith("http://"): + indexerurl = "http://" + indexerurl report = [] if args.accounts: @@ -293,8 +352,9 @@ def main(): rept = assetBalances(indexerurl, assets) report.append(rept) json.dump(report, sys.stdout) - sys.stdout.write('\n') + sys.stdout.write("\n") return 0 -if __name__ == '__main__': + +if __name__ == "__main__": sys.exit(main()) diff --git a/misc/util.py b/misc/util.py index e2fc503d8..d5dc2674e 100644 --- a/misc/util.py +++ b/misc/util.py @@ -14,27 +14,29 @@ def maybedecode(x): - if hasattr(x, 'decode'): + if hasattr(x, "decode"): return x.decode() return x + def mloads(x): return msgpack.loads(x, strict_map_key=False, raw=True) + def unmsgpack(ob): "convert dict from msgpack.loads() with byte string keys to text string keys" if isinstance(ob, dict): od = {} - for k,v in ob.items(): + for k, v in ob.items(): k = maybedecode(k) okv = False - if (not okv) and (k == 'note'): + if (not okv) and (k == "note"): try: v = unmsgpack(mloads(v)) okv = True except: pass - if (not okv) and k in ('type', 'note'): + if (not okv) and k in ("type", "note"): try: v = v.decode() okv = True @@ -46,10 +48,11 @@ def unmsgpack(ob): return od if isinstance(ob, list): return [unmsgpack(v) for v in ob] - #if isinstance(ob, bytes): + # if isinstance(ob, bytes): # return base64.b64encode(ob).decode() return ob + def _getio(p, od, ed): if od is not None: od = maybedecode(od) @@ -57,25 +60,26 @@ def _getio(p, od, ed): try: od = maybedecode(p.stdout.read()) except: - logger.error('subcomand out', exc_info=True) + logger.error("subcomand out", exc_info=True) if ed is not None: ed = maybedecode(ed) elif p.stderr: try: ed = maybedecode(p.stderr.read()) except: - logger.error('subcomand err', exc_info=True) + logger.error("subcomand err", exc_info=True) return od, ed + def xrun(cmd, *args, **kwargs): - timeout = kwargs.pop('timeout', None) - kwargs['stdout'] = subprocess.PIPE - kwargs['stderr'] = subprocess.STDOUT - cmdr = ' '.join(map(repr,cmd)) + timeout = kwargs.pop("timeout", None) + kwargs["stdout"] = subprocess.PIPE + kwargs["stderr"] = subprocess.STDOUT + cmdr = " ".join(map(repr, cmd)) try: p = subprocess.Popen(cmd, *args, **kwargs) except Exception as e: - logger.error('subprocess failed {}'.format(cmdr), exc_info=True) + logger.error("subprocess failed {}".format(cmdr), exc_info=True) raise stdout_data, stderr_data = None, None try: @@ -84,79 +88,88 @@ def xrun(cmd, *args, **kwargs): else: stdout_data, stderr_data = p.communicate() except subprocess.TimeoutExpired as te: - logger.error('subprocess timed out {}'.format(cmdr), exc_info=True) + logger.error("subprocess timed out {}".format(cmdr), exc_info=True) stdout_data, stderr_data = _getio(p, stdout_data, stderr_data) if stdout_data: - sys.stderr.write('output from {}:\n{}\n\n'.format(cmdr, stdout_data)) + sys.stderr.write("output from {}:\n{}\n\n".format(cmdr, stdout_data)) if stderr_data: - sys.stderr.write('stderr from {}:\n{}\n\n'.format(cmdr, stderr_data)) + sys.stderr.write("stderr from {}:\n{}\n\n".format(cmdr, stderr_data)) raise except Exception as e: - logger.error('subprocess exception {}'.format(cmdr), exc_info=True) + logger.error("subprocess exception {}".format(cmdr), exc_info=True) stdout_data, stderr_data = _getio(p, stdout_data, stderr_data) if stdout_data: - sys.stderr.write('output from {}:\n{}\n\n'.format(cmdr, stdout_data)) + sys.stderr.write("output from {}:\n{}\n\n".format(cmdr, stdout_data)) if stderr_data: - sys.stderr.write('stderr from {}:\n{}\n\n'.format(cmdr, stderr_data)) + sys.stderr.write("stderr from {}:\n{}\n\n".format(cmdr, stderr_data)) raise if p.returncode != 0: - logger.error('cmd failed ({}) {}'.format(p.returncode, cmdr)) + logger.error("cmd failed ({}) {}".format(p.returncode, cmdr)) stdout_data, stderr_data = _getio(p, stdout_data, stderr_data) if stdout_data: - sys.stderr.write('output from {}:\n{}\n\n'.format(cmdr, stdout_data)) + sys.stderr.write("output from {}:\n{}\n\n".format(cmdr, stdout_data)) if stderr_data: - sys.stderr.write('stderr from {}:\n{}\n\n'.format(cmdr, stderr_data)) - raise Exception('error: cmd failed: {}'.format(cmdr)) + sys.stderr.write("stderr from {}:\n{}\n\n".format(cmdr, stderr_data)) + raise Exception("error: cmd failed: {}".format(cmdr)) if logger.isEnabledFor(logging.DEBUG): - logger.debug('cmd success: %s\n%s\n%s\n', cmdr, maybedecode(stdout_data), maybedecode(stderr_data)) + logger.debug( + "cmd success: %s\n%s\n%s\n", + cmdr, + maybedecode(stdout_data), + maybedecode(stderr_data), + ) + def atexitrun(cmd, *args, **kwargs): - cargs = [cmd]+list(args) + cargs = [cmd] + list(args) atexit.register(xrun, *cargs, **kwargs) + def find_indexer(indexer_bin, exc=True): if indexer_bin: return indexer_bin # manually search local build and PATH for algorand-indexer - path = ['cmd/algorand-indexer'] + os.getenv('PATH').split(':') + path = ["cmd/algorand-indexer"] + os.getenv("PATH").split(":") for pd in path: - ib = os.path.join(pd, 'algorand-indexer') + ib = os.path.join(pd, "algorand-indexer") if os.path.exists(ib): return ib - msg = 'could not find algorand-indexer. use --indexer-bin or PATH environment variable.' + msg = "could not find algorand-indexer. use --indexer-bin or PATH environment variable." if exc: raise Exception(msg) logger.error(msg) return None + def ensure_test_db(connection_string, keep_temps=False): if connection_string: # use the passed db return connection_string # create a temporary database - dbname = 'e2eindex_{}_{}'.format(int(time.time()), random.randrange(1000)) - xrun(['dropdb', '--if-exists', dbname], timeout=5) - xrun(['createdb', dbname], timeout=5) + dbname = "e2eindex_{}_{}".format(int(time.time()), random.randrange(1000)) + xrun(["dropdb", "--if-exists", dbname], timeout=5) + xrun(["createdb", dbname], timeout=5) if not keep_temps: - atexitrun(['dropdb', '--if-exists', dbname], timeout=5) + atexitrun(["dropdb", "--if-exists", dbname], timeout=5) else: logger.info("leaving db %r", dbname) - return 'dbname={} sslmode=disable'.format(dbname) + return "dbname={} sslmode=disable".format(dbname) + # whoever calls this will need to import boto and get the s3 client def firstFromS3Prefix(s3, bucket, prefix, desired_filename, outdir=None, outpath=None): response = s3.list_objects_v2(Bucket=bucket, Prefix=prefix, MaxKeys=50) - if (not response.get('KeyCount')) or ('Contents' not in response): - raise Exception('nothing found in s3://{}/{}'.format(bucket, prefix)) - for x in response['Contents']: - path = x['Key'] - _, fname = path.rsplit('/', 1) + if (not response.get("KeyCount")) or ("Contents" not in response): + raise Exception("nothing found in s3://{}/{}".format(bucket, prefix)) + for x in response["Contents"]: + path = x["Key"] + _, fname = path.rsplit("/", 1) if fname == desired_filename: if outpath is None: if outdir is None: - outdir = '.' + outdir = "." outpath = os.path.join(outdir, desired_filename) - logger.info('s3://%s/%s -> %s', bucket, x['Key'], outpath) - s3.download_file(bucket, x['Key'], outpath) + logger.info("s3://%s/%s -> %s", bucket, x["Key"], outpath) + s3.download_file(bucket, x["Key"], outpath) return - logger.warning('file not found in s3://{}/{}'.format(bucket, prefix)) + logger.warning("file not found in s3://{}/{}".format(bucket, prefix)) diff --git a/misc/validate_accounting.py b/misc/validate_accounting.py index 05c7ca6c3..fdf6dbd9b 100644 --- a/misc/validate_accounting.py +++ b/misc/validate_accounting.py @@ -36,6 +36,7 @@ graceful_stop = False + def do_graceful_stop(signum, frame): global graceful_stop if graceful_stop: @@ -44,135 +45,153 @@ def do_graceful_stop(signum, frame): sys.stderr.write("graceful stop...\n") graceful_stop = True + signal.signal(signal.SIGTERM, do_graceful_stop) signal.signal(signal.SIGINT, do_graceful_stop) + def process_genesis(genesis): - rwd = genesis.get('rwd') + rwd = genesis.get("rwd") if rwd is not None: global reward_addr global reward_niceaddr - logger.debug('reward addr %s', rwd) + logger.debug("reward addr %s", rwd) reward_addr = algosdk.encoding.decode_address(rwd) reward_niceaddr = rwd - fees = genesis.get('fees') + fees = genesis.get("fees") if fees is not None: global fee_addr global fee_niceaddr - logger.debug('fee addr %s', fees) + logger.debug("fee addr %s", fees) fee_addr = algosdk.encoding.decode_address(fees) fee_niceaddr = fees + def getGenesisVars(genesispath): with open(genesispath) as fin: genesis = json.load(fin) process_genesis(genesis) + def encode_addr(addr): if len(addr) == 44: addr = base64.b64decode(addr) if len(addr) == 32: return algosdk.encoding.encode_address(addr) - return 'unknown addr? {!r}'.format(addr) + return "unknown addr? {!r}".format(addr) + def encode_addr_or_none(addr): if addr is None or not addr: return None return encode_addr(addr) + def indexerAccountsFromAddrs(rooturl, blockround=None, addrlist=None, headers=None): - '''generator yielding account records''' + """generator yielding account records""" rootparts = urllib.parse.urlparse(rooturl) rawurl = list(rootparts) accountsurl = list(rootparts) query = {} if blockround is not None: - query['round'] = blockround + query["round"] = blockround for addr in addrlist: if addr in (reward_niceaddr, fee_niceaddr): continue - accountsurl[2] = os.path.join(rawurl[2], 'v2', 'accounts', addr) + accountsurl[2] = os.path.join(rawurl[2], "v2", "accounts", addr) if query: accountsurl[4] = urllib.parse.urlencode(query) pageurl = urllib.parse.urlunparse(accountsurl) - logger.debug('GET %s', pageurl) + logger.debug("GET %s", pageurl) yield from getAccountsPage(pageurl, headers) + def indexerAccountFromAddr(rooturl, niceaddr, blockround=None, headers=None): - '''return one account record''' + """return one account record""" rootparts = urllib.parse.urlparse(rooturl) rawurl = list(rootparts) accountsurl = list(rootparts) query = {} if blockround is not None: - query['round'] = blockround - accountsurl[2] = os.path.join(rawurl[2], 'v2', 'accounts', niceaddr) + query["round"] = blockround + accountsurl[2] = os.path.join(rawurl[2], "v2", "accounts", niceaddr) if query: accountsurl[4] = urllib.parse.urlencode(query) pageurl = urllib.parse.urlunparse(accountsurl) - logger.debug('GET %s', pageurl) + logger.debug("GET %s", pageurl) acct = None for na in getAccountsPage(pageurl, headers): if acct is None: acct = na else: - raise Exception('indexerAccountFromAddr should only yield one, got a second') + raise Exception( + "indexerAccountFromAddr should only yield one, got a second" + ) return acct + def getAccountsPage(pageurl, headers=None, retries=5): if headers is None: headers = {} while True: try: - logger.debug('GET %r', pageurl) - response = urllib.request.urlopen(urllib.request.Request(pageurl, headers=headers), context=ssl_no_validate) - if (response.code != 200) or not response.getheader('Content-Type').startswith('application/json'): + logger.debug("GET %r", pageurl) + response = urllib.request.urlopen( + urllib.request.Request(pageurl, headers=headers), + context=ssl_no_validate, + ) + if (response.code != 200) or not response.getheader( + "Content-Type" + ).startswith("application/json"): if retries <= 0: - raise Exception("bad response to {!r}: {}".format(pageurl, response.reason)) + raise Exception( + "bad response to {!r}: {}".format(pageurl, response.reason) + ) else: break except urllib.error.HTTPError as e: - logger.error('failed to fetch %r', pageurl) - logger.error('msg: %s', e.file.read()) + logger.error("failed to fetch %r", pageurl) + logger.error("msg: %s", e.file.read()) if retries <= 0: raise except Exception as e: - logger.error('%r', pageurl, exc_info=True) + logger.error("%r", pageurl, exc_info=True) if retries <= 0: raise retries -= 1 time.sleep(1) ob = json.loads(response.read()) - logger.debug('ob keys %s', ob.keys()) + logger.debug("ob keys %s", ob.keys()) some = False batchcount = 0 - qa = ob.get('accounts',[]) - acct = ob.get('account') + qa = ob.get("accounts", []) + acct = ob.get("account") if acct is not None: qa.append(acct) for acct in qa: batchcount += 1 yield acct some = True - logger.debug('got %d accounts', batchcount) + logger.debug("got %d accounts", batchcount) + def indexerAccounts(rooturl, blockround=None, addrlist=None, headers=None, gtaddr=None): - '''return {raw account: {"algo":N, "asset":{}}, ...}''' + """return {raw account: {"algo":N, "asset":{}}, ...}""" if addrlist: yield from indexerAccountsFromAddrs(rooturl, blockround, addrlist, headers) return rootparts = urllib.parse.urlparse(rooturl) accountsurl = list(rootparts) - accountsurl[2] = os.path.join(accountsurl[2], 'v2', 'accounts') + accountsurl[2] = os.path.join(accountsurl[2], "v2", "accounts") start = time.time() - query = {'limit':500} + query = {"limit": 500} if blockround is not None: - query['round'] = blockround + query["round"] = blockround count = 0 while True: if gtaddr: # set query: - query['next'] = gtaddr + query["next"] = gtaddr if query: accountsurl[4] = urllib.parse.urlencode(query) pageurl = urllib.parse.urlunparse(accountsurl) @@ -182,83 +201,113 @@ def indexerAccounts(rooturl, blockround=None, addrlist=None, headers=None, gtadd count += 1 some = True yield acct - addr = acct['address'] + addr = acct["address"] gtaddr = addr if not some: break dt = time.time() - start - logger.debug('loaded %d accounts from %s ?round=%s in %.2f seconds', count, rooturl, blockround, dt) + logger.debug( + "loaded %d accounts from %s ?round=%s in %.2f seconds", + count, + rooturl, + blockround, + dt, + ) + # generator yielding txns objects -def indexerAccountTxns(rooturl, addr, minround=None, maxround=None, limit=None, token=None): +def indexerAccountTxns( + rooturl, addr, minround=None, maxround=None, limit=None, token=None +): niceaddr = algosdk.encoding.encode_address(addr) rootparts = urllib.parse.urlparse(rooturl) atxnsurl = list(rootparts) - atxnsurl[2] = os.path.join(atxnsurl[2], 'v2', 'transactions') - query = {'limit':1000, 'address':niceaddr} + atxnsurl[2] = os.path.join(atxnsurl[2], "v2", "transactions") + query = {"limit": 1000, "address": niceaddr} if token is not None: - headers = {'X-Indexer-API-Token': token} + headers = {"X-Indexer-API-Token": token} else: headers = {} if minround is not None: - query['min-round'] = minround + query["min-round"] = minround if maxround is not None: - query['max-round'] = maxround + query["max-round"] = maxround if limit is not None: - query['limit'] = limit + query["limit"] = limit while True: atxnsurl[4] = urllib.parse.urlencode(query) pageurl = urllib.parse.urlunparse(atxnsurl) try: - logger.debug('GET %s', pageurl) + logger.debug("GET %s", pageurl) req = urllib.request.Request(pageurl, headers=headers) response = urllib.request.urlopen(pageurl, context=ssl_no_validate) except urllib.error.HTTPError as e: - logger.error('failed to fetch %r', pageurl) - logger.error('msg: %s', e.file.read()) + logger.error("failed to fetch %r", pageurl) + logger.error("msg: %s", e.file.read()) raise except Exception as e: - logger.error('failed to fetch %r', pageurl) - logger.error('err %r (%s)', e, type(e)) + logger.error("failed to fetch %r", pageurl) + logger.error("err %r (%s)", e, type(e)) raise - if (response.code != 200) or (not response.getheader('Content-Type').startswith('application/json')): - raise Exception("bad response to {!r}: {} {}, {!r}".format(pageurl, response.code, response.reason, response.getheader('Content-Type'))) + if (response.code != 200) or ( + not response.getheader("Content-Type").startswith("application/json") + ): + raise Exception( + "bad response to {!r}: {} {}, {!r}".format( + pageurl, + response.code, + response.reason, + response.getheader("Content-Type"), + ) + ) ob = json.loads(response.read()) - txns = ob.get('transactions') + txns = ob.get("transactions") if not txns: return for txn in txns: yield txn if len(txns) < 1000: return - query['rh'] = txns[-1]['r'] - 1 + query["rh"] = txns[-1]["r"] - 1 + def assetEquality(indexer, algod): - #ta = dict(algod) + # ta = dict(algod) errs = [] - #ibyaid = {r['asset-id']:r for r in indexer} - abyaid = {r['asset-id']:r for r in algod} - logger.debug('asset eq? i=%r a=%r', indexer, algod) + # ibyaid = {r['asset-id']:r for r in indexer} + abyaid = {r["asset-id"]: r for r in algod} + logger.debug("asset eq? i=%r a=%r", indexer, algod) for assetrec in indexer: - assetid = assetrec['asset-id'] - iv = assetrec.get('amount', 0) + assetid = assetrec["asset-id"] + iv = assetrec.get("amount", 0) arec = abyaid.pop(assetid, None) if arec is None: if iv == 0: - pass # ok + pass # ok else: - errs.append('asset={!r} indexer had {!r} but algod None'.format(assetid, assetrec)) + errs.append( + "asset={!r} indexer had {!r} but algod None".format( + assetid, assetrec + ) + ) else: - av = arec.get('amount', 0) + av = arec.get("amount", 0) if av != iv: - errs.append('asset={!r} indexer {!r} != algod {!r}'.format(assetid, assetrec, arec)) + errs.append( + "asset={!r} indexer {!r} != algod {!r}".format( + assetid, assetrec, arec + ) + ) for assetid, arec in abyaid.items(): - av = arec.get('amount', 0) + av = arec.get("amount", 0) if av != 0: - errs.append('asset={!r} indexer had None but algod {!r}'.format(assetid, arec)) + errs.append( + "asset={!r} indexer had None but algod {!r}".format(assetid, arec) + ) if not errs: return None - return ', '.join(errs) + return ", ".join(errs) + def deepeq(a, b, path=None, msg=None): if a is None: @@ -278,19 +327,19 @@ def deepeq(a, b, path=None, msg=None): onlyb = bk.difference(both) mp = [] if onlya: - mp.append('only in a {!r}'.format(sorted(onlya))) + mp.append("only in a {!r}".format(sorted(onlya))) if onlyb: - mp.append('only in b {!r}'.format(sorted(onlyb))) - msg.append(', '.join(mp)) + mp.append("only in b {!r}".format(sorted(onlyb))) + msg.append(", ".join(mp)) return False - for k,av in a.items(): + for k, av in a.items(): if path is not None and msg is not None: subpath = path + (k,) else: subpath = None if not deepeq(av, b.get(k), subpath, msg): if msg is not None: - msg.append('at {!r}'.format(subpath)) + msg.append("at {!r}".format(subpath)) return False return True if isinstance(a, list): @@ -298,65 +347,73 @@ def deepeq(a, b, path=None, msg=None): return False if len(a) != len(b): return False - for va,vb in zip(a,b): - if not deepeq(va,vb,path,msg): + for va, vb in zip(a, b): + if not deepeq(va, vb, path, msg): if msg is not None: - msg.append('{!r} != {!r}'.format(va,vb)) + msg.append("{!r} != {!r}".format(va, vb)) return False return True return a == b + def remove_indexer_only_fields(x): - x.pop('deleted', None) - x.pop('created-at-round', None) - x.pop('deleted-at-round', None) - x.pop('destroyed-at-round', None) - x.pop('optin-at-round', None) - x.pop('opted-in-at-round', None) - x.pop('opted-out-at-round', None) - x.pop('closeout-at-round', None) - x.pop('closed-out-at-round', None) - x.pop('closed-at-round', None) + x.pop("deleted", None) + x.pop("created-at-round", None) + x.pop("deleted-at-round", None) + x.pop("destroyed-at-round", None) + x.pop("optin-at-round", None) + x.pop("opted-in-at-round", None) + x.pop("opted-out-at-round", None) + x.pop("closeout-at-round", None) + x.pop("closed-out-at-round", None) + x.pop("closed-at-round", None) + def _dac(x): out = dict(x) remove_indexer_only_fields(out) return out + def dictifyAssetConfig(acfg): - return {x['index']:_dac(x) for x in acfg} + return {x["index"]: _dac(x) for x in acfg} + def _dap(x): out = dict(x) remove_indexer_only_fields(out) - out['params'] = dict(out['params']) - gs = out['params'].get('global-state') + out["params"] = dict(out["params"]) + gs = out["params"].get("global-state") if gs: - out['params']['global-state'] = {z['key']:z['value'] for z in gs} + out["params"]["global-state"] = {z["key"]: z["value"] for z in gs} return out + def dictifyAppParams(ap): # make a list of app params comparable by deepeq - return {x['id']:_dap(x) for x in ap} + return {x["id"]: _dap(x) for x in ap} + def dictifyAppLocal(al): out = {} for ent in al: ent = dict(ent) - appid = ent.pop('id') - kv = ent.get('key-value') + appid = ent.pop("id") + kv = ent.get("key-value") if kv: - ent['key-value'] = {x['key']:x['value'] for x in kv} + ent["key-value"] = {x["key"]: x["value"] for x in kv} remove_indexer_only_fields(ent) out[appid] = ent return out + # CheckContext error collector class ccerr: def __init__(self, errout): self.err = errout self.errors = [] self.ok = True + def __call__(self, msg): if not msg: return @@ -364,6 +421,7 @@ def __call__(self, msg): self.errors.append(msg) self.ok = False + class CheckContext: def __init__(self, err): self.err = err @@ -374,96 +432,138 @@ def __init__(self, err): self.lock = threading.Lock() def check(self, indexer_account, algod_account): - niceaddr = algod_account['address'] + niceaddr = algod_account["address"] address = algosdk.encoding.decode_address(niceaddr) xe = ccerr(self.err) - microalgos = algod_account['amount-without-pending-rewards'] - indexerAlgos = indexer_account['amount-without-pending-rewards'] + microalgos = algod_account["amount-without-pending-rewards"] + indexerAlgos = indexer_account["amount-without-pending-rewards"] if indexerAlgos == microalgos: - pass # still ok + pass # still ok else: - emsg = 'algod v={} i2 v={} '.format(microalgos, indexerAlgos) + emsg = "algod v={} i2 v={} ".format(microalgos, indexerAlgos) if address == reward_addr: - emsg += ' Rewards account' + emsg += " Rewards account" elif address == fee_addr: - emsg += ' Fee account' + emsg += " Fee account" xe(emsg) - assets = algod_account.get('assets') - i2assets = indexer_account.get('assets') + assets = algod_account.get("assets") + i2assets = indexer_account.get("assets") if i2assets: if assets: emsg = assetEquality(i2assets, assets) if emsg: - xe('{} {}\n'.format(niceaddr, emsg)) + xe("{} {}\n".format(niceaddr, emsg)) else: allzero = True nonzero = [] for assetrec in i2assets: - if assetrec.get('amount', 0) != 0: + if assetrec.get("amount", 0) != 0: nonzero.append(assetrec) allzero = False if not allzero: - xe('{} indexer has assets but not algod: {!r}\n'.format(niceaddr, nonzero)) + xe( + "{} indexer has assets but not algod: {!r}\n".format( + niceaddr, nonzero + ) + ) elif assets: allzero = True nonzero = [] for assetrec in assets: - if assetrec.get('amount',0) != 0: + if assetrec.get("amount", 0) != 0: allzero = False nonzero.append(assetrec) if not allzero: - emsg = '{} algod has assets but not indexer: {!r}\n'.format(niceaddr, nonzero) + emsg = "{} algod has assets but not indexer: {!r}\n".format( + niceaddr, nonzero + ) xe(emsg) - acfg = algod_account.get('created-assets') - i2acfg = indexer_account.get('created-assets') + acfg = algod_account.get("created-assets") + i2acfg = indexer_account.get("created-assets") # filter out deleted entries that indexer is showing to us if i2acfg: - i2acfg = list(filter(lambda x: x['params']['total'] != 0, i2acfg)) + i2acfg = list(filter(lambda x: x["params"]["total"] != 0, i2acfg)) if acfg: if i2acfg: indexerAcfg = dictifyAssetConfig(i2acfg) algodAcfg = dictifyAssetConfig(acfg) eqerr = [] if not deepeq(indexerAcfg, algodAcfg, (), eqerr): - xe('{} indexer and algod disagree on acfg, {}\nindexer={}\nalgod={}\n'.format(niceaddr, eqerr, json_pp(i2acfg), json_pp(acfg))) + xe( + "{} indexer and algod disagree on acfg, {}\nindexer={}\nalgod={}\n".format( + niceaddr, eqerr, json_pp(i2acfg), json_pp(acfg) + ) + ) else: - xe('{} algod has acfg but not indexer: {!r}\n'.format(niceaddr, acfg)) + xe("{} algod has acfg but not indexer: {!r}\n".format(niceaddr, acfg)) elif i2acfg: - xe('{} indexer has acfg but not algod: {!r}\n'.format(niceaddr, i2acfg)) - appparams = algod_account.get('created-apps') - i2apar = indexer_account.get('created-apps') + xe("{} indexer has acfg but not algod: {!r}\n".format(niceaddr, i2acfg)) + appparams = algod_account.get("created-apps") + i2apar = indexer_account.get("created-apps") # filter out deleted entries that indexer is showing to us if i2apar: - i2apar = list(filter(lambda x: x['params']['approval-program'] is not None and x['params']['clear-state-program'] is not None, i2apar)) + i2apar = list( + filter( + lambda x: x["params"]["approval-program"] is not None + and x["params"]["clear-state-program"] is not None, + i2apar, + ) + ) if appparams: if i2apar: i2appById = dictifyAppParams(i2apar) algodAppById = dictifyAppParams(appparams) - eqerr=[] - if not deepeq(i2appById, algodAppById,(),eqerr): - xe('{} indexer and algod disagree on created app, {}\nindexer={}\nalgod={}\n'.format(niceaddr, eqerr, json_pp(i2appById), json_pp(algodAppById))) + eqerr = [] + if not deepeq(i2appById, algodAppById, (), eqerr): + xe( + "{} indexer and algod disagree on created app, {}\nindexer={}\nalgod={}\n".format( + niceaddr, eqerr, json_pp(i2appById), json_pp(algodAppById) + ) + ) else: - xe('{} algod has apar but not indexer: {!r}\n'.format(niceaddr, appparams)) + xe( + "{} algod has apar but not indexer: {!r}\n".format( + niceaddr, appparams + ) + ) elif i2apar: - xe('{} indexer has apar but not algod: {!r}\n'.format(niceaddr, i2apar)) - applocal = algod_account.get('apps-local-state') - i2applocal = indexer_account.get('apps-local-state') + xe("{} indexer has apar but not algod: {!r}\n".format(niceaddr, i2apar)) + applocal = algod_account.get("apps-local-state") + i2applocal = indexer_account.get("apps-local-state") # filter out deleted entries that indexer is showing to us if i2applocal: - i2applocal = list(filter(lambda x: x['schema']['num-byte-slice'] != 0 or x['schema']['num-uint'] != 0, i2applocal)) + i2applocal = list( + filter( + lambda x: x["schema"]["num-byte-slice"] != 0 + or x["schema"]["num-uint"] != 0, + i2applocal, + ) + ) if applocal: if i2applocal: eqerr = [] ald = dictifyAppLocal(applocal) ild = dictifyAppLocal(i2applocal) if not deepeq(ald, ild, (), eqerr): - xe('{} indexer and algod disagree on app local, {}\nindexer={}\nalgod={}\n'.format(niceaddr, eqerr, json_pp(i2applocal), json_pp(applocal))) + xe( + "{} indexer and algod disagree on app local, {}\nindexer={}\nalgod={}\n".format( + niceaddr, eqerr, json_pp(i2applocal), json_pp(applocal) + ) + ) else: - xe('{} algod has app local but not indexer: {!r} '.format(niceaddr, applocal)) + xe( + "{} algod has app local but not indexer: {!r} ".format( + niceaddr, applocal + ) + ) elif i2applocal: - xe('{} indexer has app local but not algod: {!r} '.format(niceaddr, i2applocal)) + xe( + "{} indexer has app local but not algod: {!r} ".format( + niceaddr, i2applocal + ) + ) # TODO: warn about unchecked fields? pop checked fields and deepeq the rest? @@ -471,12 +571,15 @@ def check(self, indexer_account, algod_account): if xe.ok: self.match += 1 else: - self.err.write('{} indexer {!r}\n'.format(niceaddr, sorted(indexer_account.keys()))) + self.err.write( + "{} indexer {!r}\n".format(niceaddr, sorted(indexer_account.keys())) + ) self.neq += 1 - self.mismatches.append( (address, '\n'.join(xe.errors)) ) + self.mismatches.append((address, "\n".join(xe.errors))) def summary(self): - self.err.write('{} match {} neq\n'.format(self.match, self.neq)) + self.err.write("{} match {} neq\n".format(self.match, self.neq)) + # data/basics/userBalance.go AccountData # "onl":uint Status @@ -487,12 +590,12 @@ def jsonable(x, display=False): if x is None: return x if isinstance(x, dict): - return {str(jsonable(k, display)):jsonable(v, display) for k,v in x.items()} + return {str(jsonable(k, display)): jsonable(v, display) for k, v in x.items()} if isinstance(x, list): return [jsonable(e, display) for e in x] if isinstance(x, bytes): if display: - return 'b:' + base64.b64encode(x).decode() + return "b:" + base64.b64encode(x).decode() else: return base64.b64encode(x).decode() return x @@ -501,62 +604,76 @@ def jsonable(x, display=False): def json_pp(x): return json.dumps(jsonable(x, True), indent=2, sort_keys=True) + def b64_or_none(x): if x is None or not x: return None return base64.b64encode(x).decode() + def tvToApiTv(tv): - tt = tv[b'tt'] - if tt == 1: # bytes - return {'type':tt, 'bytes':tv[b'tb']} - return {'type':tt, 'uint':tv[b'ui']} + tt = tv[b"tt"] + if tt == 1: # bytes + return {"type": tt, "bytes": tv[b"tb"]} + return {"type": tt, "uint": tv[b"ui"]} + # convert from msgpack TealKeyValue to api TealKeyValueStore def tkvToTkvs(tkv): if not tkv: return None - return [{'key':k,'value':tvToApiTv(v)} for k,v in tkv.items()] + return [{"key": k, "value": tvToApiTv(v)} for k, v in tkv.items()] + # msgpack to api def schemaDecode(sch): if sch is None: return None return { - 'num-uint':sch.get(b'nui',0), - 'num-byte-slice':sch.get(b'nbs',0), + "num-uint": sch.get(b"nui", 0), + "num-byte-slice": sch.get(b"nbs", 0), } + def dmaybe(d, k, v): if v is None: return d[k] = v + def maybeb64(x): if x: return base64.b64encode(x).decode() return x + def token_addr_from_args(args): if args.algod: - addr = open(os.path.join(args.algod, 'algod.net'), 'rt').read().strip() - token = open(os.path.join(args.algod, 'algod.token'), 'rt').read().strip() + addr = open(os.path.join(args.algod, "algod.net"), "rt").read().strip() + token = open(os.path.join(args.algod, "algod.token"), "rt").read().strip() else: addr = args.algod_net token = args.algod_token - if not addr.startswith('http'): - addr = 'http://' + addr + if not addr.startswith("http"): + addr = "http://" + addr return token, addr + def compare(indexer_account, i2a_checker, algod, indexer, indexer_headers): - niceaddr = indexer_account['address'] + niceaddr = indexer_account["address"] if niceaddr in (reward_niceaddr, fee_niceaddr): return algod_account = algod.account_info(niceaddr) - if algod_account['round'] != indexer_account['round']: - indexer_account = indexerAccountFromAddr(indexer, niceaddr, blockround=algod_account['round'], headers=indexer_headers) + if algod_account["round"] != indexer_account["round"]: + indexer_account = indexerAccountFromAddr( + indexer, + niceaddr, + blockround=algod_account["round"], + headers=indexer_headers, + ) i2a_checker.check(indexer_account, algod_account) + def compare_thread(ia_queue, i2a_checker, algod, indexer, indexer_headers): while True: indexer_account = ia_queue.get() @@ -564,22 +681,24 @@ def compare_thread(ia_queue, i2a_checker, algod, indexer, indexer_headers): return compare(indexer_account, i2a_checker, algod, indexer, indexer_headers) + # decrement by one the big-endian number implicit in a byte string # crashes on [0,0,0, ...] def bytedec(bs): bs = list(bs) pos = len(bs) - 1 while bs[pos] == 0: - bs[pos] = 0xff - pos -= 1 # carry from previous position + bs[pos] = 0xFF + pos -= 1 # carry from previous position bs[pos] -= 1 return bytes(bs) + # for --shard a/b return address range (minaddr-1, maxaddr) # a in [1..b], e.g. --shard 1/16 .. 16/16 # may return (None, addr) or (addr, None) for first/last shard def shard_bounds(shardspec): - a,b = shardspec.split('/') + a, b = shardspec.split("/") a = int(a) b = int(b) chunk = (2**64) // b @@ -591,22 +710,23 @@ def shard_bounds(shardspec): if a == 1: minsplit = None else: - minsplit = struct.pack('>Q', chunk * (a-1)) - minsplit += bytes([0]*24) + minsplit = struct.pack(">Q", chunk * (a - 1)) + minsplit += bytes([0] * 24) minsplit = bytedec(minsplit) if a == b: maxsplit = None else: - maxsplit = struct.pack('>Q', chunk * a) - maxsplit += bytes([0]*24) + maxsplit = struct.pack(">Q", chunk * a) + maxsplit += bytes([0] * 24) return (minsplit, maxsplit) + def check_from_algod(args): global graceful_stop token, addr = token_addr_from_args(args) algod = AlgodClient(token, addr) if args.genesis or args.algod: - gpath = args.genesis or os.path.join(args.algod, 'genesis.json') + gpath = args.genesis or os.path.join(args.algod, "genesis.json") getGenesisVars(gpath) else: process_genesis(algod.algod_request("GET", "/genesis")) @@ -620,7 +740,7 @@ def check_from_algod(args): if minaddr is not None: gtaddr = algosdk.encoding.encode_address(minaddr) if args.indexer_token: - indexer_headers = {'X-Indexer-API-Token': token} + indexer_headers = {"X-Indexer-API-Token": token} lastlog = time.time() i2a_checker = CheckContext(sys.stderr) @@ -628,12 +748,20 @@ def check_from_algod(args): ia_queue = queue.Queue(maxsize=10) threads = [] for i in range(args.threads): - t = threading.Thread(target=compare_thread, args=(ia_queue, i2a_checker, algod, args.indexer, indexer_headers)) + t = threading.Thread( + target=compare_thread, + args=(ia_queue, i2a_checker, algod, args.indexer, indexer_headers), + ) t.start() threads.append(t) lastaddr = None - for indexer_account in indexerAccounts(args.indexer, addrlist=(args.accounts and args.accounts.split(',')), headers=indexer_headers, gtaddr=gtaddr): - lastaddr = indexer_account['address'] + for indexer_account in indexerAccounts( + args.indexer, + addrlist=(args.accounts and args.accounts.split(",")), + headers=indexer_headers, + gtaddr=gtaddr, + ): + lastaddr = indexer_account["address"] if maxaddr is not None: la = algosdk.encoding.decode_address(lastaddr) if la > maxaddr: @@ -644,35 +772,56 @@ def check_from_algod(args): now = time.time() if (now - lastlog) > 5: with i2a_checker.lock: - logger.info('%d match, %d neq, through about %s', i2a_checker.match, i2a_checker.neq, lastaddr) + logger.info( + "%d match, %d neq, through about %s", + i2a_checker.match, + i2a_checker.neq, + lastaddr, + ) lastlog = now for t in threads: - ia_queue.put(None) # signal end + ia_queue.put(None) # signal end for t in threads: t.join() if graceful_stop: - logger.info('last addr %s', lastaddr) + logger.info("last addr %s", lastaddr) return i2a_checker + def main(): import argparse + ap = argparse.ArgumentParser() - ap.add_argument('-d', '--algod', default=None, help='algorand data dir') - ap.add_argument('--algod-net', default=None, help='algod host:port') - ap.add_argument('--algod-token', default=None, help='algod token') - ap.add_argument('--genesis', default=None, help='path to genesis.json') - ap.add_argument('--limit', default=None, type=int, help='debug limit number of accoutns to dump') - ap.add_argument('--indexer', default=None, help='URL to indexer to fetch from') - ap.add_argument('--indexer-token', default=None, help='indexer API token') - ap.add_argument('--asset', default=None, help='filter on accounts possessing asset id') - ap.add_argument('--mismatches', default=10, type=int, help='max number of mismatches to show details on (0 for no limit)') - ap.add_argument('-q', '--quiet', default=False, action='store_true') - ap.add_argument('--verbose', default=False, action='store_true') - ap.add_argument('--accounts', help='comma separated list of accounts to test') - ap.add_argument('--ssl-no-validate', default=False, action='store_true') - ap.add_argument('--threads', default=4, type=int, help='number of request-compare threads to run') - ap.add_argument('--gtaddr', default=None, help='fetch accounts after this addr') - ap.add_argument('--shard', default=None, help='a/b for a in [1..b]') + ap.add_argument("-d", "--algod", default=None, help="algorand data dir") + ap.add_argument("--algod-net", default=None, help="algod host:port") + ap.add_argument("--algod-token", default=None, help="algod token") + ap.add_argument("--genesis", default=None, help="path to genesis.json") + ap.add_argument( + "--limit", default=None, type=int, help="debug limit number of accoutns to dump" + ) + ap.add_argument("--indexer", default=None, help="URL to indexer to fetch from") + ap.add_argument("--indexer-token", default=None, help="indexer API token") + ap.add_argument( + "--asset", default=None, help="filter on accounts possessing asset id" + ) + ap.add_argument( + "--mismatches", + default=10, + type=int, + help="max number of mismatches to show details on (0 for no limit)", + ) + ap.add_argument("-q", "--quiet", default=False, action="store_true") + ap.add_argument("--verbose", default=False, action="store_true") + ap.add_argument("--accounts", help="comma separated list of accounts to test") + ap.add_argument("--ssl-no-validate", default=False, action="store_true") + ap.add_argument( + "--threads", + default=4, + type=int, + help="number of request-compare threads to run", + ) + ap.add_argument("--gtaddr", default=None, help="fetch accounts after this addr") + ap.add_argument("--shard", default=None, help="a/b for a in [1..b]") args = ap.parse_args() if args.verbose: @@ -688,9 +837,11 @@ def main(): return 1 if args.ssl_no_validate: global ssl_no_validate - ssl_no_validate = SSLContext() # empty context doesn't validate; use for self-signed certs + ssl_no_validate = ( + SSLContext() + ) # empty context doesn't validate; use for self-signed certs if args.gtaddr and args.shard: - logger.error('--gtaddr and --shard are incompatible') + logger.error("--gtaddr and --shard are incompatible") return 1 out = sys.stdout err = sys.stderr @@ -700,62 +851,64 @@ def main(): i2a_checker.summary() mismatches = i2a_checker.mismatches if args.mismatches and len(mismatches) > args.mismatches: - mismatches = mismatches[:args.mismatches] + mismatches = mismatches[: args.mismatches] for addr, msg in mismatches: niceaddr = algosdk.encoding.encode_address(addr) if addr in (reward_addr, fee_addr): - logger.debug('skip %s', niceaddr) + logger.debug("skip %s", niceaddr) # we know accounting for the special addrs is different continue retval = 1 xaddr = base64.b16encode(addr).decode().lower() - err.write('\n{} \'\\x{}\'\n\t{}\n'.format(niceaddr, xaddr, msg)) + err.write("\n{} '\\x{}'\n\t{}\n".format(niceaddr, xaddr, msg)) tcount = 0 tmore = 0 - for txn in indexerAccountTxns(args.indexer, addr, limit=30, token=args.indexer_token): + for txn in indexerAccountTxns( + args.indexer, addr, limit=30, token=args.indexer_token + ): if tcount > 10: tmore += 1 continue tcount += 1 - sender = txn.pop('sender') - cround = txn.pop('confirmed-round') - intra = txn.pop('intra-round-offset') - parts = ['{}:{}'.format(cround, intra), 's={}'.format(sender)] - pay = txn.get('payment-transaction', None) + sender = txn.pop("sender") + cround = txn.pop("confirmed-round") + intra = txn.pop("intra-round-offset") + parts = ["{}:{}".format(cround, intra), "s={}".format(sender)] + pay = txn.get("payment-transaction", None) if pay: - receiver = pay.pop('receiver', None) - closeto = pay.pop('close-remainder-to', None) + receiver = pay.pop("receiver", None) + closeto = pay.pop("close-remainder-to", None) else: receiver = None closeto = None - axfer = txn.get('asset-transfer-transaction', None) + axfer = txn.get("asset-transfer-transaction", None) if axfer is not None: - asnd = axfer.pop('sender', None) - arcv = axfer.pop('receiver', None) - aclose = axfer.pop('close-to', None) + asnd = axfer.pop("sender", None) + arcv = axfer.pop("receiver", None) + aclose = axfer.pop("close-to", None) else: asnd = None arcv = None aclose = None if asnd: - parts.append('as={}'.format(asnd)) + parts.append("as={}".format(asnd)) if receiver: - parts.append('r={}'.format(receiver)) + parts.append("r={}".format(receiver)) if closeto: - parts.append('c={}'.format(closeto)) + parts.append("c={}".format(closeto)) if arcv: - parts.append('ar={}'.format(arcv)) + parts.append("ar={}".format(arcv)) if aclose: - parts.append('ac={}'.format(aclose)) + parts.append("ac={}".format(aclose)) # everything else parts.append(json.dumps(txn)) - err.write(' '.join(parts) + '\n') + err.write(" ".join(parts) + "\n") if tmore: - err.write('... and {} more\n'.format(tmore)) + err.write("... and {} more\n".format(tmore)) if retval == 0: - logger.info('validate_accounting OK') + logger.info("validate_accounting OK") return retval -if __name__ == '__main__': +if __name__ == "__main__": sys.exit(main()) From e6f6add91b722ccff5bae714c2981bd1bfff5352 Mon Sep 17 00:00:00 2001 From: Zeph Grunschlag Date: Fri, 29 Jul 2022 15:11:27 -0400 Subject: [PATCH 15/39] apply black to e2elive.py as well (#1154) --- misc/e2elive.py | 138 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 97 insertions(+), 41 deletions(-) diff --git a/misc/e2elive.py b/misc/e2elive.py index cbeaecf28..0d6fc45d1 100644 --- a/misc/e2elive.py +++ b/misc/e2elive.py @@ -22,16 +22,33 @@ logger = logging.getLogger(__name__) + def main(): start = time.time() import argparse + ap = argparse.ArgumentParser() - ap.add_argument('--keep-temps', default=False, action='store_true') - ap.add_argument('--indexer-bin', default=None, help='path to algorand-indexer binary, otherwise search PATH') - ap.add_argument('--indexer-port', default=None, type=int, help='port to run indexer on. defaults to random in [4000,30000]') - ap.add_argument('--connection-string', help='Use this connection string instead of attempting to manage a local database.') - ap.add_argument('--source-net', help='Path to test network directory containing Primary and other nodes. May be a tar file.') - ap.add_argument('--verbose', default=False, action='store_true') + ap.add_argument("--keep-temps", default=False, action="store_true") + ap.add_argument( + "--indexer-bin", + default=None, + help="path to algorand-indexer binary, otherwise search PATH", + ) + ap.add_argument( + "--indexer-port", + default=None, + type=int, + help="port to run indexer on. defaults to random in [4000,30000]", + ) + ap.add_argument( + "--connection-string", + help="Use this connection string instead of attempting to manage a local database.", + ) + ap.add_argument( + "--source-net", + help="Path to test network directory containing Primary and other nodes. May be a tar file.", + ) + ap.add_argument("--verbose", default=False, action="store_true") args = ap.parse_args() if args.verbose: logging.basicConfig(level=logging.DEBUG) @@ -41,9 +58,9 @@ def main(): sourcenet = args.source_net source_is_tar = False if not sourcenet: - e2edata = os.getenv('E2EDATA') - sourcenet = e2edata and os.path.join(e2edata, 'net') - if sourcenet and hassuffix(sourcenet, '.tar', '.tar.gz', '.tar.bz2', '.tar.xz'): + e2edata = os.getenv("E2EDATA") + sourcenet = e2edata and os.path.join(e2edata, "net") + if sourcenet and hassuffix(sourcenet, ".tar", ".tar.gz", ".tar.bz2", ".tar.xz"): source_is_tar = True tempdir = tempfile.mkdtemp() if not args.keep_temps: @@ -52,67 +69,99 @@ def main(): logger.info("leaving temp dir %r", tempdir) if not (source_is_tar or (sourcenet and os.path.isdir(sourcenet))): # fetch test data from S3 - bucket = 'algorand-testdata' + bucket = "algorand-testdata" import boto3 from botocore.config import Config from botocore import UNSIGNED - s3 = boto3.client('s3', config=Config(signature_version=UNSIGNED)) - tarname = 'net_done.tar.bz2' + + s3 = boto3.client("s3", config=Config(signature_version=UNSIGNED)) + tarname = "net_done.tar.bz2" tarpath = os.path.join(tempdir, tarname) - firstFromS3Prefix(s3, bucket, 'indexer/e2e4', tarname, outpath=tarpath) + firstFromS3Prefix(s3, bucket, "indexer/e2e4", tarname, outpath=tarpath) source_is_tar = True sourcenet = tarpath - tempnet = os.path.join(tempdir, 'net') + tempnet = os.path.join(tempdir, "net") if source_is_tar: - xrun(['tar', '-C', tempdir, '-x', '-f', sourcenet]) + xrun(["tar", "-C", tempdir, "-x", "-f", sourcenet]) else: - xrun(['rsync', '-a', sourcenet + '/', tempnet + '/']) - blockfiles = glob.glob(os.path.join(tempdir, 'net', 'Primary', '*', '*.block.sqlite')) + xrun(["rsync", "-a", sourcenet + "/", tempnet + "/"]) + blockfiles = glob.glob( + os.path.join(tempdir, "net", "Primary", "*", "*.block.sqlite") + ) lastblock = countblocks(blockfiles[0]) - #subprocess.run(['find', tempnet, '-type', 'f']) + # subprocess.run(['find', tempnet, '-type', 'f']) try: - xrun(['goal', 'network', 'start', '-r', tempnet]) + xrun(["goal", "network", "start", "-r", tempnet]) except Exception: - logger.error('failed to start private network, looking for node.log') + logger.error("failed to start private network, looking for node.log") for root, dirs, files in os.walk(tempnet): for f in files: - if f == 'node.log': + if f == "node.log": p = os.path.join(root, f) - logger.error('found node.log: {}'.format(p)) + logger.error("found node.log: {}".format(p)) with open(p) as nf: for line in nf: - logger.error(' {}'.format(line)) + logger.error(" {}".format(line)) raise - atexitrun(['goal', 'network', 'stop', '-r', tempnet]) + atexitrun(["goal", "network", "stop", "-r", tempnet]) psqlstring = ensure_test_db(args.connection_string, args.keep_temps) - algoddir = os.path.join(tempnet, 'Primary') - aiport = args.indexer_port or random.randint(4000,30000) - cmd = [indexer_bin, 'daemon', '--data-dir', tempdir, '-P', psqlstring, '--dev-mode', '--algod', algoddir, '--server', ':{}'.format(aiport)] - logger.debug("%s", ' '.join(map(repr,cmd))) + algoddir = os.path.join(tempnet, "Primary") + aiport = args.indexer_port or random.randint(4000, 30000) + cmd = [ + indexer_bin, + "daemon", + "--data-dir", + tempdir, + "-P", + psqlstring, + "--dev-mode", + "--algod", + algoddir, + "--server", + ":{}".format(aiport), + ] + logger.debug("%s", " ".join(map(repr, cmd))) indexerdp = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) indexerout = subslurp(indexerdp.stdout) indexerout.start() atexit.register(indexerdp.kill) time.sleep(0.2) - indexerurl = 'http://localhost:{}/'.format(aiport) - healthurl = indexerurl + 'health' + indexerurl = "http://localhost:{}/".format(aiport) + healthurl = indexerurl + "health" for attempt in range(20): (ok, json) = tryhealthurl(healthurl, args.verbose, waitforround=lastblock) if ok: - logger.debug('health round={} OK'.format(lastblock)) + logger.debug("health round={} OK".format(lastblock)) break time.sleep(0.5) if not ok: - logger.error('could not get indexer health, or did not reach round={}\n{}'.format(lastblock, json)) + logger.error( + "could not get indexer health, or did not reach round={}\n{}".format( + lastblock, json + ) + ) sys.stderr.write(indexerout.dump()) return 1 try: - logger.info('reached expected round={}'.format(lastblock)) - xrun(['python3', 'misc/validate_accounting.py', '--verbose', '--algod', algoddir, '--indexer', indexerurl], timeout=20) - xrun(['go', 'run', 'cmd/e2equeries/main.go', '-pg', psqlstring, '-q'], timeout=15) + logger.info("reached expected round={}".format(lastblock)) + xrun( + [ + "python3", + "misc/validate_accounting.py", + "--verbose", + "--algod", + algoddir, + "--indexer", + indexerurl, + ], + timeout=20, + ) + xrun( + ["go", "run", "cmd/e2equeries/main.go", "-pg", psqlstring, "-q"], timeout=15 + ) except Exception: sys.stderr.write(indexerout.dump()) raise @@ -121,12 +170,14 @@ def main(): return 0 + def hassuffix(x, *suffixes): for s in suffixes: if x.endswith(s): return True return False + def countblocks(path): db = sqlite3.connect(path) cursor = db.cursor() @@ -136,49 +187,54 @@ def countblocks(path): db.close() return row[0] + def tryhealthurl(healthurl, verbose=False, waitforround=100): try: response = urllib.request.urlopen(healthurl) if response.code != 200: return (False, "") raw = response.read() - logger.debug('health %r', raw) + logger.debug("health %r", raw) ob = json.loads(raw) - rt = ob.get('message') + rt = ob.get("message") if not rt: return (False, raw) return (int(rt) >= waitforround, raw) except Exception as e: if verbose: - logging.warning('GET %s %s', healthurl, e) + logging.warning("GET %s %s", healthurl, e) return (False, "") + class subslurp: # asynchronously accumulate stdout or stderr from a subprocess and hold it for debugging if something goes wrong def __init__(self, f): self.f = f self.buf = io.BytesIO() - self.gz = gzip.open(self.buf, 'wb') + self.gz = gzip.open(self.buf, "wb") self.l = threading.Lock() self.t = None + def run(self): for line in self.f: with self.l: if self.gz is None: return self.gz.write(line) + def dump(self): with self.l: self.gz.close() self.gz = None self.buf.seek(0) - r = gzip.open(self.buf, 'rt') + r = gzip.open(self.buf, "rt") return r.read() + def start(self): self.t = threading.Thread(target=self.run) self.t.daemon = True self.t.start() -if __name__ == '__main__': +if __name__ == "__main__": sys.exit(main()) From 66b8583c7aed33d672ad5da8063f7f175d4271c5 Mon Sep 17 00:00:00 2001 From: Zeph Grunschlag Date: Mon, 1 Aug 2022 10:07:59 -0400 Subject: [PATCH 16/39] Enhancement: More information about S3 keys searched for and Dockerfile that uses submodule instead of channel (#1151) * Eric's Dockerfile improvements * Update misc/e2elive.py --- misc/Dockerfile | 14 +++++--------- misc/e2elive.py | 7 ++++++- misc/util.py | 25 +++++++++++++++++++++++-- 3 files changed, 34 insertions(+), 12 deletions(-) diff --git a/misc/Dockerfile b/misc/Dockerfile index 6c5e5c5f4..a05639b2d 100644 --- a/misc/Dockerfile +++ b/misc/Dockerfile @@ -8,21 +8,17 @@ ENV HOME /opt ENV DEBIAN_FRONTEND noninteractive RUN apt-get update && apt-get install -y apt-utils curl git git-core bsdmainutils python3 python3-pip make bash libtool libboost-math-dev libffi-dev -# Install algod nightly binaries to the path -RUN mkdir -p /opt/algorand/{bin,data} -ADD https://github.com/algorand/go-algorand/raw/1e1474216421da27008726c44ebe0a5ba2fb6a08/cmd/updater/update.sh /opt/algorand/bin/update.sh -RUN chmod 755 /opt/algorand/bin/update.sh -WORKDIR /opt/algorand/bin -RUN ./update.sh -i -c nightly -p /opt/algorand/bin -d /opt/algorand/data -n -RUN find /opt/algorand -ENV PATH="/opt/algorand/bin:${PATH}" - # Setup files for test RUN mkdir -p /opt/go/indexer COPY . /opt/go/indexer WORKDIR /opt/go/indexer +RUN rm -f $HOME/go/bin/algod RUN rm /opt/go/indexer/cmd/algorand-indexer/algorand-indexer +WORKDIR /opt/go/indexer/third_party/go-algorand +RUN make install +WORKDIR /opt/go/indexer RUN make +ENV PATH="${HOME}/go/bin/:${PATH}" RUN pip3 install -r misc/requirements.txt ENV INDEXER_DATA="${HOME}/indexer/" diff --git a/misc/e2elive.py b/misc/e2elive.py index 0d6fc45d1..b34846094 100644 --- a/misc/e2elive.py +++ b/misc/e2elive.py @@ -77,7 +77,12 @@ def main(): s3 = boto3.client("s3", config=Config(signature_version=UNSIGNED)) tarname = "net_done.tar.bz2" tarpath = os.path.join(tempdir, tarname) - firstFromS3Prefix(s3, bucket, "indexer/e2e4", tarname, outpath=tarpath) + prefix = "indexer/e2e4" + success = firstFromS3Prefix(s3, bucket, prefix, tarname, outpath=tarpath) + if not success: + raise Exception( + f"failed to locate tarname={tarname} from AWS S3 path {bucket}/{prefix}" + ) source_is_tar = True sourcenet = tarpath tempnet = os.path.join(tempdir, "net") diff --git a/misc/util.py b/misc/util.py index d5dc2674e..19b79f24a 100644 --- a/misc/util.py +++ b/misc/util.py @@ -157,12 +157,30 @@ def ensure_test_db(connection_string, keep_temps=False): # whoever calls this will need to import boto and get the s3 client -def firstFromS3Prefix(s3, bucket, prefix, desired_filename, outdir=None, outpath=None): +def firstFromS3Prefix( + s3, bucket, prefix, desired_filename, outdir=None, outpath=None +) -> bool: + haystack = [] + found_needle = False + + def report(): + print( + f"""Hello from firstFromS3Prefix() !!!! + I finished searching for the needle {desired_filename} in the AWS S3 path {bucket}/{prefix}. + haystack={haystack} + len(haystack)={len(haystack)} + found_needle={found_needle} +""" + ) + + atexit.register(report) + response = s3.list_objects_v2(Bucket=bucket, Prefix=prefix, MaxKeys=50) if (not response.get("KeyCount")) or ("Contents" not in response): raise Exception("nothing found in s3://{}/{}".format(bucket, prefix)) for x in response["Contents"]: path = x["Key"] + haystack.append(path) _, fname = path.rsplit("/", 1) if fname == desired_filename: if outpath is None: @@ -171,5 +189,8 @@ def firstFromS3Prefix(s3, bucket, prefix, desired_filename, outdir=None, outpath outpath = os.path.join(outdir, desired_filename) logger.info("s3://%s/%s -> %s", bucket, x["Key"], outpath) s3.download_file(bucket, x["Key"], outpath) - return + found_needle = True + break + logger.warning("file not found in s3://{}/{}".format(bucket, prefix)) + return found_needle From 6b61b08bcbaed5a994b9a68ac0bf40c1b902cca4 Mon Sep 17 00:00:00 2001 From: Zeph Grunschlag Date: Wed, 3 Aug 2022 14:51:40 -0400 Subject: [PATCH 17/39] Bug-Fix: Implement BlockHdrCached + miscellany (#1162) --- .gitignore | 3 +++ Makefile | 2 +- misc/Dockerfile | 2 +- misc/docker-compose.yml | 1 + misc/e2elive.py | 11 +++++++++-- processor/eval/ledger_for_evaluator.go | 2 +- 6 files changed, 16 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 840278412..27f556509 100644 --- a/.gitignore +++ b/.gitignore @@ -37,3 +37,6 @@ coverage.txt # mac OS .DS_store + +# asdf +.tool-versions diff --git a/Makefile b/Makefile index 033df9807..8cb68a820 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ SRCPATH := $(shell pwd) VERSION := $(shell $(SRCPATH)/mule/scripts/compute_build_number.sh) OS_TYPE ?= $(shell $(SRCPATH)/mule/scripts/ostype.sh) -ARCH ?= $(shell $(SRCPATH)/mule/scripts/archtype.sh) +ARCH ?= $(shell $(SRCPATH)/mule/scripts/archtype.sh) PKG_DIR = $(SRCPATH)/tmp/node_pkgs/$(OS_TYPE)/$(ARCH)/$(VERSION) ifeq ($(OS_TYPE), darwin) ifeq ($(ARCH), arm64) diff --git a/misc/Dockerfile b/misc/Dockerfile index a05639b2d..5a02ad1db 100644 --- a/misc/Dockerfile +++ b/misc/Dockerfile @@ -23,4 +23,4 @@ RUN pip3 install -r misc/requirements.txt ENV INDEXER_DATA="${HOME}/indexer/" # Run test script -ENTRYPOINT ["/bin/bash", "-c", "sleep 5 && python3 misc/e2elive.py --connection-string \"$CONNECTION_STRING\" --indexer-bin /opt/go/indexer/cmd/algorand-indexer/algorand-indexer --indexer-port 9890"] +ENTRYPOINT ["/bin/bash", "-c", "sleep 5 && python3 misc/e2elive.py --connection-string \"$CONNECTION_STRING\" --s3-source-net \"$CI_E2E_FILENAME\" --indexer-bin /opt/go/indexer/cmd/algorand-indexer/algorand-indexer --indexer-port 9890"] diff --git a/misc/docker-compose.yml b/misc/docker-compose.yml index dcfacd3d6..bc12eb7d3 100644 --- a/misc/docker-compose.yml +++ b/misc/docker-compose.yml @@ -7,6 +7,7 @@ services: dockerfile: ./misc/Dockerfile environment: CONNECTION_STRING: "host=e2e-db port=5432 user=algorand password=algorand dbname=indexer_db sslmode=disable" + CI_E2E_FILENAME: "rel-nightly" e2e-db: image: "postgres:13-alpine" diff --git a/misc/e2elive.py b/misc/e2elive.py index b34846094..00d910e5f 100644 --- a/misc/e2elive.py +++ b/misc/e2elive.py @@ -48,6 +48,10 @@ def main(): "--source-net", help="Path to test network directory containing Primary and other nodes. May be a tar file.", ) + ap.add_argument( + "--s3-source-net", + help="AWS S3 key suffix to test network tarball containing Primary and other nodes. Must be a tar bz2 file.", + ) ap.add_argument("--verbose", default=False, action="store_true") args = ap.parse_args() if args.verbose: @@ -68,6 +72,11 @@ def main(): else: logger.info("leaving temp dir %r", tempdir) if not (source_is_tar or (sourcenet and os.path.isdir(sourcenet))): + tarname = args.s3_source_net + if not tarname: + raise Exception("Must provide either local or s3 network to run test against") + tarname = f"{tarname}.tar.bz2" + # fetch test data from S3 bucket = "algorand-testdata" import boto3 @@ -75,7 +84,6 @@ def main(): from botocore import UNSIGNED s3 = boto3.client("s3", config=Config(signature_version=UNSIGNED)) - tarname = "net_done.tar.bz2" tarpath = os.path.join(tempdir, tarname) prefix = "indexer/e2e4" success = firstFromS3Prefix(s3, bucket, prefix, tarname, outpath=tarpath) @@ -94,7 +102,6 @@ def main(): os.path.join(tempdir, "net", "Primary", "*", "*.block.sqlite") ) lastblock = countblocks(blockfiles[0]) - # subprocess.run(['find', tempnet, '-type', 'f']) try: xrun(["goal", "network", "start", "-r", tempnet]) except Exception: diff --git a/processor/eval/ledger_for_evaluator.go b/processor/eval/ledger_for_evaluator.go index 5000a8131..0a89d9e29 100644 --- a/processor/eval/ledger_for_evaluator.go +++ b/processor/eval/ledger_for_evaluator.go @@ -151,5 +151,5 @@ func (l LedgerForEvaluator) LatestTotals() (ledgercore.AccountTotals, error) { // BlockHdrCached is part of go-algorand's indexerLedgerForEval interface. func (l LedgerForEvaluator) BlockHdrCached(round basics.Round) (bookkeeping.BlockHeader, error) { - panic("not implemented") + return l.Ledger.BlockHdrCached(round) } From 8c49d86438418b8da4073db72d8298c70178f3a5 Mon Sep 17 00:00:00 2001 From: shiqizng <80276844+shiqizng@users.noreply.github.com> Date: Tue, 9 Aug 2022 12:49:30 -0400 Subject: [PATCH 18/39] Enhancement: add max int64 checks (#1166) --- api/error_messages.go | 1 + api/handlers.go | 85 ++++++- api/handlers_test.go | 273 ++++++++++++++++++++++ idb/postgres/postgres.go | 4 +- idb/postgres/postgres_integration_test.go | 49 ++++ 5 files changed, 406 insertions(+), 6 deletions(-) diff --git a/api/error_messages.go b/api/error_messages.go index 4c096f6b5..f5230c05f 100644 --- a/api/error_messages.go +++ b/api/error_messages.go @@ -38,6 +38,7 @@ const ( errZeroAddressAssetSenderRole = "searching transactions by zero address with asset sender role is not supported" errZeroAddressAssetCloseToRole = "searching transactions by zero address with asset close address role is not supported" ErrResultLimitReached = "Result limit exceeded" + errValueExceedingInt64 = "searching by round or application-id or asset-id or filter by value greater than 9223372036854775807 is not supported" ) var errUnknownAddressRole string diff --git a/api/handlers.go b/api/handlers.go index a59104827..a50342313 100644 --- a/api/handlers.go +++ b/api/handlers.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "math" "net/http" "strconv" "strings" @@ -51,6 +52,32 @@ type ServerImplementation struct { func validateTransactionFilter(filter *idb.TransactionFilter) error { var errorArr = make([]string, 0) + // Round or application-id or asset-id is greater than math.MaxInt64 + if filter.MinRound > math.MaxInt64 || filter.MaxRound > math.MaxInt64 || + (filter.Round != nil && *filter.Round > math.MaxInt64) || + filter.AssetID > math.MaxInt64 || filter.ApplicationID > math.MaxInt64 { + errorArr = append(errorArr, errValueExceedingInt64) + } + + // offset > math.MaxInt64 + if (filter.Offset != nil && *filter.Offset > math.MaxInt64) || + (filter.OffsetLT != nil && *filter.OffsetLT > math.MaxInt64) || + (filter.OffsetGT != nil && *filter.OffsetGT > math.MaxInt64) { + errorArr = append(errorArr, errValueExceedingInt64) + } + + // algos > math.MaxInt64 + if (filter.AlgosLT != nil && *filter.AlgosLT > math.MaxInt64) || + (filter.AlgosGT != nil && *filter.AlgosGT > math.MaxInt64) { + errorArr = append(errorArr, errValueExceedingInt64) + } + + // effectiveAmount > math.MaxInt64 + if (filter.EffectiveAmountLT != nil && *filter.EffectiveAmountLT > math.MaxInt64) || + (filter.EffectiveAmountGT != nil && *filter.EffectiveAmountGT > math.MaxInt64) { + errorArr = append(errorArr, errValueExceedingInt64) + } + // Round + min/max round if filter.Round != nil && (filter.MaxRound != 0 || filter.MinRound != 0) { errorArr = append(errorArr, errInvalidRoundAndMinMax) @@ -162,6 +189,9 @@ func (si *ServerImplementation) LookupAccountByID(ctx echo.Context, accountID st if err := si.verifyHandler("LookupAccountByID", ctx); err != nil { return badRequest(ctx, err.Error()) } + if params.Round != nil && uint64(*params.Round) > math.MaxInt64 { + return notFound(ctx, errValueExceedingInt64) + } addr, decodeErrors := decodeAddress(&accountID, "account-id", make([]string, 0)) if len(decodeErrors) != 0 { @@ -215,6 +245,9 @@ func (si *ServerImplementation) LookupAccountAppLocalStates(ctx echo.Context, ac if err := si.verifyHandler("LookupAccountAppLocalStates", ctx); err != nil { return badRequest(ctx, err.Error()) } + if params.ApplicationId != nil && uint64(*params.ApplicationId) > math.MaxInt64 { + return notFound(ctx, errValueExceedingInt64) + } search := generated.SearchForApplicationsParams{ Creator: &accountID, @@ -252,6 +285,9 @@ func (si *ServerImplementation) LookupAccountAssets(ctx echo.Context, accountID if err := si.verifyHandler("LookupAccountAssets", ctx); err != nil { return badRequest(ctx, err.Error()) } + if params.AssetId != nil && uint64(*params.AssetId) > math.MaxInt64 { + return notFound(ctx, errValueExceedingInt64) + } addr, errors := decodeAddress(&accountID, "account-id", make([]string, 0)) if len(errors) != 0 { @@ -298,7 +334,9 @@ func (si *ServerImplementation) LookupAccountCreatedApplications(ctx echo.Contex if err := si.verifyHandler("LookupAccountCreatedApplications", ctx); err != nil { return badRequest(ctx, err.Error()) } - + if params.ApplicationId != nil && uint64(*params.ApplicationId) > math.MaxInt64 { + return notFound(ctx, errValueExceedingInt64) + } search := generated.SearchForApplicationsParams{ Creator: &accountID, ApplicationId: params.ApplicationId, @@ -315,6 +353,9 @@ func (si *ServerImplementation) LookupAccountCreatedAssets(ctx echo.Context, acc if err := si.verifyHandler("LookupAccountCreatedAssets", ctx); err != nil { return badRequest(ctx, err.Error()) } + if params.AssetId != nil && uint64(*params.AssetId) > math.MaxInt64 { + return notFound(ctx, errValueExceedingInt64) + } search := generated.SearchForAssetsParams{ Creator: &accountID, @@ -332,6 +373,11 @@ func (si *ServerImplementation) SearchForAccounts(ctx echo.Context, params gener if err := si.verifyHandler("SearchForAccounts", ctx); err != nil { return badRequest(ctx, err.Error()) } + if (params.AssetId != nil && uint64(*params.AssetId) > math.MaxInt64) || + (params.ApplicationId != nil && uint64(*params.ApplicationId) > math.MaxInt64) || + (params.Round != nil && uint64(*params.Round) > math.MaxInt64) { + return notFound(ctx, errValueExceedingInt64) + } if !si.EnableAddressSearchRoundRewind && params.Round != nil { return badRequest(ctx, errMultiAcctRewind) @@ -352,7 +398,7 @@ func (si *ServerImplementation) SearchForAccounts(ctx echo.Context, params gener HasAppID: uintOrDefault(params.ApplicationId), EqualToAuthAddr: spendingAddr[:], IncludeDeleted: boolOrDefault(params.IncludeAll), - MaxResources: uint64(si.opts.MaxAPIResourcesPerAccount), + MaxResources: si.opts.MaxAPIResourcesPerAccount, } if params.Exclude != nil { @@ -408,6 +454,9 @@ func (si *ServerImplementation) LookupAccountTransactions(ctx echo.Context, acco if err := si.verifyHandler("LookupAccountTransactions", ctx); err != nil { return badRequest(ctx, err.Error()) } + if (params.AssetId != nil && uint64(*params.AssetId) > math.MaxInt64) || (params.Round != nil && uint64(*params.Round) > math.MaxInt64) { + return notFound(ctx, errValueExceedingInt64) + } // Check that a valid account was provided _, errors := decodeAddress(strPtr(accountID), "account-id", make([]string, 0)) if len(errors) != 0 { @@ -446,7 +495,9 @@ func (si *ServerImplementation) SearchForApplications(ctx echo.Context, params g if err := si.verifyHandler("SearchForApplications", ctx); err != nil { return badRequest(ctx, err.Error()) } - + if params.ApplicationId != nil && uint64(*params.ApplicationId) > math.MaxInt64 { + return notFound(ctx, errValueExceedingInt64) + } options, err := si.appParamsToApplicationQuery(params) if err != nil { return badRequest(ctx, err.Error()) @@ -476,6 +527,9 @@ func (si *ServerImplementation) LookupApplicationByID(ctx echo.Context, applicat if err := si.verifyHandler("LookupApplicationByID", ctx); err != nil { return badRequest(ctx, err.Error()) } + if uint64(applicationID) > math.MaxInt64 { + return notFound(ctx, errValueExceedingInt64) + } q := idb.ApplicationQuery{ ApplicationID: applicationID, IncludeDeleted: boolOrDefault(params.IncludeAll), @@ -507,6 +561,9 @@ func (si *ServerImplementation) LookupApplicationLogsByID(ctx echo.Context, appl if err := si.verifyHandler("LookupApplicationLogsByID", ctx); err != nil { return badRequest(ctx, err.Error()) } + if uint64(applicationID) > math.MaxInt64 { + return notFound(ctx, errValueExceedingInt64) + } searchParams := generated.SearchForTransactionsParams{ AssetId: nil, @@ -570,6 +627,9 @@ func (si *ServerImplementation) LookupAssetByID(ctx echo.Context, assetID uint64 if err := si.verifyHandler("LookupAssetByID", ctx); err != nil { return badRequest(ctx, err.Error()) } + if uint64(assetID) > math.MaxInt64 { + return notFound(ctx, errValueExceedingInt64) + } search := generated.SearchForAssetsParams{ AssetId: uint64Ptr(assetID), @@ -606,6 +666,9 @@ func (si *ServerImplementation) LookupAssetBalances(ctx echo.Context, assetID ui if err := si.verifyHandler("LookupAssetBalances", ctx); err != nil { return badRequest(ctx, err.Error()) } + if uint64(assetID) > math.MaxInt64 { + return notFound(ctx, errValueExceedingInt64) + } query := idb.AssetBalanceQuery{ AssetID: assetID, @@ -646,7 +709,9 @@ func (si *ServerImplementation) LookupAssetTransactions(ctx echo.Context, assetI if err := si.verifyHandler("LookupAssetTransactions", ctx); err != nil { return badRequest(ctx, err.Error()) } - + if uint64(assetID) > math.MaxInt64 || (params.Round != nil && *params.Round > math.MaxInt64) { + return notFound(ctx, errValueExceedingInt64) + } searchParams := generated.SearchForTransactionsParams{ AssetId: uint64Ptr(assetID), ApplicationId: nil, @@ -678,6 +743,9 @@ func (si *ServerImplementation) SearchForAssets(ctx echo.Context, params generat if err := si.verifyHandler("SearchForAssets", ctx); err != nil { return badRequest(ctx, err.Error()) } + if params.AssetId != nil && uint64(*params.AssetId) > math.MaxInt64 { + return notFound(ctx, errValueExceedingInt64) + } options, err := si.assetParamsToAssetQuery(params) if err != nil { @@ -707,6 +775,9 @@ func (si *ServerImplementation) LookupBlock(ctx echo.Context, roundNumber uint64 if err := si.verifyHandler("LookupBlock", ctx); err != nil { return badRequest(ctx, err.Error()) } + if uint64(roundNumber) > math.MaxInt64 { + return notFound(ctx, errValueExceedingInt64) + } blk, err := si.fetchBlock(ctx.Request().Context(), roundNumber) if errors.Is(err, idb.ErrorBlockNotFound) { @@ -765,6 +836,11 @@ func (si *ServerImplementation) SearchForTransactions(ctx echo.Context, params g if err := si.verifyHandler("SearchForTransactions", ctx); err != nil { return badRequest(ctx, err.Error()) } + if (params.AssetId != nil && uint64(*params.AssetId) > math.MaxInt64) || + (params.ApplicationId != nil && uint64(*params.ApplicationId) > math.MaxInt64) || + (params.Round != nil && *params.Round > math.MaxInt64) { + return notFound(ctx, errValueExceedingInt64) + } filter, err := si.transactionParamsToTransactionFilter(params) if err != nil { @@ -835,6 +911,7 @@ func notFound(ctx echo.Context, err string) error { func (si *ServerImplementation) fetchApplications(ctx context.Context, params idb.ApplicationQuery) ([]generated.Application, uint64, error) { var round uint64 apps := make([]generated.Application, 0) + // TODO: add check err := callWithTimeout(ctx, si.log, si.timeout, func(ctx context.Context) error { var results <-chan idb.ApplicationRow results, round = si.db.Applications(ctx, params) diff --git a/api/handlers_test.go b/api/handlers_test.go index cb667130f..0369e866c 100644 --- a/api/handlers_test.go +++ b/api/handlers_test.go @@ -279,6 +279,90 @@ func TestValidateTransactionFilter(t *testing.T) { errorContains: []string{ errZeroAddressAssetSenderRole, errZeroAddressAssetCloseToRole}, }, + { + name: "Round > math.MaxInt64", + filter: idb.TransactionFilter{ + Round: uint64Ptr(math.MaxInt64 + 1), + }, + errorContains: []string{errValueExceedingInt64}, + }, + { + name: "MinRound > math.MaxInt64", + filter: idb.TransactionFilter{ + MinRound: uint64(math.MaxInt64 + 1), + }, + errorContains: []string{errValueExceedingInt64}, + }, + { + name: "MaxRound > math.MaxInt64", + filter: idb.TransactionFilter{ + MaxRound: uint64(math.MaxInt64 + 1), + }, + errorContains: []string{errValueExceedingInt64}, + }, + { + name: "application-id > math.MaxInt64", + filter: idb.TransactionFilter{ + ApplicationID: math.MaxInt64 + 1, + }, + errorContains: []string{errValueExceedingInt64}, + }, + { + name: "asset-id > math.MaxInt64", + filter: idb.TransactionFilter{ + AssetID: math.MaxInt64 + 1, + }, + errorContains: []string{errValueExceedingInt64}, + }, + { + name: "offset > math.MaxInt64", + filter: idb.TransactionFilter{ + Offset: uint64Ptr(uint64(math.MaxInt64 + 1)), + }, + errorContains: []string{errValueExceedingInt64}, + }, + { + name: "offsetLT > math.MaxInt64", + filter: idb.TransactionFilter{ + OffsetLT: uint64Ptr(uint64(math.MaxInt64 + 1)), + }, + errorContains: []string{errValueExceedingInt64}, + }, + { + name: "offsetGT > math.MaxInt64", + filter: idb.TransactionFilter{ + OffsetGT: uint64Ptr(uint64(math.MaxInt64 + 1)), + }, + errorContains: []string{errValueExceedingInt64}, + }, + { + name: "algosLT > math.MaxInt64", + filter: idb.TransactionFilter{ + AlgosLT: uint64Ptr(uint64(math.MaxInt64 + 1)), + }, + errorContains: []string{errValueExceedingInt64}, + }, + { + name: "algosGT > math.MaxInt64", + filter: idb.TransactionFilter{ + AlgosGT: uint64Ptr(uint64(math.MaxInt64 + 1)), + }, + errorContains: []string{errValueExceedingInt64}, + }, + { + name: "effectiveAmountLT > math.MaxInt64", + filter: idb.TransactionFilter{ + EffectiveAmountLT: uint64Ptr(uint64(math.MaxInt64 + 1)), + }, + errorContains: []string{errValueExceedingInt64}, + }, + { + name: "effectiveAmountGT > math.MaxInt64", + filter: idb.TransactionFilter{ + EffectiveAmountGT: uint64Ptr(uint64(math.MaxInt64 + 1)), + }, + errorContains: []string{errValueExceedingInt64}, + }, } for _, test := range tests { @@ -966,3 +1050,192 @@ func TestApplicationLimits(t *testing.T) { }) } } + +func TestBigNumbers(t *testing.T) { + + testcases := []struct { + name string + errString string + callHandler func(ctx echo.Context, si ServerImplementation) error + }{ + { + name: "SearchForTransactionsInvalidRound", + errString: errValueExceedingInt64, + callHandler: func(ctx echo.Context, si ServerImplementation) error { + return si.SearchForTransactions(ctx, generated.SearchForTransactionsParams{Round: uint64Ptr(uint64(math.MaxInt64 + 1))}) + }, + }, + { + name: "SearchForTransactionsInvalidAppID", + errString: errValueExceedingInt64, + callHandler: func(ctx echo.Context, si ServerImplementation) error { + return si.SearchForTransactions(ctx, generated.SearchForTransactionsParams{ApplicationId: uint64Ptr(uint64(math.MaxInt64 + 1))}) + }, + }, + { + name: "SearchForTransactionsInvalidAssetID", + errString: errValueExceedingInt64, + callHandler: func(ctx echo.Context, si ServerImplementation) error { + return si.SearchForTransactions(ctx, generated.SearchForTransactionsParams{AssetId: uint64Ptr(uint64(math.MaxInt64 + 1))}) + }, + }, + { + name: "LookupAccountTransactionsInvalidRound", + errString: errValueExceedingInt64, + callHandler: func(ctx echo.Context, si ServerImplementation) error { + return si.LookupAccountTransactions(ctx, "", generated.LookupAccountTransactionsParams{Round: uint64Ptr(uint64(math.MaxInt64 + 1))}) + }, + }, + { + name: "LookupAccountTransactionsInvalidAssetID", + errString: errValueExceedingInt64, + callHandler: func(ctx echo.Context, si ServerImplementation) error { + return si.LookupAccountTransactions(ctx, "", generated.LookupAccountTransactionsParams{AssetId: uint64Ptr(uint64(math.MaxInt64 + 1))}) + }, + }, + { + name: "LookupAssetTransactionsInvalidAssetID", + errString: errValueExceedingInt64, + callHandler: func(ctx echo.Context, si ServerImplementation) error { + return si.LookupAssetTransactions(ctx, math.MaxInt64+1, generated.LookupAssetTransactionsParams{}) + }, + }, + { + name: "LookupAssetTransactionsInvalidRound", + errString: errValueExceedingInt64, + callHandler: func(ctx echo.Context, si ServerImplementation) error { + return si.LookupAssetTransactions(ctx, 12, generated.LookupAssetTransactionsParams{Round: uint64Ptr(uint64(math.MaxInt64 + 1))}) + }, + }, + { + name: "LookupApplicaitonLogsByID", + errString: errValueExceedingInt64, + callHandler: func(ctx echo.Context, si ServerImplementation) error { + return si.LookupApplicationLogsByID(ctx, math.MaxInt64+1, generated.LookupApplicationLogsByIDParams{}) + }, + }, + { + name: "LookupApplicationByID", + errString: errValueExceedingInt64, + callHandler: func(ctx echo.Context, si ServerImplementation) error { + return si.LookupApplicationByID(ctx, math.MaxInt64+1, generated.LookupApplicationByIDParams{}) + }, + }, + { + name: "SearchForApplications", + errString: errValueExceedingInt64, + callHandler: func(ctx echo.Context, si ServerImplementation) error { + return si.SearchForApplications(ctx, generated.SearchForApplicationsParams{ApplicationId: uint64Ptr(uint64(math.MaxInt64 + 1))}) + }, + }, + { + name: "SearchForAccountInvalidRound", + errString: errValueExceedingInt64, + callHandler: func(ctx echo.Context, si ServerImplementation) error { + return si.SearchForAccounts(ctx, generated.SearchForAccountsParams{Round: uint64Ptr(uint64(math.MaxInt64 + 1))}) + }, + }, + { + name: "SearchForAccountInvalidAppID", + errString: errValueExceedingInt64, + callHandler: func(ctx echo.Context, si ServerImplementation) error { + return si.SearchForAccounts(ctx, generated.SearchForAccountsParams{ApplicationId: uint64Ptr(uint64(math.MaxInt64 + 1))}) + }, + }, + { + name: "SearchForAccountInvalidAssetID", + errString: errValueExceedingInt64, + callHandler: func(ctx echo.Context, si ServerImplementation) error { + return si.SearchForAccounts(ctx, generated.SearchForAccountsParams{AssetId: uint64Ptr(uint64(math.MaxInt64 + 1))}) + }, + }, + { + name: "LookupAccountByID", + errString: errValueExceedingInt64, + callHandler: func(ctx echo.Context, si ServerImplementation) error { + return si.LookupAccountByID(ctx, + "PBH2JQNVP5SBXLTOWNHHPGU6FUMBVS4ZDITPK5RA5FG2YIIFS6UYEMFM2Y", + generated.LookupAccountByIDParams{Round: uint64Ptr(uint64(math.MaxInt64 + 1))}) + }, + }, + { + name: "SearchForAssets", + errString: errValueExceedingInt64, + callHandler: func(ctx echo.Context, si ServerImplementation) error { + return si.SearchForAssets(ctx, generated.SearchForAssetsParams{AssetId: uint64Ptr(uint64(math.MaxInt64 + 1))}) + }, + }, + { + name: "LookupAssetByID", + errString: errValueExceedingInt64, + callHandler: func(ctx echo.Context, si ServerImplementation) error { + return si.LookupAssetByID(ctx, math.MaxInt64+1, generated.LookupAssetByIDParams{}) + }, + }, + { + name: "LookupAssetBalances", + errString: errValueExceedingInt64, + callHandler: func(ctx echo.Context, si ServerImplementation) error { + return si.LookupAssetBalances(ctx, math.MaxInt64+1, generated.LookupAssetBalancesParams{}) + }, + }, + { + name: "LookupBlock", + errString: errValueExceedingInt64, + callHandler: func(ctx echo.Context, si ServerImplementation) error { + return si.LookupBlock(ctx, math.MaxInt64+1) + }, + }, + { + name: "LookupAccountAppLocalStates", + errString: errValueExceedingInt64, + callHandler: func(ctx echo.Context, si ServerImplementation) error { + return si.LookupAccountAppLocalStates(ctx, "10", generated.LookupAccountAppLocalStatesParams{ApplicationId: uint64Ptr(uint64(math.MaxInt64 + 1))}) + }, + }, + { + name: "LookupAccountAssets", + errString: errValueExceedingInt64, + callHandler: func(ctx echo.Context, si ServerImplementation) error { + return si.LookupAccountAssets(ctx, "10", generated.LookupAccountAssetsParams{AssetId: uint64Ptr(uint64(math.MaxInt64 + 1))}) + }, + }, + { + name: "LookupAccountCreatedApplications", + errString: errValueExceedingInt64, + callHandler: func(ctx echo.Context, si ServerImplementation) error { + return si.LookupAccountCreatedApplications(ctx, "10", generated.LookupAccountCreatedApplicationsParams{ApplicationId: uint64Ptr(uint64(math.MaxInt64 + 1))}) + }, + }, + { + name: "LookupAccountCreatedAssets", + errString: errValueExceedingInt64, + callHandler: func(ctx echo.Context, si ServerImplementation) error { + return si.LookupAccountCreatedAssets(ctx, "10", generated.LookupAccountCreatedAssetsParams{AssetId: uint64Ptr(uint64(math.MaxInt64 + 1))}) + }, + }, + } + + for _, tc := range testcases { + t.Run(tc.name, func(t *testing.T) { + + // Make a mock indexer. + mockIndexer := &mocks.IndexerDb{} + + si := testServerImplementation(mockIndexer) + + // Setup context... + e := echo.New() + req := httptest.NewRequest(http.MethodGet, "/", nil) + rec1 := httptest.NewRecorder() + c := e.NewContext(req, rec1) + + // call handler + tc.callHandler(c, *si) + assert.Equal(t, http.StatusNotFound, rec1.Code) + bodyStr := rec1.Body.String() + require.Contains(t, bodyStr, tc.errString) + + }) + } +} diff --git a/idb/postgres/postgres.go b/idb/postgres/postgres.go index bb77594ac..400886cb3 100644 --- a/idb/postgres/postgres.go +++ b/idb/postgres/postgres.go @@ -582,12 +582,12 @@ func buildTransactionQuery(tf idb.TransactionFilter) (query string, whereArgs [] partNumber++ } if tf.AssetAmountGT != nil { - whereParts = append(whereParts, fmt.Sprintf("(t.txn -> 'txn' -> 'aamt')::bigint > $%d", partNumber)) + whereParts = append(whereParts, fmt.Sprintf("(t.txn -> 'txn' -> 'aamt')::numeric(20) > $%d", partNumber)) whereArgs = append(whereArgs, *tf.AssetAmountGT) partNumber++ } if tf.AssetAmountLT != nil { - whereParts = append(whereParts, fmt.Sprintf("(t.txn -> 'txn' -> 'aamt')::bigint < $%d", partNumber)) + whereParts = append(whereParts, fmt.Sprintf("(t.txn -> 'txn' -> 'aamt')::numeric(20) < $%d", partNumber)) whereArgs = append(whereArgs, *tf.AssetAmountLT) partNumber++ } diff --git a/idb/postgres/postgres_integration_test.go b/idb/postgres/postgres_integration_test.go index 69e093dd4..e2abb3d78 100644 --- a/idb/postgres/postgres_integration_test.go +++ b/idb/postgres/postgres_integration_test.go @@ -2254,3 +2254,52 @@ func TestIndexerDb_GetAccounts(t *testing.T) { }) } } + +// Test that AddBlock() writes to `txn_participation` table. +func TestTransactionFilterAssetAmount(t *testing.T) { + block := test.MakeGenesisBlock() + db, shutdownFunc, proc, l := setupIdb(t, test.MakeGenesis()) + defer shutdownFunc() + defer l.Close() + + // AssetAmountLT + txnA := test.MakeAssetConfigTxn(0, 100, 0, false, "test", "test", "", test.AccountA) + txnB := test.MakeAssetOptInTxn(1, test.AccountB) + txnC := test.MakeAssetTransferTxn(1, 10, test.AccountA, test.AccountB, basics.Address{}) + + block, err := test.MakeBlockForTxns(block.BlockHeader, &txnA, &txnB, &txnC) + require.NoError(t, err) + err = proc.Process(&rpcs.EncodedBlockCert{Block: block}) + require.NoError(t, err) + + // query + filter := idb.TransactionFilter{AssetAmountLT: uint64Ptr(uint64(math.MaxInt64 + 1))} + rowsCh, _ := db.Transactions(context.Background(), filter) + + row, ok := <-rowsCh + require.True(t, ok) + require.NoError(t, row.Error) + require.NotNil(t, row.Txn) + assert.Equal(t, txnC, *row.Txn) + + // AssetAmountGT + txnD := test.MakeAssetConfigTxn(0, math.MaxUint64, 0, false, "test2", "test2", "", test.AccountA) + txnE := test.MakeAssetOptInTxn(4, test.AccountB) + txnF := test.MakeAssetTransferTxn(4, math.MaxUint64, test.AccountA, test.AccountB, basics.Address{}) + + block, err = test.MakeBlockForTxns(block.BlockHeader, &txnD, &txnE, &txnF) + require.NoError(t, err) + err = proc.Process(&rpcs.EncodedBlockCert{Block: block}) + require.NoError(t, err) + + // query + filter = idb.TransactionFilter{AssetAmountGT: uint64Ptr(uint64(math.MaxInt64 + 1))} + rowsCh, _ = db.Transactions(context.Background(), filter) + + row, ok = <-rowsCh + require.True(t, ok) + require.NoError(t, row.Error) + require.NotNil(t, row.Txn) + assert.Equal(t, txnF, *row.Txn) + +} From dc8f994530ad84ac84d3a21ad7b8965e06e718f8 Mon Sep 17 00:00:00 2001 From: Eric Warehime Date: Wed, 10 Aug 2022 12:41:59 -0700 Subject: [PATCH 19/39] state proofs: Indexer Support for State Proofs (#1002) Adds API support to the Indexer for State Proof Transactions and header fields. Co-authored-by: Will Winder Co-authored-by: Will Winder --- api/converter_utils.go | 98 +++++ api/generated/common/routes.go | 321 ++++++++------- api/generated/common/types.go | 143 +++++++ api/generated/v2/routes.go | 387 +++++++++--------- api/generated/v2/types.go | 143 +++++++ api/handlers.go | 47 ++- api/handlers_e2e_test.go | 2 +- api/handlers_test.go | 93 ++++- api/indexer.oas2.json | 248 ++++++++++- api/indexer.oas3.yml | 255 +++++++++++- api/test_resources/state_proof.response | 1 + api/test_resources/state_proof.txn | Bin 0 -> 61925 bytes api/test_resources/stpf_block.block | Bin 0 -> 8365 bytes api/test_resources/stpf_block_response.json | 1 + cmd/block-generator/generator/generate.go | 6 +- go.mod | 3 +- go.sum | 4 +- .../internal/encoding/encoding_test.go | 2 +- idb/postgres/internal/encoding/types.go | 2 +- idb/postgres/internal/writer/writer.go | 3 +- idb/txn_type_enum.go | 2 + misc/e2elive.py | 1 - third_party/go-algorand | 2 +- 23 files changed, 1387 insertions(+), 377 deletions(-) create mode 100644 api/test_resources/state_proof.response create mode 100644 api/test_resources/state_proof.txn create mode 100644 api/test_resources/stpf_block.block create mode 100644 api/test_resources/stpf_block_response.json diff --git a/api/converter_utils.go b/api/converter_utils.go index 43f728ccc..1baf2381b 100644 --- a/api/converter_utils.go +++ b/api/converter_utils.go @@ -304,6 +304,7 @@ func signedTxnWithAdToTransaction(stxn *transactions.SignedTxnWithAD, extra rowD var assetFreeze *generated.TransactionAssetFreeze var assetTransfer *generated.TransactionAssetTransfer var application *generated.TransactionApplication + var stateProof *generated.TransactionStateProof switch stxn.Txn.Type { case protocol.PaymentTx: @@ -407,6 +408,102 @@ func signedTxnWithAdToTransaction(stxn *transactions.SignedTxnWithAD, extra rowD } application = &a + case protocol.StateProofTx: + partPath := make([][]byte, len(stxn.Txn.StateProof.PartProofs.Path)) + for idx, part := range stxn.Txn.StateProof.PartProofs.Path { + digest := make([]byte, len(part)) + copy(digest, part) + partPath[idx] = digest + } + + sigProofPath := make([][]byte, len(stxn.Txn.StateProof.SigProofs.Path)) + for idx, sigPart := range stxn.Txn.StateProof.SigProofs.Path { + digest := make([]byte, len(sigPart)) + copy(digest, sigPart) + sigProofPath[idx] = digest + } + + // We need to iterate through these in order, to make sure our responses are deterministic + keys := make([]uint64, len(stxn.Txn.StateProof.Reveals)) + elems := 0 + for key := range stxn.Txn.StateProof.Reveals { + keys[elems] = key + elems++ + } + sort.Slice(keys, func(i, j int) bool { return keys[i] < keys[j] }) + reveals := make([]generated.StateProofReveal, len(stxn.Txn.StateProof.Reveals)) + for _, key := range keys { + revToConv := stxn.Txn.StateProof.Reveals[key] + commitment := revToConv.Part.PK.Commitment[:] + falconSig := []byte(revToConv.SigSlot.Sig.Signature) + verifyKey := revToConv.SigSlot.Sig.VerifyingKey.PublicKey[:] + proofPath := make([][]byte, len(revToConv.SigSlot.Sig.Proof.Path)) + for idx, proofPart := range revToConv.SigSlot.Sig.Proof.Path { + proofPath[idx] = proofPart + } + + reveals[key] = generated.StateProofReveal{ + Participant: &generated.StateProofParticipant{ + Verifier: &generated.StateProofVerifier{ + Commitment: &commitment, + KeyLifetime: uint64Ptr(revToConv.Part.PK.KeyLifetime), + }, + Weight: uint64Ptr(revToConv.Part.Weight), + }, + Position: uint64Ptr(key), + SigSlot: &generated.StateProofSigSlot{ + LowerSigWeight: uint64Ptr(revToConv.SigSlot.L), + Signature: &generated.StateProofSignature{ + FalconSignature: &falconSig, + MerkleArrayIndex: uint64Ptr(revToConv.SigSlot.Sig.VectorCommitmentIndex), + Proof: &generated.MerkleArrayProof{ + HashFactory: &generated.HashFactory{ + HashType: uint64Ptr(uint64(revToConv.SigSlot.Sig.Proof.HashFactory.HashType)), + }, + Path: &proofPath, + TreeDepth: uint64Ptr(uint64(revToConv.SigSlot.Sig.Proof.TreeDepth)), + }, + VerifyingKey: &verifyKey, + }, + }, + } + } + proof := generated.StateProof{ + PartProofs: &generated.MerkleArrayProof{ + HashFactory: &generated.HashFactory{ + HashType: uint64Ptr(uint64(stxn.Txn.StateProof.PartProofs.HashFactory.HashType)), + }, + Path: &partPath, + TreeDepth: uint64Ptr(uint64(stxn.Txn.StateProof.PartProofs.TreeDepth)), + }, + Reveals: &reveals, + SaltVersion: uint64Ptr(uint64(stxn.Txn.StateProof.MerkleSignatureSaltVersion)), + SigCommit: byteSliceOmitZeroPtr(stxn.Txn.StateProof.SigCommit), + SigProofs: &generated.MerkleArrayProof{ + HashFactory: &generated.HashFactory{ + HashType: uint64Ptr(uint64(stxn.Txn.StateProof.SigProofs.HashFactory.HashType)), + }, + Path: &sigProofPath, + TreeDepth: uint64Ptr(uint64(stxn.Txn.StateProof.SigProofs.TreeDepth)), + }, + SignedWeight: uint64Ptr(stxn.Txn.StateProof.SignedWeight), + PositionsToReveal: &stxn.Txn.StateProof.PositionsToReveal, + } + + message := generated.StateProofMessage{ + BlockHeadersCommitment: &stxn.Txn.Message.BlockHeadersCommitment, + FirstAttestedRound: uint64Ptr(stxn.Txn.Message.FirstAttestedRound), + LatestAttestedRound: uint64Ptr(stxn.Txn.Message.LastAttestedRound), + LnProvenWeight: uint64Ptr(stxn.Txn.Message.LnProvenWeight), + VotersCommitment: &stxn.Txn.Message.VotersCommitment, + } + + proofTxn := generated.TransactionStateProof{ + Message: &message, + StateProof: &proof, + StateProofType: uint64Ptr(uint64(stxn.Txn.StateProofType)), + } + stateProof = &proofTxn } var localStateDelta *[]generated.AccountStateDelta @@ -486,6 +583,7 @@ func signedTxnWithAdToTransaction(stxn *transactions.SignedTxnWithAD, extra rowD AssetTransferTransaction: assetTransfer, PaymentTransaction: payment, KeyregTransaction: keyreg, + StateProofTransaction: stateProof, ClosingAmount: uint64Ptr(stxn.ClosingAmount.Raw), ConfirmedRound: uint64Ptr(extra.Round), IntraRoundOffset: uint64Ptr(uint64(extra.Intra)), diff --git a/api/generated/common/routes.go b/api/generated/common/routes.go index 149111cd8..5e464d873 100644 --- a/api/generated/common/routes.go +++ b/api/generated/common/routes.go @@ -71,159 +71,174 @@ func RegisterHandlers(router interface { // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", } // GetSwagger returns the Swagger specification corresponding to the generated code diff --git a/api/generated/common/types.go b/api/generated/common/types.go index 42f346880..98c27448e 100644 --- a/api/generated/common/types.go +++ b/api/generated/common/types.go @@ -330,6 +330,9 @@ type Block struct { // \[seed\] Sortition seed. Seed []byte `json:"seed"` + // Tracks the status of state proofs. + StateProofTracking *[]StateProofTracking `json:"state-proof-tracking,omitempty"` + // \[ts\] Block creation timestamp in seconds since eposh Timestamp uint64 `json:"timestamp"` @@ -426,6 +429,13 @@ type EvalDeltaKeyValue struct { Value EvalDelta `json:"value"` } +// HashFactory defines model for HashFactory. +type HashFactory struct { + + // \[t\] + HashType *uint64 `json:"hash-type,omitempty"` +} + // Hashtype defines model for Hashtype. type Hashtype string @@ -442,6 +452,17 @@ type HealthCheck struct { Version string `json:"version"` } +// MerkleArrayProof defines model for MerkleArrayProof. +type MerkleArrayProof struct { + HashFactory *HashFactory `json:"hash-factory,omitempty"` + + // \[pth\] + Path *[][]byte `json:"path,omitempty"` + + // \[td\] + TreeDepth *uint64 `json:"tree-depth,omitempty"` +} + // MiniAssetHolding defines model for MiniAssetHolding. type MiniAssetHolding struct { Address string `json:"address"` @@ -464,6 +485,107 @@ type OnCompletion string // StateDelta defines model for StateDelta. type StateDelta []EvalDeltaKeyValue +// StateProof defines model for StateProof. +type StateProof struct { + PartProofs *MerkleArrayProof `json:"part-proofs,omitempty"` + + // \[pr\] Sequence of reveal positions. + PositionsToReveal *[]uint64 `json:"positions-to-reveal,omitempty"` + + // \[r\] Note that this is actually stored as a map[uint64] - Reveal in the actual msgp + Reveals *[]StateProofReveal `json:"reveals,omitempty"` + + // \[v\] Salt version of the merkle signature. + SaltVersion *uint64 `json:"salt-version,omitempty"` + + // \[c\] + SigCommit *[]byte `json:"sig-commit,omitempty"` + SigProofs *MerkleArrayProof `json:"sig-proofs,omitempty"` + + // \[w\] + SignedWeight *uint64 `json:"signed-weight,omitempty"` +} + +// StateProofMessage defines model for StateProofMessage. +type StateProofMessage struct { + + // \[b\] + BlockHeadersCommitment *[]byte `json:"block-headers-commitment,omitempty"` + + // \[f\] + FirstAttestedRound *uint64 `json:"first-attested-round,omitempty"` + + // \[l\] + LatestAttestedRound *uint64 `json:"latest-attested-round,omitempty"` + + // \[P\] + LnProvenWeight *uint64 `json:"ln-proven-weight,omitempty"` + + // \[v\] + VotersCommitment *[]byte `json:"voters-commitment,omitempty"` +} + +// StateProofParticipant defines model for StateProofParticipant. +type StateProofParticipant struct { + Verifier *StateProofVerifier `json:"verifier,omitempty"` + + // \[w\] + Weight *uint64 `json:"weight,omitempty"` +} + +// StateProofReveal defines model for StateProofReveal. +type StateProofReveal struct { + Participant *StateProofParticipant `json:"participant,omitempty"` + + // The position in the signature and participants arrays corresponding to this entry. + Position *uint64 `json:"position,omitempty"` + SigSlot *StateProofSigSlot `json:"sig-slot,omitempty"` +} + +// StateProofSigSlot defines model for StateProofSigSlot. +type StateProofSigSlot struct { + + // \[l\] The total weight of signatures in the lower-numbered slots. + LowerSigWeight *uint64 `json:"lower-sig-weight,omitempty"` + Signature *StateProofSignature `json:"signature,omitempty"` +} + +// StateProofSignature defines model for StateProofSignature. +type StateProofSignature struct { + FalconSignature *[]byte `json:"falcon-signature,omitempty"` + MerkleArrayIndex *uint64 `json:"merkle-array-index,omitempty"` + Proof *MerkleArrayProof `json:"proof,omitempty"` + + // \[vkey\] + VerifyingKey *[]byte `json:"verifying-key,omitempty"` +} + +// StateProofTracking defines model for StateProofTracking. +type StateProofTracking struct { + + // \[n\] Next round for which we will accept a state proof transaction. + NextRound *uint64 `json:"next-round,omitempty"` + + // \[t\] The total number of microalgos held by the online accounts during the StateProof round. + OnlineTotalWeight *uint64 `json:"online-total-weight,omitempty"` + + // State Proof Type. Note the raw object uses map with this as key. + Type *uint64 `json:"type,omitempty"` + + // \[v\] Root of a vector commitment containing online accounts that will help sign the proof. + VotersCommitment *[]byte `json:"voters-commitment,omitempty"` +} + +// StateProofVerifier defines model for StateProofVerifier. +type StateProofVerifier struct { + + // \[cmt\] Represents the root of the vector commitment tree. + Commitment *[]byte `json:"commitment,omitempty"` + + // \[lf\] Key lifetime. + KeyLifetime *uint64 `json:"key-lifetime,omitempty"` +} + // StateSchema defines model for StateSchema. type StateSchema struct { @@ -619,6 +741,12 @@ type Transaction struct { // Validation signature associated with some data. Only one of the signatures should be provided. Signature *TransactionSignature `json:"signature,omitempty"` + // Fields for a state proof transaction. + // + // Definition: + // data/transactions/stateproof.go : StateProofTxnFields + StateProofTransaction *TransactionStateProof `json:"state-proof-transaction,omitempty"` + // \[type\] Indicates what type of transaction this is. Different types have different fields. // // Valid types, and where their fields are stored: @@ -628,6 +756,7 @@ type Transaction struct { // * \[axfer\] asset-transfer-transaction // * \[afrz\] asset-freeze-transaction // * \[appl\] application-transaction + // * \[stpf\] state-proof-transaction TxType string `json:"tx-type"` } @@ -829,6 +958,20 @@ type TransactionSignatureMultisigSubsignature struct { Signature *[]byte `json:"signature,omitempty"` } +// TransactionStateProof defines model for TransactionStateProof. +type TransactionStateProof struct { + Message *StateProofMessage `json:"message,omitempty"` + + // \[sp\] represents a state proof. + // + // Definition: + // crypto/stateproof/structs.go : StateProof + StateProof *StateProof `json:"state-proof,omitempty"` + + // \[sptype\] Type of the state proof. Integer representing an entry defined in protocol/stateproof.go + StateProofType *uint64 `json:"state-proof-type,omitempty"` +} + // AccountId defines model for account-id. type AccountId string diff --git a/api/generated/v2/routes.go b/api/generated/v2/routes.go index 25216387b..6992a5ab4 100644 --- a/api/generated/v2/routes.go +++ b/api/generated/v2/routes.go @@ -1748,192 +1748,207 @@ func RegisterHandlers(router interface { // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", } // GetSwagger returns the Swagger specification corresponding to the generated code diff --git a/api/generated/v2/types.go b/api/generated/v2/types.go index de4ff4a9c..9b93af62a 100644 --- a/api/generated/v2/types.go +++ b/api/generated/v2/types.go @@ -330,6 +330,9 @@ type Block struct { // \[seed\] Sortition seed. Seed []byte `json:"seed"` + // Tracks the status of state proofs. + StateProofTracking *[]StateProofTracking `json:"state-proof-tracking,omitempty"` + // \[ts\] Block creation timestamp in seconds since eposh Timestamp uint64 `json:"timestamp"` @@ -426,6 +429,13 @@ type EvalDeltaKeyValue struct { Value EvalDelta `json:"value"` } +// HashFactory defines model for HashFactory. +type HashFactory struct { + + // \[t\] + HashType *uint64 `json:"hash-type,omitempty"` +} + // Hashtype defines model for Hashtype. type Hashtype string @@ -442,6 +452,17 @@ type HealthCheck struct { Version string `json:"version"` } +// MerkleArrayProof defines model for MerkleArrayProof. +type MerkleArrayProof struct { + HashFactory *HashFactory `json:"hash-factory,omitempty"` + + // \[pth\] + Path *[][]byte `json:"path,omitempty"` + + // \[td\] + TreeDepth *uint64 `json:"tree-depth,omitempty"` +} + // MiniAssetHolding defines model for MiniAssetHolding. type MiniAssetHolding struct { Address string `json:"address"` @@ -464,6 +485,107 @@ type OnCompletion string // StateDelta defines model for StateDelta. type StateDelta []EvalDeltaKeyValue +// StateProof defines model for StateProof. +type StateProof struct { + PartProofs *MerkleArrayProof `json:"part-proofs,omitempty"` + + // \[pr\] Sequence of reveal positions. + PositionsToReveal *[]uint64 `json:"positions-to-reveal,omitempty"` + + // \[r\] Note that this is actually stored as a map[uint64] - Reveal in the actual msgp + Reveals *[]StateProofReveal `json:"reveals,omitempty"` + + // \[v\] Salt version of the merkle signature. + SaltVersion *uint64 `json:"salt-version,omitempty"` + + // \[c\] + SigCommit *[]byte `json:"sig-commit,omitempty"` + SigProofs *MerkleArrayProof `json:"sig-proofs,omitempty"` + + // \[w\] + SignedWeight *uint64 `json:"signed-weight,omitempty"` +} + +// StateProofMessage defines model for StateProofMessage. +type StateProofMessage struct { + + // \[b\] + BlockHeadersCommitment *[]byte `json:"block-headers-commitment,omitempty"` + + // \[f\] + FirstAttestedRound *uint64 `json:"first-attested-round,omitempty"` + + // \[l\] + LatestAttestedRound *uint64 `json:"latest-attested-round,omitempty"` + + // \[P\] + LnProvenWeight *uint64 `json:"ln-proven-weight,omitempty"` + + // \[v\] + VotersCommitment *[]byte `json:"voters-commitment,omitempty"` +} + +// StateProofParticipant defines model for StateProofParticipant. +type StateProofParticipant struct { + Verifier *StateProofVerifier `json:"verifier,omitempty"` + + // \[w\] + Weight *uint64 `json:"weight,omitempty"` +} + +// StateProofReveal defines model for StateProofReveal. +type StateProofReveal struct { + Participant *StateProofParticipant `json:"participant,omitempty"` + + // The position in the signature and participants arrays corresponding to this entry. + Position *uint64 `json:"position,omitempty"` + SigSlot *StateProofSigSlot `json:"sig-slot,omitempty"` +} + +// StateProofSigSlot defines model for StateProofSigSlot. +type StateProofSigSlot struct { + + // \[l\] The total weight of signatures in the lower-numbered slots. + LowerSigWeight *uint64 `json:"lower-sig-weight,omitempty"` + Signature *StateProofSignature `json:"signature,omitempty"` +} + +// StateProofSignature defines model for StateProofSignature. +type StateProofSignature struct { + FalconSignature *[]byte `json:"falcon-signature,omitempty"` + MerkleArrayIndex *uint64 `json:"merkle-array-index,omitempty"` + Proof *MerkleArrayProof `json:"proof,omitempty"` + + // \[vkey\] + VerifyingKey *[]byte `json:"verifying-key,omitempty"` +} + +// StateProofTracking defines model for StateProofTracking. +type StateProofTracking struct { + + // \[n\] Next round for which we will accept a state proof transaction. + NextRound *uint64 `json:"next-round,omitempty"` + + // \[t\] The total number of microalgos held by the online accounts during the StateProof round. + OnlineTotalWeight *uint64 `json:"online-total-weight,omitempty"` + + // State Proof Type. Note the raw object uses map with this as key. + Type *uint64 `json:"type,omitempty"` + + // \[v\] Root of a vector commitment containing online accounts that will help sign the proof. + VotersCommitment *[]byte `json:"voters-commitment,omitempty"` +} + +// StateProofVerifier defines model for StateProofVerifier. +type StateProofVerifier struct { + + // \[cmt\] Represents the root of the vector commitment tree. + Commitment *[]byte `json:"commitment,omitempty"` + + // \[lf\] Key lifetime. + KeyLifetime *uint64 `json:"key-lifetime,omitempty"` +} + // StateSchema defines model for StateSchema. type StateSchema struct { @@ -619,6 +741,12 @@ type Transaction struct { // Validation signature associated with some data. Only one of the signatures should be provided. Signature *TransactionSignature `json:"signature,omitempty"` + // Fields for a state proof transaction. + // + // Definition: + // data/transactions/stateproof.go : StateProofTxnFields + StateProofTransaction *TransactionStateProof `json:"state-proof-transaction,omitempty"` + // \[type\] Indicates what type of transaction this is. Different types have different fields. // // Valid types, and where their fields are stored: @@ -628,6 +756,7 @@ type Transaction struct { // * \[axfer\] asset-transfer-transaction // * \[afrz\] asset-freeze-transaction // * \[appl\] application-transaction + // * \[stpf\] state-proof-transaction TxType string `json:"tx-type"` } @@ -829,6 +958,20 @@ type TransactionSignatureMultisigSubsignature struct { Signature *[]byte `json:"signature,omitempty"` } +// TransactionStateProof defines model for TransactionStateProof. +type TransactionStateProof struct { + Message *StateProofMessage `json:"message,omitempty"` + + // \[sp\] represents a state proof. + // + // Definition: + // crypto/stateproof/structs.go : StateProof + StateProof *StateProof `json:"state-proof,omitempty"` + + // \[sptype\] Type of the state proof. Integer representing an entry defined in protocol/stateproof.go + StateProofType *uint64 `json:"state-proof-type,omitempty"` +} + // AccountId defines model for account-id. type AccountId string diff --git a/api/handlers.go b/api/handlers.go index a50342313..060950476 100644 --- a/api/handlers.go +++ b/api/handlers.go @@ -6,6 +6,7 @@ import ( "fmt" "math" "net/http" + "sort" "strconv" "strings" "time" @@ -14,6 +15,7 @@ import ( log "github.com/sirupsen/logrus" "github.com/algorand/go-algorand/data/basics" + "github.com/algorand/go-algorand/protocol" "github.com/algorand/indexer/accounting" "github.com/algorand/indexer/api/generated/common" @@ -1127,19 +1129,40 @@ func (si *ServerImplementation) fetchBlock(ctx context.Context, round uint64) (g UpgradePropose: strPtr(string(blockHeader.UpgradePropose)), } + // order these so they're deterministic + orderedTrackingTypes := make([]protocol.StateProofType, len(blockHeader.StateProofTracking)) + trackingArray := make([]generated.StateProofTracking, len(blockHeader.StateProofTracking)) + elems := 0 + for key := range blockHeader.StateProofTracking { + orderedTrackingTypes[elems] = key + elems++ + } + sort.Slice(orderedTrackingTypes, func(i, j int) bool { return orderedTrackingTypes[i] < orderedTrackingTypes[j] }) + for i := 0; i < len(orderedTrackingTypes); i++ { + stpfTracking := blockHeader.StateProofTracking[orderedTrackingTypes[i]] + thing1 := generated.StateProofTracking{ + NextRound: uint64Ptr(uint64(stpfTracking.StateProofNextRound)), + Type: uint64Ptr(uint64(orderedTrackingTypes[i])), + VotersCommitment: byteSliceOmitZeroPtr(stpfTracking.StateProofVotersCommitment), + OnlineTotalWeight: uint64Ptr(stpfTracking.StateProofOnlineTotalWeight.Raw), + } + trackingArray[orderedTrackingTypes[i]] = thing1 + } + ret = generated.Block{ - GenesisHash: blockHeader.GenesisHash[:], - GenesisId: blockHeader.GenesisID, - PreviousBlockHash: blockHeader.Branch[:], - Rewards: &rewards, - Round: uint64(blockHeader.Round), - Seed: blockHeader.Seed[:], - Timestamp: uint64(blockHeader.TimeStamp), - Transactions: nil, - TransactionsRoot: blockHeader.TxnCommitments.NativeSha512_256Commitment[:], - TxnCounter: uint64Ptr(blockHeader.TxnCounter), - UpgradeState: &upgradeState, - UpgradeVote: &upgradeVote, + GenesisHash: blockHeader.GenesisHash[:], + GenesisId: blockHeader.GenesisID, + PreviousBlockHash: blockHeader.Branch[:], + Rewards: &rewards, + Round: uint64(blockHeader.Round), + Seed: blockHeader.Seed[:], + StateProofTracking: &trackingArray, + Timestamp: uint64(blockHeader.TimeStamp), + Transactions: nil, + TransactionsRoot: blockHeader.TxnCommitments.NativeSha512_256Commitment[:], + TxnCounter: uint64Ptr(blockHeader.TxnCounter), + UpgradeState: &upgradeState, + UpgradeVote: &upgradeVote, } results := make([]generated.Transaction, 0) diff --git a/api/handlers_e2e_test.go b/api/handlers_e2e_test.go index cc6922f52..cceb97596 100644 --- a/api/handlers_e2e_test.go +++ b/api/handlers_e2e_test.go @@ -1030,7 +1030,7 @@ func TestKeyregTransactionWithStateProofKeys(t *testing.T) { var selectionPK crypto.VRFVerifier selectionPK[0] = 1 - var stateProofPK merklesignature.Verifier + var stateProofPK merklesignature.Commitment stateProofPK[0] = 1 txn := transactions.SignedTxnWithAD{ diff --git a/api/handlers_test.go b/api/handlers_test.go index 0369e866c..3a89f1231 100644 --- a/api/handlers_test.go +++ b/api/handlers_test.go @@ -5,6 +5,7 @@ import ( "encoding/base64" "encoding/json" "fmt" + "github.com/algorand/go-algorand/rpcs" "io/ioutil" "math" "net/http" @@ -399,6 +400,15 @@ func loadTransactionFromFile(path string) generated.Transaction { return ret } +func loadBlockFromFile(path string) generated.Block { + data := loadResourceFileOrPanic(path) + var ret generated.Block + if err := json.Unmarshal(data, &ret); err != nil { + panic(fmt.Sprintf("Failed to build block from file: %s", path)) + } + return ret +} + func TestFetchTransactions(t *testing.T) { // Add in txnRows (with TxnBytes to parse), verify that they are properly serialized to generated.TransactionResponse tests := []struct { @@ -609,6 +619,15 @@ func TestFetchTransactions(t *testing.T) { loadTransactionFromFile("test_resources/app_call_inner_acfg.response"), }, }, + { + name: "State Proof Txn", + txnBytes: [][]byte{ + loadResourceFileOrPanic("test_resources/state_proof.txn"), + }, + response: []generated.Transaction{ + loadTransactionFromFile("test_resources/state_proof.response"), + }, + }, } // use for the brach below and createTxn helper func to add a new test case @@ -621,8 +640,8 @@ func TestFetchTransactions(t *testing.T) { response []generated.Transaction created uint64 }{ - name: "Key Registration with state proof key", - txnBytes: [][]byte{createTxn(t, "test_resources/keyregwithsprfkey.txn")}, + name: "State Proof Txn", + txnBytes: [][]byte{loadResourceFileOrPanic("test_resources/state_proof.txn")}, }) } @@ -735,7 +754,7 @@ func createTxn(t *testing.T, target string) []byte { var selectionPK crypto.VRFVerifier selectionPK[0] = 1 - var sprfkey merklesignature.Verifier + var sprfkey merklesignature.Commitment sprfkey[0] = 1 stxnad := transactions.SignedTxnWithAD{ @@ -1235,7 +1254,75 @@ func TestBigNumbers(t *testing.T) { assert.Equal(t, http.StatusNotFound, rec1.Code) bodyStr := rec1.Body.String() require.Contains(t, bodyStr, tc.errString) + }) + } +} + +func TestFetchBlock(t *testing.T) { + testcases := []struct { + name string + blockBytes []byte + expected generated.Block + created uint64 + }{ + { + name: "State Proof Block", + blockBytes: loadResourceFileOrPanic("test_resources/stpf_block.block"), + expected: loadBlockFromFile("test_resources/stpf_block_response.json"), + }, + } + for _, tc := range testcases { + // Mock backend + mockIndexer := &mocks.IndexerDb{} + si := testServerImplementation(mockIndexer) + si.timeout = 1 * time.Second + + roundTime := time.Now() + roundTime64 := uint64(roundTime.Unix()) + + t.Run(tc.name, func(t *testing.T) { + blk := new(rpcs.EncodedBlockCert) + err := protocol.Decode(tc.blockBytes, blk) + require.NoError(t, err) + txnRows := make([]idb.TxnRow, len(blk.Block.Payset)) + for idx, stxn := range blk.Block.Payset { + txnRows[idx] = idb.TxnRow{ + Round: 1, + Intra: 2, + RoundTime: roundTime, + Txn: &stxn.SignedTxnWithAD, + AssetID: tc.created, + Extra: idb.TxnExtra{ + AssetCloseAmount: 0, + }, + Error: nil, + } + } + // bookkeeping.BlockHeader, []idb.TxnRow, error + mockIndexer. + On("GetBlock", mock.Anything, mock.Anything, mock.Anything). + Return(blk.Block.BlockHeader, txnRows, nil) + + blkOutput, err := si.fetchBlock(context.Background(), 1) + require.NoError(t, err) + actualStr, _ := json.Marshal(blkOutput) + fmt.Printf("%s\n", actualStr) + + // Set RoundTime which is overridden in the mock above + if tc.expected.Transactions != nil { + for i := range *tc.expected.Transactions { + actual := (*blkOutput.Transactions)[i] + (*tc.expected.Transactions)[i].RoundTime = &roundTime64 + if (*tc.expected.Transactions)[i].InnerTxns != nil { + for j := range *(*tc.expected.Transactions)[i].InnerTxns { + (*(*tc.expected.Transactions)[i].InnerTxns)[j].RoundTime = &roundTime64 + } + } + assert.EqualValues(t, (*tc.expected.Transactions)[i], actual) + } + } + assert.EqualValues(t, tc.expected, blkOutput) }) } } diff --git a/api/indexer.oas2.json b/api/indexer.oas2.json index 525eeab61..1b94c4d46 100644 --- a/api/indexer.oas2.json +++ b/api/indexer.oas2.json @@ -1483,6 +1483,13 @@ "type": "string", "format": "byte" }, + "state-proof-tracking": { + "description": "Tracks the status of state proofs.", + "type": "array", + "items": { + "$ref": "#/definitions/StateProofTracking" + } + }, "timestamp": { "description": "\\[ts\\] Block creation timestamp in seconds since eposh", "type": "integer" @@ -1778,7 +1785,8 @@ "asset-freeze-transaction", "asset-transfer-transaction", "keyreg-transaction", - "payment-transaction" + "payment-transaction", + "state-proof-transaction" ], "properties": { "application-transaction": { @@ -1793,6 +1801,9 @@ "asset-transfer-transaction": { "$ref": "#/definitions/TransactionAssetTransfer" }, + "state-proof-transaction": { + "$ref": "#/definitions/TransactionStateProof" + }, "auth-addr": { "description": "\\[sgnr\\] this is included with signed transactions when the signing address does not equal the sender. The backend can use this to ensure that auth addr is equal to the accounts auth addr.", "type": "string", @@ -1893,7 +1904,7 @@ "$ref": "#/definitions/TransactionSignature" }, "tx-type": { - "description": "\\[type\\] Indicates what type of transaction this is. Different types have different fields.\n\nValid types, and where their fields are stored:\n* \\[pay\\] payment-transaction\n* \\[keyreg\\] keyreg-transaction\n* \\[acfg\\] asset-config-transaction\n* \\[axfer\\] asset-transfer-transaction\n* \\[afrz\\] asset-freeze-transaction\n* \\[appl\\] application-transaction", + "description": "\\[type\\] Indicates what type of transaction this is. Different types have different fields.\n\nValid types, and where their fields are stored:\n* \\[pay\\] payment-transaction\n* \\[keyreg\\] keyreg-transaction\n* \\[acfg\\] asset-config-transaction\n* \\[axfer\\] asset-transfer-transaction\n* \\[afrz\\] asset-freeze-transaction\n* \\[appl\\] application-transaction\n* \\[stpf\\] state-proof-transaction", "type": "string", "enum": [ "pay", @@ -1901,7 +1912,8 @@ "acfg", "axfer", "afrz", - "appl" + "appl", + "stpf" ], "x-algorand-format": "tx-type-enum" }, @@ -2041,6 +2053,24 @@ } } }, + "TransactionStateProof": { + "description": "Fields for a state proof transaction. \n\nDefinition:\ndata/transactions/stateproof.go : StateProofTxnFields", + "type": "object", + "properties": { + "state-proof-type": { + "description": "\\[sptype\\] Type of the state proof. Integer representing an entry defined in protocol/stateproof.go", + "type": "integer", + "x-algorand-format": "uint64" + }, + "state-proof": { + "$ref": "#/definitions/StateProof" + }, + "message": { + "$ref": "#/definitions/StateProofMessage", + "description": "\\[spmsg\\]" + } + } + }, "TransactionAssetTransfer": { "description": "Fields for an asset transfer transaction.\n\nDefinition:\ndata/transactions/asset.go : AssetTransferTxnFields", "type": "object", @@ -2228,6 +2258,215 @@ "format": "byte" } } + }, + "StateProof": { + "description": "\\[sp\\] represents a state proof.\n\nDefinition:\ncrypto/stateproof/structs.go : StateProof", + "type": "object", + "properties": { + "sig-commit": { + "description": "\\[c\\]", + "type": "string", + "format": "byte" + }, + "signed-weight": { + "description": "\\[w\\]", + "type": "integer", + "x-algorand-format": "uint64" + }, + "sig-proofs": { + "description": "\\[S\\]", + "$ref": "#/definitions/MerkleArrayProof" + }, + "part-proofs": { + "description": "\\[P\\]", + "$ref": "#/definitions/MerkleArrayProof" + }, + "salt-version": { + "description": "\\[v\\] Salt version of the merkle signature.", + "type": "integer" + }, + "reveals": { + "type": "array", + "description": "\\[r\\] Note that this is actually stored as a map[uint64] - Reveal in the actual msgp", + "items": { + "$ref": "#/definitions/StateProofReveal" + } + }, + "positions-to-reveal": { + "description": "\\[pr\\] Sequence of reveal positions.", + "type": "array", + "items": { + "type": "integer", + "x-algorand-format": "uint64" + } + } + } + }, + "StateProofMessage": { + "type": "object", + "properties": { + "block-headers-commitment": { + "description": "\\[b\\]", + "type": "string", + "format": "byte" + }, + "voters-commitment": { + "description": "\\[v\\]", + "type": "string", + "format": "byte" + }, + "ln-proven-weight": { + "description": "\\[P\\]", + "type": "integer", + "x-algorand-format": "uint64" + }, + "first-attested-round": { + "description": "\\[f\\]", + "type": "integer", + "x-algorand-format": "uint64" + }, + "latest-attested-round": { + "description": "\\[l\\]", + "type": "integer", + "x-algorand-format": "uint64" + } + } + }, + "StateProofReveal": { + "type": "object", + "properties": { + "position": { + "description": "The position in the signature and participants arrays corresponding to this entry.", + "type": "integer", + "x-algorand-format": "uint64" + }, + "sig-slot": { + "description": "\\[s\\]", + "$ref": "#/definitions/StateProofSigSlot" + }, + "participant": { + "description": "\\[p\\]", + "$ref": "#/definitions/StateProofParticipant" + } + } + }, + "StateProofSigSlot": { + "type": "object", + "properties": { + "signature": { + "description": "", + "$ref": "#/definitions/StateProofSignature" + }, + "lower-sig-weight": { + "description": "\\[l\\] The total weight of signatures in the lower-numbered slots.", + "type": "integer", + "x-algorand-format": "uint64" + } + } + }, + "StateProofSignature": { + "type": "object", + "properties": { + "falcon-signature": { + "type": "string", + "format": "byte" + }, + "merkle-array-index": { + "type": "integer", + "x-algorand-foramt": "uint64" + }, + "proof": { + "$ref": "#/definitions/MerkleArrayProof" + }, + "verifying-key": { + "description": "\\[vkey\\]", + "type": "string", + "format": "byte" + } + } + }, + "StateProofParticipant": { + "type": "object", + "properties": { + "verifier": { + "description": "\\[p\\]", + "$ref": "#/definitions/StateProofVerifier" + }, + "weight": { + "description": "\\[w\\]", + "type": "integer", + "x-algorand-format": "uint64" + } + } + }, + "StateProofVerifier": { + "type": "object", + "properties": { + "commitment": { + "description": "\\[cmt\\] Represents the root of the vector commitment tree.", + "type": "string", + "format": "byte" + }, + "key-lifetime": { + "description": "\\[lf\\] Key lifetime.", + "type": "integer", + "x-algorand-format": "uint64" + } + } + }, + "StateProofTracking": { + "type": "object", + "properties": { + "type": { + "description": "State Proof Type. Note the raw object uses map with this as key.", + "type": "integer", + "x-algorand-format": "uint64" + }, + "voters-commitment": { + "description": "\\[v\\] Root of a vector commitment containing online accounts that will help sign the proof.", + "type": "string", + "format": "byte" + }, + "online-total-weight": { + "description": "\\[t\\] The total number of microalgos held by the online accounts during the StateProof round.", + "type": "integer" + }, + "next-round": { + "description": "\\[n\\] Next round for which we will accept a state proof transaction.", + "type": "integer" + } + } + }, + "MerkleArrayProof": { + "type": "object", + "properties": { + "path": { + "description": "\\[pth\\]", + "type": "array", + "items": { + "type": "string", + "format": "byte" + } + }, + "hash-factory": { + "$ref": "#/definitions/HashFactory" + }, + "tree-depth": { + "description": "\\[td\\]", + "type": "integer", + "x-algorand-format": "uint8" + } + } + }, + "HashFactory": { + "type": "object", + "properties": { + "hash-type": { + "description": "\\[t\\]", + "type": "integer", + "x-algorand-format": "uint16" + } + } } }, "parameters": { @@ -2413,7 +2652,8 @@ "acfg", "axfer", "afrz", - "appl" + "appl", + "stpf" ], "type": "string", "name": "tx-type", diff --git a/api/indexer.oas3.yml b/api/indexer.oas3.yml index 6933f9200..48c4585e9 100644 --- a/api/indexer.oas3.yml +++ b/api/indexer.oas3.yml @@ -234,7 +234,8 @@ "acfg", "axfer", "afrz", - "appl" + "appl", + "stpf" ], "type": "string" } @@ -1151,6 +1152,13 @@ "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string" }, + "state-proof-tracking": { + "description": "Tracks the status of state proofs.", + "items": { + "$ref": "#/components/schemas/StateProofTracking" + }, + "type": "array" + }, "timestamp": { "description": "\\[ts\\] Block creation timestamp in seconds since eposh", "type": "integer" @@ -1313,6 +1321,16 @@ ], "type": "object" }, + "HashFactory": { + "properties": { + "hash-type": { + "description": "\\[t\\]", + "type": "integer", + "x-algorand-format": "uint16" + } + }, + "type": "object" + }, "Hashtype": { "description": "The type of hash function used to create the proof, must be one of: \n* sha512_256 \n* sha256", "enum": [ @@ -1360,6 +1378,28 @@ ], "type": "object" }, + "MerkleArrayProof": { + "properties": { + "hash-factory": { + "$ref": "#/components/schemas/HashFactory" + }, + "path": { + "description": "\\[pth\\]", + "items": { + "format": "byte", + "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "type": "string" + }, + "type": "array" + }, + "tree-depth": { + "description": "\\[td\\]", + "type": "integer", + "x-algorand-format": "uint8" + } + }, + "type": "object" + }, "MiniAssetHolding": { "description": "A simplified version of AssetHolding ", "properties": { @@ -1414,6 +1454,185 @@ }, "type": "array" }, + "StateProof": { + "description": "\\[sp\\] represents a state proof.\n\nDefinition:\ncrypto/stateproof/structs.go : StateProof", + "properties": { + "part-proofs": { + "$ref": "#/components/schemas/MerkleArrayProof" + }, + "positions-to-reveal": { + "description": "\\[pr\\] Sequence of reveal positions.", + "items": { + "type": "integer", + "x-algorand-format": "uint64" + }, + "type": "array" + }, + "reveals": { + "description": "\\[r\\] Note that this is actually stored as a map[uint64] - Reveal in the actual msgp", + "items": { + "$ref": "#/components/schemas/StateProofReveal" + }, + "type": "array" + }, + "salt-version": { + "description": "\\[v\\] Salt version of the merkle signature.", + "type": "integer" + }, + "sig-commit": { + "description": "\\[c\\]", + "format": "byte", + "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "type": "string" + }, + "sig-proofs": { + "$ref": "#/components/schemas/MerkleArrayProof" + }, + "signed-weight": { + "description": "\\[w\\]", + "type": "integer", + "x-algorand-format": "uint64" + } + }, + "type": "object" + }, + "StateProofMessage": { + "properties": { + "block-headers-commitment": { + "description": "\\[b\\]", + "format": "byte", + "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "type": "string" + }, + "first-attested-round": { + "description": "\\[f\\]", + "type": "integer", + "x-algorand-format": "uint64" + }, + "latest-attested-round": { + "description": "\\[l\\]", + "type": "integer", + "x-algorand-format": "uint64" + }, + "ln-proven-weight": { + "description": "\\[P\\]", + "type": "integer", + "x-algorand-format": "uint64" + }, + "voters-commitment": { + "description": "\\[v\\]", + "format": "byte", + "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "type": "string" + } + }, + "type": "object" + }, + "StateProofParticipant": { + "properties": { + "verifier": { + "$ref": "#/components/schemas/StateProofVerifier" + }, + "weight": { + "description": "\\[w\\]", + "type": "integer", + "x-algorand-format": "uint64" + } + }, + "type": "object" + }, + "StateProofReveal": { + "properties": { + "participant": { + "$ref": "#/components/schemas/StateProofParticipant" + }, + "position": { + "description": "The position in the signature and participants arrays corresponding to this entry.", + "type": "integer", + "x-algorand-format": "uint64" + }, + "sig-slot": { + "$ref": "#/components/schemas/StateProofSigSlot" + } + }, + "type": "object" + }, + "StateProofSigSlot": { + "properties": { + "lower-sig-weight": { + "description": "\\[l\\] The total weight of signatures in the lower-numbered slots.", + "type": "integer", + "x-algorand-format": "uint64" + }, + "signature": { + "$ref": "#/components/schemas/StateProofSignature" + } + }, + "type": "object" + }, + "StateProofSignature": { + "properties": { + "falcon-signature": { + "format": "byte", + "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "type": "string" + }, + "merkle-array-index": { + "type": "integer", + "x-algorand-foramt": "uint64" + }, + "proof": { + "$ref": "#/components/schemas/MerkleArrayProof" + }, + "verifying-key": { + "description": "\\[vkey\\]", + "format": "byte", + "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "type": "string" + } + }, + "type": "object" + }, + "StateProofTracking": { + "properties": { + "next-round": { + "description": "\\[n\\] Next round for which we will accept a state proof transaction.", + "type": "integer" + }, + "online-total-weight": { + "description": "\\[t\\] The total number of microalgos held by the online accounts during the StateProof round.", + "type": "integer" + }, + "type": { + "description": "State Proof Type. Note the raw object uses map with this as key.", + "type": "integer", + "x-algorand-format": "uint64" + }, + "voters-commitment": { + "description": "\\[v\\] Root of a vector commitment containing online accounts that will help sign the proof.", + "format": "byte", + "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "type": "string" + } + }, + "type": "object" + }, + "StateProofVerifier": { + "properties": { + "commitment": { + "description": "\\[cmt\\] Represents the root of the vector commitment tree.", + "format": "byte", + "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "type": "string" + }, + "key-lifetime": { + "description": "\\[lf\\] Key lifetime.", + "type": "integer", + "x-algorand-format": "uint64" + } + }, + "type": "object" + }, "StateSchema": { "description": "Represents a \\[apls\\] local-state or \\[apgs\\] global-state schema. These schemas determine how much storage may be used in a local-state or global-state for an application. The more space used, the larger minimum balance must be maintained in the account holding the data.", "properties": { @@ -1625,15 +1844,19 @@ "signature": { "$ref": "#/components/schemas/TransactionSignature" }, + "state-proof-transaction": { + "$ref": "#/components/schemas/TransactionStateProof" + }, "tx-type": { - "description": "\\[type\\] Indicates what type of transaction this is. Different types have different fields.\n\nValid types, and where their fields are stored:\n* \\[pay\\] payment-transaction\n* \\[keyreg\\] keyreg-transaction\n* \\[acfg\\] asset-config-transaction\n* \\[axfer\\] asset-transfer-transaction\n* \\[afrz\\] asset-freeze-transaction\n* \\[appl\\] application-transaction", + "description": "\\[type\\] Indicates what type of transaction this is. Different types have different fields.\n\nValid types, and where their fields are stored:\n* \\[pay\\] payment-transaction\n* \\[keyreg\\] keyreg-transaction\n* \\[acfg\\] asset-config-transaction\n* \\[axfer\\] asset-transfer-transaction\n* \\[afrz\\] asset-freeze-transaction\n* \\[appl\\] application-transaction\n* \\[stpf\\] state-proof-transaction", "enum": [ "pay", "keyreg", "acfg", "axfer", "afrz", - "appl" + "appl", + "stpf" ], "type": "string", "x-algorand-format": "tx-type-enum" @@ -1943,6 +2166,23 @@ } }, "type": "object" + }, + "TransactionStateProof": { + "description": "Fields for a state proof transaction. \n\nDefinition:\ndata/transactions/stateproof.go : StateProofTxnFields", + "properties": { + "message": { + "$ref": "#/components/schemas/StateProofMessage" + }, + "state-proof": { + "$ref": "#/components/schemas/StateProof" + }, + "state-proof-type": { + "description": "\\[sptype\\] Type of the state proof. Integer representing an entry defined in protocol/stateproof.go", + "type": "integer", + "x-algorand-format": "uint64" + } + }, + "type": "object" } } }, @@ -2953,7 +3193,8 @@ "acfg", "axfer", "afrz", - "appl" + "appl", + "stpf" ], "type": "string" } @@ -3890,7 +4131,8 @@ "acfg", "axfer", "afrz", - "appl" + "appl", + "stpf" ], "type": "string" } @@ -4224,7 +4466,8 @@ "acfg", "axfer", "afrz", - "appl" + "appl", + "stpf" ], "type": "string" } diff --git a/api/test_resources/state_proof.response b/api/test_resources/state_proof.response new file mode 100644 index 000000000..191915d8a --- /dev/null +++ b/api/test_resources/state_proof.response @@ -0,0 +1 @@ +{"close-rewards":0,"closing-amount":0,"confirmed-round":1,"fee":0,"first-valid":512,"genesis-hash":"XDf4OfzXuZftT2sfwSLhVnv2sgfLT9lQXvo+BeEI6RA=","id":"DFM2WVAU35HKUBJE76WOPCJ6DFJNUOZW2ENCB66MPCVECZO3O4RA","intra-round-offset":2,"last-valid":1024,"receiver-rewards":0,"round-time":1660154706,"sender":"XM6FEYVJ2XDU2IBH4OT6VZGW75YM63CM4TC6AV6BD3JZXFJUIICYTVB5EU","sender-rewards":0,"signature":{},"state-proof-transaction":{"message":{"block-headers-commitment":"qjdmlKrXv6W4+p0diRng55X8zeJBKwLJvvyRaPbGVMk=","first-attested-round":257,"latest-attested-round":512,"ln-proven-weight":1468640,"voters-commitment":"OeURX0FncI7pbiqYtuldefoArMmokovBWIaejvxPp1prFtvy1It1jWcTyasdau3NuiYFmJWiI7l0uafATic1/g=="},"state-proof":{"part-proofs":{"hash-factory":{"hash-type":1},"path":["waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag=="],"tree-depth":5},"positions-to-reveal":[5,5,7,0,2,8,13,5,8,7,7,6,9,13,7,14,3,10,3,8,9,1,5,13,16,5,9,8,16,3,17,11,12,16,16,0,13,4,15,12,3,2,15,17,1,17,14,8,17,4,8,5,15,17,4,7,15,8,11,1,0,8,8,14,17,5,14,6,11,0,6,5,16,7,6,1,14,2,5,7,0,15,16,17,8,3,10,13,17,7,17,11,15,4,3,11,3,0,4,13,12,11,14,17,16,5,15,12,15,12,13,15,15,12,13,3,9,1,11,2,1,2,16,13,16,7,8,5,17,0,16,4,0,2,14,13,17,6,1,14,11,11,13,6,15,1,0,5],"reveals":[{"participant":{"verifier":{"commitment":"/g6TbTs3BvntfNn5LOVmxynfRTbn7xz0qINAyNk5630FJ2j873W5pUPeF8rs95qtw9kkeq5IFT9CBT6Uc819dw==","key-lifetime":256},"weight":1000000000},"position":0,"sig-slot":{"lower-sig-weight":0,"signature":{"falcon-signature":"ugADV/XatS8RHpGgsCr8QGkFJavmQHS6MurUYVSc67SWpumiF6KS3vU3r+evc0L81Q4u/9ahbokNkWeVlO8fZkuk3eCwt9uUWWczqzF0n0Qm38496fzgUsxDPy2D4hD5boO2o/rprOLJt/o0h62uiVor9ZSlVUIvHf5OpZ2xoffOfjFo0rTYdQUL8cceyLkTssERqfsWjyVTdeJ1EzYLfos44KA63KFO8GlWOWyZ3EJ92shqefjeVB483UGHZEdFKCFqef/Y1hoZ09HWtvtRlKZBsMH1OmmScRsZvgz9YGrk+CGByA5LuSDDRVu5v1i9ujl0u9UYvOvSTeMA113IdOWPpymcPwNvaLN0YE4nNhI0bOpMbflZCJbfbzAjqGQjd05WNob9ccF56HPnRruQcb/XtC80cFL02yUMrfFq2WREkZcos22SVUwDYLpoE2nilQyoYsZRVG3MAb80nBhiIP/XsdljE4an4oek3wXOR4806qkzX6LHDSFIcUhZs5Ii0W61kjNwjyXTklXGx0CEx1DbF1/mHualcxgZ6iu3mSLRFrBQF4blXHsgKNPnBziRejFpnzp7CZPLQm2kjzFIEyqLfFk8CT1DHxvFn5wWke9RB8Fbx2lPV+pQQIpyFI4wXF/Ij5KHR1tLOH/tIydDU71ZYhqBv5OYp4NRjeCL5dMTQd41TVYF8XE+ui3ZXKerrcLwimpYJLeLHJ1nIPAevSnndxgW30pNZK6D33Wd7+zTr2VtlmOY36/C0yaJop9WvReyIBorZ9JG2mke6uGvINMqgN5GenARw49cm1dfRmrhu2S2KzSfciZ7T51H1nSgP2VnoZVwslMIIQ4ZrIZQwzMXXaUQVHMOJf5IeMxOmQlEFadvS6SyccqNc56G7stkdtbLG//Cl353tl4UKKS9VzUmO66XaWQKKn6O9OeTQmWv/7a4BO4KqmPRypzWX8PgXyBFCfP2+WfxelOmxCJtvNPx12k5R0ezsKNWt+d6vsC4eJ3fmdLqygSvaJ5nZvwZLmmIrGTQDfuckpt0H9H4YFPGWU5wljf6B8BgtsN2a1xpra4Bobp6ECoE7VO1uGTfZ9W4uBp4N18Ys5kmmP3qmHYeBZFMPHd4ih0iv9Nt2sou6p3SguD+PliPLkiUItdt3y8gk/f+sn7xFMUVIs1ezrWGmjaUETP/HFv1jbk93VUWNHd9lpwrLgiTLYhFyRmpGAKQqKLVyWkYUiaSzX2lhyWP7abfBYxv9JkpzdsP+k2rP+4TVWOn5bGz1i5x+7ZMKBlFLwPESi14MlxIWJrdwhZGOHhuLiG6ulMhXozrdXlp225Fba2K/uS7DPljT+iS/Pt0uFIcbQzFDsKnqFvb7c7YEUUC+ciq0uJ8NKWeYgmeeSV7fvI1myGyQLQ0Q3+sU+wGgQTH8xdXpVvCF4Z3bhlTdJcQjB98ZRQbjxvFS/PSlnssYNBkNRS5iR5B30tfqmyCadJzC0AruQpJB4O3LXfinBvK8YR0q8ayVky4jg2fWuZ7NFhb2ZA2KOqRWeRjeDsE3xix8iApUlTgzKadruYMiUwbmaGHRZDTvOQj+q0rUpYki/XXCs7S+vxu2pr6r2bJLkNHrR7iSHJcm7rNa0lgO55MPeiToNf2iEA=","merkle-array-index":2,"proof":{"hash-factory":{"hash-type":1},"path":["hSdt9v9j8C8oId++5NPtzUmR4rJtm+5mLwmLKkS3fCXnf1/zcdLv7cbWwwyObCgdeWCUnfluMKg9vWb4fhHRGw==","iucPduDlDesgLBT+pTe0Mkc76XS1F287acao/wspdNc/SXPkqLH34cX7WMeqSOPSHeorfkq/5mFmF2va/r2F6g=="],"tree-depth":2},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"UiC76HHSL6JapUS7V3qbqVL5E3Zp5scpM1vnpBet+bhQlgUPNsJ5fkf9AzSB+uIrcy9l9gpYMyNEmgkUfaqp/A==","key-lifetime":256},"weight":1000000000},"position":1,"sig-slot":{"lower-sig-weight":1000000000,"signature":{"falcon-signature":"ugDakJil150RRdPvvE0E6Be3I5i1Z/GkrubJlnyQ9V4g5CfaY+0I3MWWOGU61mhk1odow8KlHNZDI0CRJdRsGQpxnQ2TfRt00RRDSr/Nqly4rgSaRGnpbxZdsjAvobby1McSKxu7fX+1CX4p+PSmvcOFj/WTX5pTR2oWKHeL4cXtOHGplDdodx8+2sDJFSQkOBzkVYJwFlJXbNz0PZRXY3ooSRU5ODwThuCLKDjlAmMq3GhhCmc5EEMgD0ocjCFJGZPtejFWedHrT/J4kUtD4fE0bM2JrnkzJyWV05kQh0N1pMrsWBbOAlCiBJprWmKeaHsYXXfq5aGSbb8Q9+LBGlgiBE3U50MyeriebcciVN6mExtlyeS3raQfpvEoTdTOZuM8b6+WLh88UU3ytn7CQGCqrMwfdKnnXea9azgEFditFENLK0KY7omK+WQ/rdS9SWBKKbJAUQKo0hh57ixFikJcRuJwFj4rWHDe+iR51XpxFhODgeGt8qbdr6TtKc2ioIEmnzXf0ekQ6zqhc8ddcEzrLPw77gFd7kdhqK8jSkLlLR8P8tNHkORCVFXjcQ3Ny+3mgU1hGBtHfRlgGL02VZ8hyVMZwrKo9q3y3c2GpR142Cxu1GVw/DgQAS6JYLcuKXGxZ5vSVroTeVTD1UWGMoqCQJotTJ8k23UseO6bJ7Cqbz+feYnEeDysny6uZxGjrdGrJlHkiobwqkcUsUh0fUsSRmqIg6URtbIo92vymjBYAYn0mNWFLMeO/7mU0HGMItJm5tT1MMQmZkETqLO/HCnadVt1ELhvHTlES0eKYxgc70y1+GXZtLhrE2E89Vy1m+yn/sJJkj1XxmG4UX9r8zltWjlNrtVWdRqCiSmFSSJ6+vJ3Ayg6ElmUs+CVJYlUJedyMXSM22NLZ2HQcyXtFtDm6fYcjzJES7w3PQPkwuB6WPqfhh7EH5hCq8pDo+6GmiWDwhRyzWNFIn+5KcS2d6ItTB9RfxnqDtM1gsSqfLqdO9TvRdPs5nGCLChxwEu/l1J/ND9+emp4WqXwlGqG2Njxmb0nc0Ny80Dd+0qnXmGYhdK5R1ornV4NwQXoP+gf49OsbC7WnWENrntSr8k3VZS4ml0zQPvTRn8bDzOCvK3EFyIHvdHc79poieiOMEXIpdTY/DNEzzAsbM9/lTiN9mqjMpiriVUVDY63xx+2xkuYacs48BTev5XJseP8lfwi70JlFNr1ZiCsJG/rQ+U58YM8Ywg9AbMuWrmSSJQT5y9ES6A8HY2+nGbEXYAM3Ys8QVCHsQ9JY/xIdNMc7G3viqQhUJ6wRG4STBuZYYXIwbTNqcaFKLLeuwDROqnLHqBm7fn0MeC/bSsIi1/8xephtTWdJsbwswgKFXjSk8U2H5pTNx6IKmsjvTZETaSz7SHu1odB/Ljr5JyMwpJMYaeaTnK7GUmyeMq4FEvF4xlEgY3avtg5d8pq5xZWYyjKcL3alF1sRO+chNUtIJ4kp1Q7mRkBWnaTiPwqzkXNTPysyIh6KSeGNWkjTe6ZrzH+1honQuNi90vFTykqen1IwbrSHPoaHMe6L9lixUsy8s9NVi6rRgNIZIg7qxxPZi0yQLDpTYImtZl+rNrQysbvm0weHQ92Iw24wWmuCy396miiZeuOa2dJnA==","merkle-array-index":2,"proof":{"hash-factory":{"hash-type":1},"path":["rS7PnvzAfswNNMNT4Sld8oX1T0TEnYsLQ4G5Tpez/sRHnOrkS/VlA6+Q9BY3hJDJ36+Dawk8oJzxDHKqrjE37g==","YR7dvJU00WXFzDqnA9N5v5UVJlMR5pb/ZeqLqNLB5ayqF85vybQjDcRV3QmdkihjoTaRocn+eDK/+2LTURJ9Wg=="],"tree-depth":2},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"4J8mR/SY1mTG9yuxVFWB0aROYwp2rV3nXVmfTctTDGVud0IIa6oKrvpsK3u4H6HZMlBomlrvlwg+Sruh3QrHwQ==","key-lifetime":256},"weight":1000000000},"position":2,"sig-slot":{"lower-sig-weight":2000000000,"signature":{"falcon-signature":"ugC7reT4xHpQ3iF2ff5O7K56NDl6FuBoId0+P376xbJpzmIPjW97uAbRh0cW6N85K2t19U4kfyWxQZ4ZYl+h5zxIduKUnWng14W2QWTPSoUH4Y3b6pJUkdM1Hi0D6m1GbSQzizHr/2vl3KuJW68UHverXlA2xIFMLBeV3i6t6w9qQKlloUnmiWbLowdPJc2KGjkOBR/X1HWTNQo1IXGz6UxVKyQHL284ThxmmnyCXCmlIwzBCer/JN8lJDReNVQN8nKJNb13PCbfzEufE2Nq7Rx5MDAF64yRpeh+xiCnrdBd1q2sg0XGD1bIjCvnC4y1fAKGnME6+ERDF1DU/qx+6derXDxvlRPyYngoCnbIMq4nT7KWMbS2KYSr+1pnBy/y0cQLjsC1dWAcmOrl2sRd4JK4CNPlYB4dO9OqdujRFekHQ0paqN52HU0LlMwPqpOjpa7fpv4O3JSqpemnpRNtJb+JL9nCuVJT8Z0kEbzVSjhvW+uKUx2H9RoVWMTZyZG6eQkTCE4YLf831KFR/2yfRjKEoMXS7uKoCfcJE0ncov/cLsm2mdanPu4fySjTzMt+VhtfjFRYm725nmOQxw0ZJSImVDcM0Z4eNGrScNQPthk0UtOXGWmi8XW0zSfpKBltW9cdYY8j3LRjxeqbAUz9XQnESQki2YvKn0pDpO2COWbJK8kM4+dWi1nrb6bRs5ly40i2UQ6Am4HeTrzRBlzrtkp5KujOMaMX+ZfJTSLmjH51hmcS6fFfrfqPXdXrjJ32oMrzVN4KeprhnLQY/WLVrxdDI5CEqX9+JG2H+EzxRnevjdhqNM26A8faD1X79vbjBZW6XQw+yZMNhcdDPqhkMOTg0c7SVVWH6iqeet7L2SG2e9OVoQ5jDmxy4+aJx9rbsiaO3l30ZSef4bF4pT33otHc3nQhkmVyMZFRTglFtXIdhUDYVKBCXJFs59SaXmTYaRD0izhQfVW4y3i1VPn5/eEOR0lecflrJuU/3l23uFP60HczP+5dRjy5Lgq2Mz+gjkht0k+Tvp+2WVczxGCW2vZDRxuRx4sUWh1H/eOIYxhIVHwRHCnb1pjOd/cpSaecW3iiK27FknfW3NNDWRbJgtLYMEtj5S99ebRjPcxuV5/4w1mpsbLTp2LZdXZcdgh57iMRuRdCAm2pJC0usPLnzmVKTKVFigbs0jXR3BndoWHiaxPrMDOxdF9hg2LU/ArVq5Caw5zuQWyssWJZBmJzYdYwSn/SJxOZUhKkRqondcn7WsqmhkMonG6xy30pI02tOe81r7fvgPUsS/Nbeqaa7xORStCQyfF6KX9+Zpzpu3IFKyJyJdLoJZs5wY4xn/RFOMa1GS0CVSIixGCf6Hkwis00rkj12Qn2HNhxaPMJE6HR7VtQh3NZ3/0jtJja0y9+55M1agUXLemiZ9lIOpzpSwxiyQzfe09GIqMFIUmvbXL3dyxum3b0+D/JjYoN+MRO4xsnyX/ClWz09eAh6JKL+KFwEYlRp2Sxqvz+uR/bubNWEt29vkpd9CWHf+q9/WH0T5iOB0dzx8VusCR9ym/k698XBlwSVcVYrVTKvNLM1bNMm32TapLFT2yo4JO2TeA2OK1FBXF2KST7qYNv8hvJvnXAhUqTDc6V5mcfae3xC2chaA==","merkle-array-index":2,"proof":{"hash-factory":{"hash-type":1},"path":["UT26TnoTs1Eo3uMDFjpOKdoVdZoffbWazflh3Ju2DDTb+vdQvnpv61E2I56Plw3m+fvsZR2hSngIY71SCg7l9g==","r6GkqOyX0L/oCH+KSsAU4G23bBKle9V2jdB/z73NHr4RT3AY6sHOFkRB1nB83eVUMU7AToKsFgf0mwip8Op5EA=="],"tree-depth":2},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"r2a0Xhen3fEWuobGwK47eLXdGDjpSrM2w0gSSIlSVf7fo7lPsMj7/paX9uFnFEQ5YvPdYDDUtnkdy8d5ZLg6NA==","key-lifetime":256},"weight":1000000000},"position":3,"sig-slot":{"lower-sig-weight":3000000000,"signature":{"falcon-signature":"ugBnTbGfLty8wTVShEkahyKREfVZp9OtxpOX3WcPVPi1tOg6RpKafV15lHo0/eOO16EMsuyKn1xbfEQY0u6Mn4zhBOR//Z8qDmFjT2JQyjaZO2AYIlHnQzP3TYJMjKLf9etwnCUSjyvVRVZGW8k2bNxitlphux2KuTvR5+9Nx/vhU9T7dF6eT3d5W3ex9Jlm7UJl3DSIaeZz/Gtfa8E1eYt/43meT3PeC2JXXrMoVQz0CVFlNDna+k6NquSOtMyZp2iQTiQJ2qpECOoqjyzbOr55FmHmeddHDq5IsovVt530mJXubqspATkZxCErg12QuTRPXNbKIeilHMheLbKCl5909/15iy0WFY81SqSSmAOmJDPlS3S37/nzuWvvwUfb4+mHeSJfA3fxZlhMLHGZdWdtGQoST+5vWJOT9tNtsLH8cxJTb6ZtHjW3MFgYZLxu1mi+lQb0rxlVY7OYSg6bftprtwnRlpdo2edlssxFe5EU+pKuoknrpVClf7WrVlcw5PaEssOg4sfI0s/T0PM61gWBivQbdE7B+TBOqTxLK6fMgXwumB++YSkw7XI8/kQLJTFwodM8Tm3lmUf6e2UEwWiJYycf83xgJJKbzprJCMNZ+4wc6e4o6GfQj8Sj7dclzUsgJQQBK8MncbblDD5S2IQ3xo8uV32NkJluq5Ea0xdMIg80mdBEx5y/unloHZW1oGKU738Qu+rVvr9JP9eUoddREdURByGThWldKO5VBsvRRhjNgkjEsEvhLtjYzpTBYYPjzpeWMEC380wwum/q+B11nrroInYe47brIwZthj7WsvRwqAnkVj0Cq0pli6EijDCLP/KFV4Cf6NXOwd98kc9klPxrHUbKaocbvVP7F84l4cmAoSdd0EZRrQnccWXxYwJ7MmjDPR1zOS4Pow72VvgJ6tCN4AlH+Yt1UtQqi35AjePtT2G63hyPKaXZotjFgdVOkUihz/JpsPfmmKDCn5JYbeAh7k9UwkKMHAk6EkaQ6lJ8tfEwbwwCFZm2KXPm74sM6dhVjX39RBPfrEca5VB65luJhV/8mcZ1KWr/cn18jhCmf5ibgxSR1mu07hSmQMF6Ky7yF9wvDbzRLtdrWkkmKbOPJK4k803c6DfJK5f6gMXdWgKlg9emTamuZ3HRByFukDJnR/7v3N97ookSzx62G26POykSB2OjwtEnV3xrEWd1s6LrNfm3vwzNnOlbrMM9X95CreHcdjaJmLNhxHFP2kbardEI5bW8kxFmQ55YbEuR+I416Sktj6aZnh4Q2OyiNR0iA4lyUbtmqTCMYMyMR+lX6zQ2uGbJPkOM8mRnPm3cD9BMmVl1Yg2w20CxXAZHN0TPPRqV2jKe2j8N+PhH2jda1+CpRmU9PTxoo0Ch9zLAgaYkykuRKFu++huLLf26bTu/nWtNohO30vqUGdPd0MdvHHLtEK2yUon7pMsqWce3hOzA8wc6w7T6j/QRXzPpHgHp9+Np3trEPLUxLPUSor55fOaU6bteKfbCGmipM9x7nSBF2ZYR6fW9EzNvi2YJll3viDHRtSWsWV6L8eJlqqzrUqJBo1EIxoSv01rQ0z88uOlAsyKe1IubGJAzDdokj0+8SUyKYlTbioOfgk4dLPPI9vnm9O+7JI4ssCalx4A=","merkle-array-index":2,"proof":{"hash-factory":{"hash-type":1},"path":["7RWQi8kLX8oW59Jmfx2GYuCMZWAIkC182RVF/w2HJ+ecYdDPskIvaCOZBazRPxF62mgs/H+F/3C+9AErc3w3gA==","BEoGRO55kyvlBL0nUc7UbxRiFwcE1TEiTcXDkxhkmQQ+bRqxH4B1qTHSQV1AXsRxGfiyIq0ogTpuax0BweZsmA=="],"tree-depth":2},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"7BYFUPlxLHqdxHk5kPo43CIyPEHM2z+X8+cGPZmt1hkoqob17sJd/XdT/zScjLs5UHjiV22vaAtD/QFOLceJuA==","key-lifetime":256},"weight":1000000000},"position":4,"sig-slot":{"lower-sig-weight":4000000000,"signature":{"falcon-signature":"ugDyRBH+r8G+NftkjnqrVJisySL5t3mHAx15/UFXEy9ixkwl1Q+boQBYJC3zf9NMlIoAh0606WQ34eq6f6OvhgbTxikOzmMl0/ylTD3DFTBtGt4tQfhgvfqYD1omrnJ6xokCgu50eIMHUGugl1x/kQDF037Fmiu9V5RU6SAzqtq/P7wmm/UZQdVID+k1c9kGoZTmkHqznss6hhIxEsqR25ZXLKhY0Cpik0jAmaLPN0dd2XpqkAyxuVU7cR4UU32IFE0kkU+8UVXjYRWyZNg0mWI1LMJUg+290H8TVGvTBXs6ipwJrGzhNXgWoaeFY/EGXrYz2wwxNKSPBx6+sxuSGyZbFX16Avh2J2hSYyyICaqVhzHXE8ClOfjzwPN4Mqva51a+MVlz3JxiXslOLf7eIyuf81fCaqsSfRlGQj2175Up/3MVg2cp8OrrzyKj9ZlYChSVz2U6to4Nlqf7y9ZQMLAxy/Vkwvp2URnE9/e6bDKl2tK2cKR1NB/arb9RP27rAJk5SQ0NF+LS5fw8QO/vMlP8GZ3LpUrEnQZDCSZyYNOt1pfuDtukxRXtT6Jtpno7HlBpaYLIgiKKD8FMz/BodnkNClPTIfOe1hCSTeZTsha98vUZewQJFiw4ZoMJS/JmUNnlAx92QKWMp84eYM4aHKJkjxv5zY/44+byz1jtdIc64+mqMQkkOTlWfFCzasDDfFnDx9VHmhnmnvSRcl1vW1UZUbB+G9P7NkSRd+Je2aGoTk0FRyZoGQHFRS7ziKHTwPLn2ogWF4fw7GoEyIO1jtzrn4+Jra6zGV1M2PIVA6d3qZHozIy02kt8tZqX5XCx42/4s7k4hsbSzcCi1amyxI1l7VAOOd0ru2eSFKCyXoptyyMVawbpATedMyGEs+8pLFIymFQ21B9OHw0hRyPLVntf/pK5GaoRYE+c+2JAw1OJ3DnJpcDbNNUBR7IzVxjbTbtyFAl/GDuKvyRSfQdtDMUjkcQd90hjYgqOnAw14gytM5snCXvmOP8l+RlAPHOTJpp7pTJIxpWtIYlmgdmEOhSWvby5wjLsnJphMkGnKOJAx+38Xh2MtkLdK9AlA2PPxYmCzbmUKVJnSp9MztY6WRT1FrQhfXpBZebWo+5f5Fw9CSwdMvNGWoU5+ITQNDI+DZp1iheElc1YveZWRuKw+BJLiq8bHgMcrJCUJdk+Tx5NxE+XNCNpvEr7zRpXXThvb642x/enMQkbsKastGnal0uIRacy0qLS4A6c7lClRjyXClYZSDIbiFO86xNCGFq05cGtobe/aI24oKZMzKulSm4y9sohiIlGIIkEIW3Dmk/SUMfITE92vaiPJMSuxtbfSZPDnGn9zMxgpGovXyzVSUN1Z8lZprplmknRsGe99jXc5sD3tgJvhVJVA2J6MAPHeOdKEuJJ307oJkibIMRPWksnY+5gdsn9zwzJF36XWRIfz0yh9c5acqhrTXVTnXemkJoaBFuluP+7nJMVuTRyBU7AXg9OsjRsNdKGnWblZDhw1Mpy2TSph8ZKh6RKx+nYWtyEx2kBdZlu772PPfxzJN0tSgMlszgFIhK2+MihqOp0N8p87Z4wJMnEybMQ2wFms2OZCBkmqrv/hJkVXCn44hxzO0n/ru0vII3Mq7nW/ciQ","merkle-array-index":2,"proof":{"hash-factory":{"hash-type":1},"path":["s2znacM4PwYCONxIP3/4rT3or4NerbHUFbt1QuX8T3+2DYbcLiSLcI17PHs1GFzLkcPwsgIx2ZngIBuHYp46Cw==","UmrjMgSBj6QFOU604v3Z5U9bklvJan6IFd4RSWyPkXLZI3jKZ/d1uJx69UxSjgtJQnXiPuNJjwOSM9PK/WGbyg=="],"tree-depth":2},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"L9lEC9b31Ss23PDwxQ5sSbxBgyvb27TeBbhAD0nCm0mo/MwgX8QptWO3mgOTc9Gnm9VPLFxMG4YwOq78kDlo1g==","key-lifetime":256},"weight":1000000000},"position":5,"sig-slot":{"lower-sig-weight":5000000000,"signature":{"falcon-signature":"ugCsJTkZLVNeUn+YtN5rr6y9/4S+L46aRKZ/PdVJJX4Z2zTjEMIMnN/rFZ1AWUNemZuHXlKCpaqy2WV5LZSoJxT4tcuUqLDp9drJWl7ZQhDJ87L9JPm8MwX1z5NysX98Z3jzKLAjuvTlXvZpzd8SIm2k55UaKl98QUyjNa7WfOJcNorEtZ5amvcnwVvF4VqoM+PKI0ZlQKU+c9ey94a8YOfnvTKoYcxT2+OXxV8Jbp9GifNR7dNRhl/5ZzETNG3dNPDmE5Wb85SmyuntFqnroEl9blRG3NTSuV1V8vNJQEbV0uFa2gIXsosonOWCWpe2PL80CgsUNQX3ouxdrNOUVS01XSaN46D3PH0ax+aJiyKR8nGhec2DWJXJPpqUEdw4S4dJM8JSMcqPHb1FeirBVocokgLzQFW00/gXEfGPppl0z3VURSH0YpD8oWmNzis9SLOOZaSMhiifuaISzWwlSMXR2TQVGNJksskUqgqxTapwG+rvUT5vDdt8qM+1MB2zFYyiU7AjgMhlXtuKI4NJuipuXw6H0NqEZxKue7FmxjHezyIF6o64ZDVCd4Z1znab2QdwI17ahlmrePerzfJmzbtssj3nq0OxdTYVCdrrNAYLj2OCWxhXO7BzOxvIWYojGPRRIqQiHF6UZjX/jS44IQciHo7zA3M8pzkmlusrcB37/Yw0igp/xMfNYxzrEklXR036MnXJDzOnVrkiOMLPg66r0WqO40K60dodrvum+baweomu1StGmjbHJtSJAwZQeKoSj7xLFI52EgjkYdnoJXfzxlE/Z7yQz3RIvdtweaUP/f4Wgxo4jJ62tV1oiZytUYjE7PQJLp8+i6jz94vZv2TOU4skljFa9W2jdIe6uQtG0I3LnTg1skJtJZOt8LYEjm87LaM7v2ekL91dWNG9/hYqIZ6JQF8XOdNo6FExqGjwCXzxyNOny8KgQ/nC7wYrs3pjOzJMjH9DY/ibJO1xDHJ+mnV5eFNvqW/xEYcnZwSQ3K3IrKoTGqVi7jEHR55rpGuu0JnX8kchnZeXdy4sTQRVMWJUZ3qTNT5KPik8uO+xUH0SQ8WPGyzElkwkaaYJMTWkZ6OqMGinigCKrVCVqnqA8Hv37fTDE4ptY+57dewjietLmsyqhwtJJyfTuwuxnqCRvG01O685KVmTlXqyt4Ty3NChOyuGD/tiR7TpOq9ujE66lnh7P9Z5i/fGHHVUVePJsU3c6YFX2kAIwdPHesk+279HrKdYao0vgyuYGadwkeBM/b5nnVnTD9bSEMz8mKUXM5f8ND6PBf/VAJo8u4hVNmGhd9Htyt9khCD9c2ZO5niiZGdQhv0+QeDvA4s/Q+C3zurJP6Uaabk9WuektxcsQB1+whmk+LabVOdBFWmxWbqpV+w6GTSVoo0jycbuSIJbYmzTjNq4HXn99iFYUcu8Ib3emeOLNPBHYCbbAmz9GyuXon7GyxpN7io9EsEZGLp4o0hV7eY2jNF+q4Xn3dnno/1OaoiQLBUc8iIybVKptrrgnQjLx+lHFYNlWmrbeD6gq49tmefBptqD47MpOujPDiGGWuENNL7f8pRyGsdJC2HVLMkKZh3lUbSMGfu+k0KrrcX+OOp2ZdR98zn9UD8RlVOw1nvJkXVh5/jE","merkle-array-index":2,"proof":{"hash-factory":{"hash-type":1},"path":["zGpRJ1TzeLcPMIXF6GH+tnIY0vXhCDpLLENHwER/CJoVTDw+rxqmBL+1FfpZQ8ybkUpNcq4yP8sIb8IqZ+j0Jw==","sn6UK7krqjOSng88wwvZBDgAQCZIh5wB05xYfYqSW10tQLO9AGfBOIFwvhiV0a+6bIGm0UdpQGgVJi3qNUdK5g=="],"tree-depth":2},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"S0KFUvyUHWfLajRPbdhu8qkG7saigkOhK2314FhJ3UEm2ZYJoABl5jsc0pnbt80HHKQj3z5dyLYXb3OEyRX9EA==","key-lifetime":256},"weight":1000000000},"position":6,"sig-slot":{"lower-sig-weight":6000000000,"signature":{"falcon-signature":"ugDF9xr6/TEZIChxLo7eMzMw0FJn2Oi8cZF6sslzef9xkk0xCKaq8PzRH/7xniSCdWL/R1pZE5yt6aafeOWlOakmecliAJpMdLkIGXJoiBXmKX4dF4ZjxZ7OpXduh52aRJxJZxgwygmvJk8XnZPS4AmFHvqQ96pdiC2TsytzWFbXSpgskG13QdPfZMwevMwiZ9p1gpCjSPx4gBPgp8NwXfVXk0+PwJStyyLQmQqPsUiKab1ShMBZP9e1JamgwQ8ZZNW/FvxJlmyXFk8jOIxHklhO5Z5H0Izk+qplDaTS1rLgUK6+E+9jxiDx8zWW/rTNklSp6WNmF2QlHfjrFvTd6e8UkO7tsx87TK1JgzG8VzZnjUeN1OTVeNv08qfxYz50BsGNZohex2tRjkjWPAEfhkITnGyBN0VXopRoMsnhlm29b0E4MnEHZTZudGxOTzu6W6zfRbKEQTKcJsMfv6AV6ndJ/tgxE9uRsU6/0fp3NS2l1ZEevqqC4+/gqdfln8WnXxS5UIwz5o2XostSkrJoUOYBN7gV5AOvNUqJlWFQYRr7pEaFN95bX7p6xYdr5jmOud/69b9YA60nUHKmKoGHq2PNYw7MQqDqnWs+x/zWeYSCg8eEELeilxrE/20TsSFpuoSJrVTgcUI559RlE2zBQVb8M/UO5zq57q7NOqEAqlTMFYpwlpLEQrrWXwlUlbuGm/6kPRbPGOdfUbmjqtwNktcWaYikASi6UzGkhqLW0Nvrpc05sRFdzxUUaSm+crLd+bJnOSaAs8F8XnYLxScFi9vzVKIph6wUViyAIEe91rUg65qES/NFf+emQDsCAoJsKBM4PB5cpSnKiNhKlLI/NnsRTk4knG87niT61bo8erahBqHDGVNC436rfsbOLcRmCZo9P97nYOjORXOkaBCPxrqMnfa1vvy0/Ndq3JPP52ZIla+LT3fxJrjkwqfMU2iKn/SPEnxop+soR+ts+/+H0BFRCogo+eWWCY+FYeYL3IKDWv5Um+Qhj3lNIrkT+GfxPvc1ANb7Va4ubM6g2JVnUQjmyitr0be8be5y7+wmNMi9bKeVB+10ZNtUg6M3TeAc6SMbakEbXRN9GyITRpH4/hDnK48jIflpMZU3Nfgu6nUL5CaImuyiXzoxZrti3n+f1eaBN+o4SFNZWV8l5lqKxDH+Hk1f7dGdZTu+jHn4bphHA0o5Wq1GSXvX3afe4juPO5YMXA3WPjK4HCEtOpHYaQnpXmFJ0apPOKgyUEtXTjvfIKOtNTYFRipvcsJpupinXYo12EkEgTxG3VN8khl8wzlIexltdV1gj9JXPfIGrF/dyeU1QE2392xNiZ9v/Ogjld04kPKPGk5wZNNPG0itx1ske5L2iX9Uqu5kQxpffxuGNps+3L8e3bfhfOjjKQ2kUJq7LEJhwIKZ9KTkLw3cwTZQ/JIYDHstSzFpi9c+YV/WOfAVlIRreUgiKpotclEemvtncPJ3IjTkgSh5WChqS4t955ionbWvOPMIZ+pVDfNJMVwITyFsZuqwTqKhRaFbWV+EsS7Umn4e6fp1rxUDHzUlLHyiIrQWBAd7bZ03diQJLXEz8BjbwbSKR1RepXIx+0/jdTqcKfHgUSh2FJ92ovKha4+xK2ZfKfNUimzYiA==","merkle-array-index":2,"proof":{"hash-factory":{"hash-type":1},"path":["faKeSkVfdQRr9JHZvHSjVLus2RVJmp48l8AIw+nr9eUBwxm66Lo42OEjaGuHG4/pf1xqpv0u5CwmXoUsy5rYTw==","p7rFeDPQNZyZq9QX8T+3vGFyDU9mFcIP+wm8q37njmD45tQuLeYvHgUIHBj8ka3NsVqArXtQ1SvYGFPWyhyWbg=="],"tree-depth":2},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"z5bGl1bNAkhCNOs5IOAa8tPWefn7T6TLTI5WPoGak5ZQLnV08JKnU1ZmY8u40Trt/skqcUhakZSvPlCT8ynTYQ==","key-lifetime":256},"weight":1000000000},"position":7,"sig-slot":{"lower-sig-weight":7000000000,"signature":{"falcon-signature":"ugADW5mKAUOhdSru0+NtlPOhGBUueUW6KZfmlE5kz1q32NGRQ+ZEaRI4OdEr6Voxyal4ohwZfi0f21GhSLZpU6ZmSGr7qoBiJ058EmOAbVMjVQSAoKUDHIaTjCPnG0jXSRkQLazSUTmIvRoIhi6xR1V7aPCMO7CTyETpi/SRkHRqlrYmiLIcIhU2SJtJbvlxIiaGS8/hmJeQuKn0vsLM2xZK7QKbhHiRFW41aNEgjHo2T+aYpCD03ODJGXBAbn1DgwRoMS2rIJDGkR37JvZwwkLGo+ySgOvnGMJ+2Lw0imCBNsKj0bAwewtNgjLY0I60t0fYzG5mTDZpbFmv/RydbhRn8CL17JpICFf10myl8NTamZNi4rAq4oN3qyGmVlmcs/M4Cia7obFg4Y1UQsjZonV+c6DcYuuIRr7G3+aNnomjj+HxM77iba1vXcgV6cnjONTSPMJ5JXRxo5IP7EXq06n+CboqqaD6yHTnWyXRGvojqkxNBfq3CixYWWv2mKSqhwGDqpTnTcwwS4XXNvLQ8qPqoKXP9r55R/Y7Kz5mqTzi133Rla4iVyMRR4cS6GH/O1KZq6OYB4iVo0yR855/+GV5CebOLs0MxJ9o2Wyc6d94/zTUYy9baXCa02zeyg2sCT7pcbkTl05c56Lmn7H093i0Dl7fYODup3QONKqjK5QMTG3li8pavhSZmEoQRDuYIAVPuqFA1niOmhljlsLKYvlJX5idzH5uh9ldZT3Klsa06nqQ8Hx/fjgyPOyvaFZZBLQm+PokZp0RaW/JTqrNqiIv2ffULtGlH79/p1qYR1o77JzUuputUWj7tLMfbJNtZDYnf0TipDoHXYouCdT6AaYgsOtkB6iB8XIiEEKGI4BYWznh02Ix74yuyTs0mOczBNTPs/ys3eEAG4R/F2ekt8TQav1IaWv/vXkSOdTWOKQrDce9/dslNUmmHptBJksTKKqVhyGulgvA0kXlfqsMYqyB/lofRumXr1zM7S1QU3yzLHxKREczkhR3kwccv5I06U1elU+RrynMaaV7key2aVXEKYqNCUrq8Od7Ed1P/9hI1wsjFMu6VH8Qq2W9UfOc4x2EImaGLFXJOcT6XOBu/NDsIWbhzMwgK9y4epmEkOhC3fGBXPhrwv3lWT5sT5xkMJYOe5qOKWiZh3DjLP3NLjPaFLYdnkXqlBZVasXEyiK2uEgcz7Tt37FTfXUm9xEAIKolW3YwjDtuYNGutrzF+pl7Q37oRda45MhYTebfq5/YbeGwh251nLYw4r7lWJGmofHlZN+6SxrQsFRsFn9odBIJg3XaiY63tSZSedTvbbMsaCgcnOD7f/U+9q07PJlCVJrwpwSExHCq/zl/w7XY+2V3Owb7Rp1ChBWvmSiV4rc2fDNbUmHmREgX1qHau016cvw9333YhmTjaZe4aWl15lnjZLUQaJrPw8ukVjOGv87Y0pcIyZMKIWlLMQ9CYGwZOMoSknPdLIbeqG1i10zGyxxNVZuvUUS6TjPsSilLZJ52aplEedhGfICg2rgbFfiOnCqktryCDjMyj6Xzafw/n25LmpzNmUyCYWYWGhoJQBgZoNs4i2zX86hd0WNUmQj7m9mu0iFeh1I+V5Ws8861Zj1YsxUF1TBvrx5/9Mfe2nkZ","merkle-array-index":2,"proof":{"hash-factory":{"hash-type":1},"path":["XPfW7KNA8INbvIPQFeKfhahjoZJU7fVHrK7bKwhEujej0BpGNI+BLTsvNFdAjjUx5G+Oy1PtEBZ8vk3bCFugGQ==","UrxXI1IpIRAlSZQ6X4F2tTVF0jOBR6D9kRAEH/6JDfaOo/mUyGA6GkRCGpGjhBDqyYFlemtXOVBWyTRW2FlNhw=="],"tree-depth":2},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"GMWMGZBlk2ZfUKbbWac7CmFF/iSN5id+20FShVLu1aL0wQK5dLazvubFqQi6/LfapfQhnog4uho6CQWyxqClzw==","key-lifetime":256},"weight":1000000000},"position":8,"sig-slot":{"lower-sig-weight":8000000000,"signature":{"falcon-signature":"ugAPxS9+9M3cUXbYcTdoNjaI8QxjTItaeb5Z1Lzob9pIzAmlyVi8/jbvEbBk5eizRcWF+khLX866YfMlrzeO0Fs4aWE4bvsI9FW26cN0PXPxmLMdF0oS/mLWhxbVwXcftleVapCzes2e/iMPX6ypYNXe+DG/V8YP1napBGqR+241880KdFLJGmfC4jtvEYm9iFtSQs80IUVsbmoOx6yITyK8jp1sXCCsnzalnUVl5R5RYnbi1K8hCxZklUaRz1nozkCVilyHz9miyeP49jyJOfmSBc97pVom9O/KUPZ6OzhmNGxrSPO8qRF64mgZXc5/tchlkuY7ERWbx4pmxSD9vBpHJanzEmGqRqtyLZvaqeLITGUsUSL0nvQe427jEHxPpwubYM50TVl49UenHtghImpp9uUCYkp5erZPH8ekv2n1Rch6LLnTS9adHLMFdexb2XVCpbJ9uz1ofI9U9bejiqbt6zz76usqUSMKr2t2FU0jANZB1GzJp9I2c6JAnfo3D34pilqSbeTRlOD6ElSZu8l0XwdlGI02vDOh4UXFLqbv0vgvTf2PpKb0Aifj+N5X2gcuRHTUAwRjF25KgM4YpHU1XqJ/z9NMgQQ9UrigByPxIYBXaNP+1H+v9umzSudry9eCu/QsuRjat8QmSv1Fc0jBMFBETiTEwfUDcRxWqkoXYmvMXHhbOOqcuOAUDodY9LZso/8glLkxVKL3rxTo6i9qqDV4gJ05HKaPOVjCIsxnG+rx5bho4rWJj5waN2hLPh+bpW+S+j1P94PBiOYbqXsxUYWmD9Mtn2w2lLrPFZG4SnM4MP9nmiLalTJX7sU7n2iyvo3Sk4hR+8nal/tknzGTWaa2dCzDaU16lS+gYyT5q146Yz5teAw1e3tA4x2t1JkjkGj8uLslX2aInI90dKDls3veL0zOjtobEfFO6X1JuvmJYcQXGkWsm11j1PZr+hpnPYvCndgD9+GeMhnLKybKCqtCiNM1lAYBO7Opg/kVY9U9k10uZQ+3Vulgv+sI/5tIhDDaO+ThqziTPHIfmSC7+kbHb43LyjndDUYxHJcqDXVud3SMXSl7rpJU4BfuUlW2HlfFkUANERgXmBrKyRXmh6da+O/gyCQBTp4pWv6fRMUqULgTB7np+dtYhkmnR5jGYMTN/K9zucKb/Pzp1VkPQPGFN3DX+OaYgqMOMQt7E1hyck4hIN5RMSrjr+SuQzLkcTrXxR3SURaESeRpPq5XKYFu/42/xZuW/HHRLyWDXJypm2udK0U399vz878KYLP2ZyatAhqEtbeEzijjD1acqs6UnNCp7RjDs/ocKi/x2iYp5TG6se6MbDD82rVowypBVClqBf+K1RrGUnq2YxhRBRRkbx8asyZUohDl61HkSMtcl7cZqIS7imxhxvap/k1bUR9u3Yjr6l5vqE81tiL1pD9OGQdjZov3Ew/vHT/qeyFOv30LjKsFbJpuXC5ONdefIUaGThaMbHH7nNVWDYKEjda0vGUlmiGtnhTaMV7OYrkqU+azCi70UWQIN6bHbJSuk4gJkcDDHO5W7KtZEmwLQxdqIR1WRyektcbmUTY58tc3iQMXmBbM5r9zGRzyllqXNDlBoGv+pRT9p5mDbNmTB1spLMdJUrnVdm69933Q","merkle-array-index":2,"proof":{"hash-factory":{"hash-type":1},"path":["5i2o7ez1XFH2KM9SZRO4wx9+ap00PjrJHV/bfsH8ilAvr+RKs4AdGfNFAOC/aZ4Jt2Y59cZLfsPC2uvcsxFIjQ==","C6NPVCt0Tc818OHMgcK3+V933ywhpYjypYQaUgds4gU1PPlWCdu/oqTVof4xq6D41GYyAiD/ozGUmaxOAEYiIw=="],"tree-depth":2},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"5w0A+2MXx9Vj79UP8eXi2eWbehtHeVjk1fbm81SxLkyTeqbA9mf09DYMVWGZ8qOjmB8teg88vnBm5yOe7lNCug==","key-lifetime":256},"weight":1000000000},"position":9,"sig-slot":{"lower-sig-weight":9000000000,"signature":{"falcon-signature":"ugAxf+51V2r84S4OPo7IyEkRYobjOayyEHAIYk4gSBVLC41AWVf7QrHg2Kiq/SjzaA6WNYQ4CCYiAJHIXK0q2Wit2ZLTcLg5TSt06JnrZxZRG3bUhFXH1h9MsxSW4zGOFXeWgOIfNrGcQh/VErSx2V7hb9d4YgTDPM4s0ht1tYumHYkXMc+r4pfaFcdG2OhR1Ha9J4KqzGLfbXxjfQVTBpmVHOWNFmnVA07ZYGZ+BSX2jbY8+C41Gj8VH3etA3z+E2jGpXPtqKlOh06+8XmKlhUo4J491yn6l6OfRnYHwM1DeceNiMxiPLCKii6qKskjQ4aCIM8pP8LVCNSGFdPq+P1pf59zc7DEz1Rlj5Pgxo1YhHkyGqwiVoft3SsJjkvR5UI4vl/wjJIbjtXnNM7Zt0/GH/+nWzJVTolo5WifFjSs0e7S8nyHzJnIH6sqRs0sYZyAIyRSWiOrGkxi06biSKkkAjh9W+2HbivLwU7gskzSZRxOas2ZwGHT+PIfN8CgcpTJllvWNYYAT2CqNi3BMOnKnLJp0/fCGd0ZM9nb23BPYKUkzo82dlgvMtbfTr/VuN+E3pCdTJtKnYajUsCM9NdDi0t48jpSSwrCvpB35gsOxEyYmD8OpRfgsVX+KtGGocfodZl8EcOBLyhf9f1XKfA9PA2CnPBgXC9cSi7lQF8iaIMh8yuEm5p0WaVe7eyHkZk0EczZc+Y5/gZ9R920jloWx/xZd4rsx0o43+oB28CUc9WATsu6kVIm7JkqTz8WSrYhTSmzttZinV5arE6RN/s/3tluOt+tybx2baLdbZ1+WDcetzLGPD8jWCOfDVx7ryFGnfcFJyJF+YhvWsa2ST+8MG/iPPLRhuTvIkILj2oa6eix4/FDeQciH8gBMehkcrPM+r6AN3qqbPjJQZeVz9U18zLEp6Trk5fGLxAsUIx6wPaMMul8hZZBualppkzEBMvgDYD/dRDfpgfnqJtFEdWmwyQdFo+WzLTLckWeqUFmDp2/IPgl3d+mbSKYNLooAvOGeOJWzlH+fzN5f0Mofxb1OoBDkhkbjVicluTDmlUxsYnkUmrs5Y33nqCY49iMt+oKTGfoCnGQnrGoMi7S5Ze8cUpyUd5Msw7/YYz5Y+k9zcXdBDap7oD0sDf/ngyyX9NLVvKumTQzXyWBlmDl5yXSRB0vLFYRnPbmtf6yq8CFIcououEcQPRVCKYLOEm3bi5Re8TRpdLquR6AWZEfz6EXZrF4LLyoYmPclWXMYcgb1pnqETK2gzt8qCvdgE/2JUEtZuGTv3M/R5JtHdK5x4zSlmrCHaei8XjGYMwm8/3iX7OFdH9Oniqn0MAmEhc7UWJO9fOqClG60EPqDnLKcNPNgaRAjMYEZLqL4hPWW4oRijQZNhruiSk9LYZ9pdyaElKTuTt8N075nsINZm80dGZ3dH+uhvrJX/qPSBkU1a1EEIQt59C17svCkVfyhXFCQfKNLkaEyRjZnlmDlqtxFSdhwK/jSDkpkkZjrf3oZB68QdktEqsXH1tttaW8WYKScSFeDR/TV8vFXHMv67jLanbrPlFslGQ0dORc+mk8asrAYOYo/0+Lii069F80ypryhepSYJdRp/whvq1qKEl0MSUqHJfXW1QXGxnI5Ty0NR0=","merkle-array-index":2,"proof":{"hash-factory":{"hash-type":1},"path":["i9S27YeFCmPPMh7M40tXvvRYtWdT7au8Wjalmk07eUraoD76AIt3KRLdJYRIvQMn22q//XdZdpE/0mc7Qdji/g==","fhq9CDKK7lFR6fJz6LUHJJQy10QJmpKRXKO//9fajteVNVXn/nZmIxJ9QmHJno6plRjTYHSTulN8MGSb7CJQWA=="],"tree-depth":2},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"T+BnXIlHSnpVgcST69AJrxh2JhCrlq/5Pqd7NzuDJatyB+2UmvBNmJlnt54Q8E1PQGmaCS947p26YGgzK2HP4Q==","key-lifetime":256},"weight":1000000000},"position":10,"sig-slot":{"lower-sig-weight":10000000000,"signature":{"falcon-signature":"ugCb3Mclr5wZvPxgVGx6p3OUQxnC8ZtUFtkyD6bVzXhOhZcoc3pNDiJxFoK1kIxKitj0YTHEGP/FJPxYKhWX79wgXh2vM7FvRZPcJJPpY5c0++hXWgAhvdkHcYghcl5sJmckUJWKhRzDEQ1KfiOsLjZ1ja9c++3RX5SUvFMdrGgF70rRIHzaz0zOyXB8nblwpL6pgpjJkYOfoPFh+NrnYWu+aKxGnsLHU+nVeD6TqJvkFGhMRZQRuFlxzULpLdsn3YGU4yzO46AiDpwVzImJKC3pvW6m9z4rk1xPp3ltLbbnv+hTHFWDYUVP8aeBOdx/Fe0aBE4lEov9oRP/JnXZOlunrGomzx0IrMmPV6SurtWbn5IP2cjIWJxxvGoizFtSkQkauIZgXmmCDqTIV8N668Mp6porCm3eVQXAdD0Lp9eeQA5b03tE08EvMMM34PbCx4VDv+EcoYl3I3p+1O0F8VIwzQ3S7Qz9de226kpmzW/eiJSivv5duJK8Lh2Hl155B1izZ6DR5JKdy+hncXEbAqJpX1nWATaYP4V6GKg09Tz0uJxh8WtLAPXENX8aFy/S9mWlWKhpyMDKmRR1MOkUE2SwHK6l3whclSnMAMxu3YQAiDqNJLkGdPPyKkENMy0VUrMbqOTE7eKKuVxJP2oxe9UTVcsqv5ofvGTwoSzHy59Pu+6t0ZzTgHf3C5pHgXGq+dR6nOm9q5/qeYBwqiZ1AS45Xk/2/SeFEm1wj8oMnLGZYakCS/HvrBATawbkrPhFMjv3+u5fzOpfMW2UMzzz1+SpCiX2M24/HW6zcaUwH6a41owR1E7zZoLngsOsfQyzxM7cfBi8S5Gt1qkYhOM7qHZ0nlYrj5N1yaQUkleouN4usYdqPnZmjyqS43tYVtI67qDa31Q3zs2vtVXrO9NEVgOymUvxJAk4KlElDzzQ4FJPt0zpMtmSmH99OCfTfKhL1c/ZwdgXpq7mVLZITshykHU5z9Deag58Tj+UjqYaGTXLX4214RMFDymCZGVIAGNmvux8ScTIB5sd91o/8VTeo8+ix9ZnX6PQo17cyS1O46VYECL4Tmq9nPYtZGxT6vY+JavTQZaaucA2kuweTHE+BceYYZXvfN89pTq2J7Z2X23Y+3pG7OnVZ7PK0w/b8W16pZre5qZBIcTSsio3tdbfcJuiVZlSNNUrI07GuixOKuDrkuY+N5nup3MER+6PFC7rDLDH20LppPrDuJ6afqn0ajR+7LbXRMXY4QRh8GDZxtCQRV0VC+4+TK9rNmgckoLa1uOTBB8sVxJCQlLJ5V+SSjXGdTzcT1ye279OcUns7LdPs4eWpENTXoWohYSyJp8croRXOoquHMYveIhqv8/liZ89ctxTExnNk57SSQDTFIe4f7HSdHlHgKWr4t/L/BfSUM2iKqQSN6832BR69bmj/TMK75HehVGzMprtiz+wWWdkvUPpOzb4rE1fUFRDMfeG6ONkYuS5yLGbFjrfLm+4Yiy2tBN8i06pjQyX5JBw2odJ07JpktIRzuZ16p07H3oem0gkFJk/QYWE0GSd7Et4wJpj6XJ8lhVHCvTjJNz5dKEh+jbWfDK1ZUSz7fMDWS73K7E6zFhaX7XbXZGTxU636TNqp57+sr6uROVKOT2A","merkle-array-index":2,"proof":{"hash-factory":{"hash-type":1},"path":["jt5ZXtDuAU9iQH2BGar0gdCZfiHk19Fg2ZwfRQDS+1z2LxuYyqMwZmAoYDYsmbFruTHOnZMA2R7qYO/wFsgrBg==","PpGz6TSYTbR8VQIGKkA8cKOTdfxu5wJ54VVbre6BghrVp4bG3ItboSnGfjF6KJm9od2ysrc3HvOJLAt0GcJSwA=="],"tree-depth":2},"verifying-key":"CpgOOppD1BgBlYBq+G1tiVhrJ0FAO4/1gYFfCzmQZXMEcQSBjNnNBBTp1Gu496t+0TKOMVHV3hXUDypudyJDfFt8pLnoEwZcFC3qfI8VMt4sIpsBHI7d+EIZpNF6dbYpd8BVGZFaa60oNwoSXNjDrGdFVgaigVrTLLSqd2of3iJZ4ScH7WlH0a7qrkGEDh2DCUjvA4lmzMfIX/8YkTgqxEYJF5JHlESR3IFV6cBKzDhgHBEbylacvOTRe8eXHlQc0UNlVEGzHNqkh1VCLLh+UhIFaZMkm5n/ZnJN5qTxCCmYgGZB8CZqCoU1vod21zkX2uFUhh11aIkX4eophqEko1boqFw/lo4ZhZFNsYSraAnGN6c4O9ma5rF3oUqXIaeRS5VtBoWa7nAhBJs7jXwdGMxl3KAdLbiOIsZDpWyM/lkqgbcxQELy8spbZxWkCCjVUSbYhzbEASSoMQ+bnBanA/xxhWQUVBZWpdNB4zUGxnmglET0UKiu18YMKH189vFv2IYRlKZnECtHnQyjxpfJKh8si1oeC9ooFATobNcCkK6ZIvqFCJ5Ws/oZhOAELW9GseBBqpm91chCgwVoJbZklMUQUqRkXh4CiyL6JgVhkz4VIWmx0UgM1uXCi917ZThUR4GP5jXQ0FvLGGIcEkbQQkLMIxY0t5yL9kNqzMLCwaVpHJAbdp3wmKFr9Ros4lTBH3J3gjBnLNrByZm2CTQhyNhfyoXOFOFHLTYCXFQQcsdeQWj0Q2MXOGHJxrU552Vk3Z3qDC8cMWpn15Gf1mqIjjiVwOSCUd7wCc3YbQRbihIvRArR9zouTTS9RWzTH1YWlK1Us2xchCGOD4VhZySePn4rc6JVg0i6NXuI6q6NbhLzjBSisHTCe6bmaDpRWgaI3Sr25uNGoIpTLYREes6VNzkw4iydGJbkR8HLl1CQWD94k1XsLEhSc5QWTxHJRbg9zLGWccljwyKovcUi+65rTzPhpgZNW2W3sCUUFs2ERgoFp3Qm51hxXcP/USgchDK7AJQ6qG2Rc3xTynf9ZTl7LFeZDacyoxz/H/ZAC2OGPg+pIkHqyX27tbcqnmOrZjB/5heXBWLdu7S04PGbGHmrJtzHEA5RYzTDMR70PMDj1oiQcWAHb0I5kCb4kj+DcWDM7Hunbbl9egJxHkBtZxTGguihE7RaBepY4wScVWJAuVcGh4HvMbjuLUfapPl6o6KySbo36W2zHJ4vKawvEjOiGCKYrsWJoeV5ZIipnLyVQ4Kc8QRsYoKl1a+2FilmVxSOOmk79HuQCHi+eFnynhO5/MnWFql3oKXHJxANplnxxjKM7uu0uP/aDRuBVQa96NKtSDvlkGBOBiA1uO4wlET4IPaKwjjE0JEGcYNCDEanbd1z5y+jnFku6NpMi3eOXxHuaWUpcqQRFNfsZqxtBlWQuilKSJrOxUkYyLEENR7yjfDFVcSc2jomcsbHrDdCOLNEsqH+GSFyh//qwYYOS1fAJn132u66ppPLs2yJEjHgiQTWE8S3mrETpaniiptgvNjEVfvN5rMZRCA/DbpQ7QRD/AWJVZ1Hw7tHJLSOWiAejdgRUvAgY8DRNH3laXkqQ2py3/IA6PAeKjNl7FsLjE365KwSwG4SWkTaEu+o8d4x7eQ8ugLbG1wr2WPN91JaA32YXQVSQi8Sc/hfd80FDho64vm2IhwswIrKg56RDXJtK2RjWUdeJVLzKOEVObyh01wdMI5EYJcqZaA9ZHmsbVVyYNFJ++j4epCwaYbVBqxq7/Q9SxuzzEzyDY/jrPRy+DFpMF9QMDXq6PMTWQQ7Pi+JeZZFIsdGdhWRzVIxD+KjpHgLpeqODL1es2iD8jGyLseb48AEtaaJvSVsW+7G4shXkQXK9ZCxZdSWYMzqvxIggTQ0pg9HD2O2vUDn5qedZR95BpyTgZWYongSAlSVH7l9GmMz0fD0cxp7LPoShDUDNKZAutZwxTRRgoBqr0KzmlEpc78bNBqorVPdqyRrfPxKPUe5Vk7b9JWpVHTaonRQCMqsNfy0xlnSF8QDwugFXrW58idczGUZtUjUGmzXYdldR2pPSW02QbunLP6UMYxzxFvKavYbq1zNna6VtfWKr6eqpYYFC0e0WRjdEbfbhKmsvhtzb/60HsiKZcxCu2AoAn+BdkciX9RFKdA0vgvZb+TBKsr717UFsWb6PSE2Vk2uXI+T5M86QJEWuLARHU/o6eWxU9K/dI7V+2CwOl2rS7gO3kr2ZYiY0wSrQOYVvAqqr+KAyJkuCgHgy9MT25pjQX869JXUEWZhRb8pTyGqhmusB18TlHGHRCXYpIr7k2CMF5fWnDYxC8NtdY95M4dcLfzdkzSHlWyeksk/3dyANKhbtpfRh3rJpmiIpmacriLvhok="}}},{"participant":{"verifier":{"commitment":"+QVMVvGBwNZur0HjENJuXXW9uafHs0ScEhQQbRvk3gRA9es3LvozcVsn38BTOn1Kzn6x5S5JwjHM/nJb/wDd+Q==","key-lifetime":256},"weight":1000000000},"position":11,"sig-slot":{"lower-sig-weight":11000000000,"signature":{"falcon-signature":"ugC/RSyNFaaPzahtlnhqtCMQPl+vb8OUFz0nl7+L5clNxiiGNQIrwHFTCEs7rb3mtlZMrKCLadVE7+VisafwDCcooQzeS3YvPLk/CpLupYdxID8PnLX5mekeGcI3Lq7s7g/mPiRMkRQ1PITybGoMyXGK5cyZ0Fec7ZkbSXkpy6ydLpk3GRauo/et6mem+s7T1Xzi6POJHKWJt8oHbdmmtbM6W/Kn5dLoFq+VGoqYBfp/vSS6tKIRJ4bClkifcxDgUsphPYk3HFYsawgpAqhlI0eReMnwg6MuppJnKhhlaQQD7ptUNhmOw6Getzk2NymYRDLZEgSVmv6ODiiTI/NloPZ3/Oo9Ma3UxNFjBWzdct0ODPt8oGiZRlXKjT3e/EaS3+B3vy3USeS7OP9hH5QljFL2q/UxirR7FHBiXwTZorDxuZtHEww0Tyc2aJvV3dnRUK97LzCEA0bEkI/vA0shbVZO5gqW01A83rhhZ8e4d65dwo5+8RBbMFhrXH9WRdSiuGShDzg0uFzD9zdE2g5maXxhuMbrCJsKLopvjKrLCpvWi63nLrnTaU7HE78OXPCvmX9Yj8/aJZ9NZMrs5wZqiuEHRrqdpgRp9BOHkoUlwsD4+ffSNPFl3cQx72aQM/9Tc3To479WwYlhIF57s9hxIkCvkBQ1d3q3+SWdSpAYSKbX9UIz0EoaEu3Z43bXF12+Rxo/iZbSGJnS8twwbHtex6+nEZu6JzEXqmsE3egVRpyMQJ1vZdqZ/4FUMzG585yUIBgqLOPGovkyaBlyZMmHUiMLYLk6plGmJLzuRddRG1J8/CZZ+7IiL67ambLi7JkysR8YozWEeHLmNFdLB44DgH7mpr1FiKbOMnhMRjkfJ8PwyqeyEpUKlovc/2W5JVyebT+1c81v6/h4IzG8KUUuxr5V/n6TDHiu7IU84eMKNr8jL0MQhjkBZXlw7rJ2dt/IUo8chCpMYru05zXUdJTrpdAxhGcHYGkQ1Tb8iZgEVtLjNdm37IFXEv1J0aOdBtBhErQJS8K3sSxhk38W32WJAVnQsol04xWP0R/u/PisG9vCxORyiNRvFGPINTQzzf3qranBMsgFewqXWyK1muJq4URORLFRu0cdFCVaoZvaSxPn5fgcPlTuEayUybrWWIQ2KGh5Hmj8qbhODnMx2jPGpj7j4Zkzq0OJM47dhgMbgg3L96OIvTLCRJxyiLpwMqSn+oh0vJ0elEKGmbiRvgYtM/oo/GID/21bCBjRwuEV4oOUStwWW7TfNpsP5S+NkOaz+FSumY2t0ZfOb1WqXnqzlqZQ20mtuoccyCaQymkblmkTp5cEhlBIJtZprBvcVJYotlNScQxBo/R4d6JGURD4PEj6tkRtLrMxboG7PW7uViMEgxjfRySGJNNEJj2giScyGnasx/so0V7DoqWgbxQZCs1B/Ysu8wv9gshy9EtJf8+kpF6sZR38rlBnRIyIUBpKzZJSYNDGOoSa7zGRXUxOBpaK0SvaVzHuy4iaT/GGmqq5OSxzIoMLNmUZKQyc9vX+IsrcNb1roC3CtLNPQ7A39SnVQIG5y8vhB1Hf53ELRGlR9mVciL1QzG+CVTyq15lsYiUzKh++ZedGtFYK2l6hEnYRp2Mxh3IQr7FOlCKAgXK79c1uOQ==","merkle-array-index":2,"proof":{"hash-factory":{"hash-type":1},"path":["vK9T6XoJBZgmy+Q85BmZ31WARZDo8bgkPLCCteoOIv2SjjQZjLFs4KiQJNz6rLp3cWeEE0a3gYBT0H+TVYBD9Q==","f36AEdoL3YLe+jg2U0q9IXud7PAqI4r+zwbR7rQeqZkTanS+ysk3WpvxLuMNku47lAepI7M/DZXLbGoykuM5Yw=="],"tree-depth":2},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"7WhsDQprNRBRVmuus8CClvXJ8fyj+fQxnuyn0nypIGyyzjXHWdNe3U9uotKssVkRBlZEu5EZKMqZ0B7AT5HGKQ==","key-lifetime":256},"weight":1000000000},"position":12,"sig-slot":{"lower-sig-weight":12000000000,"signature":{"falcon-signature":"ugDKIXDirarmrFuJIfVaC45123QTvS7W902lpAKjD0Gf3rWYpjCMpNdBJoif3YUChqFBFwsfkxPQgxKHWzudqmddhZ8Cwz9to4bjw8+Uc0Nrlky0veQpjCP8JwTGc3LPsv4/luMM5LA92/SeIJz5zXr9MTCIlAzxuM8sqXRvc/HlQc3cIa1CPpTdKCZ5+Jk3TQ3KCfXj6VxkTpc7vdhzJiEjzyzYzR2Ct7JFTfLJqYa0CFPAsgvbBFk7meVtdEHZ2ExU60b73Oa5sN4+jLI3TeRvlFTlO1YuOFdnbo3QuH8txFWFegjuvRtiSqZ9nUiThP3purob+2IjoiJ9/W0NPKgmNXxlEGrRrDLx7sy6cpQpV0OccwJgyZ9nU/RENEbyjCRGIOa9VBZO9X3yFbbLaRPxOU1W4LUYEzORQSKo7pFlT27LAVh6+MoMPK6hPkjSC56uWo58a5p61lLNtNDsFd2JJdbaqSyZUKk//jUXEPfrqzuT9JbzsS1eskf5zSj+GFGGjpmGCwkY4aY3zpIOiaZO6LEsmNXuf7FRdwz1OVq+3t+7zHyEeaiqb39EM1FEyVF16Ix29dJ5a/VosRIvOflaeNXKiWC4YH75a1Y/iCbymxxw00RRW7QmyzmTc3KU/+s7FBjd3OBbN3qz+0VrDUmPn+ltcJZ/sNtbrVlGw7ii4yF9amvXKaMa9jZS9OLSfq4r2racBx89YN0jzzUcmfg3CJFFtjjzyQrKpWKJAYB2OnLIdvarFzESURExVEiJer+6C7JfdNC0rOEXhycPf4WCIEkPtyvh7cFQ2Wuxk7FVSrpOsPpkmH8sDpfYkBpcs2eI+h+vpzCWo+YZbh/W5U6sQLizVQ/4hP/TOTYSoztvKI4H5yrpJc8iSopcrJAJMqEYz886ebi/84WN89u3jhsFEp8jflMfyjQogxkt0BKBHJJXPQkNddLnUPEw14dirmOrKSa1oa9ridziCO0QR+s27G3aBi0kEOmprv/H5IiscNIaikO8hVj8T59/o1uJCiCOWrDMOv3oZ/kQeaqBeS/QhLMt0LpFEaWJV+aX6h6FomYRePPHg/rXfVWDNMWiVtr12aR+ZPV7eyfWjxNHgrm0vJEuxk+ykTtKUiSPoKxvZ9T8Ys+MmaiKYFjElkfQ6mmWHkLOQVqm1iGMSOHORJqCtLYSCwNfeEv2yZQxVWIRNn51xhy07RSJra4JSFkwgyL+Rh8u8WurWxg8QNVJvW6edUeuNgS/TqJQ/e0Uy+fFb21+3v4ThbmRshirPz3R80A4tNbJGnZpTRpVQFPZlE23lX3KdR4IwbxK6Ypj9Rv8RdLtxsp0V13pCXUl/L1trqrnYHhRTruQu+o8/G2dVlkRgby/Z7uNv43zU34+bymIaHw1+GmWQd+TVdGtlQ0F01+JmaOHM22nfE7VXqTDEdnrLUvTKe9lN3ETemv1CdsintSVvk1LCdiy4X89rYIKUej3uUKPI1SwcfY3I3Gy8uECGsnPja/fj56wcBLVSFoxld5+XIEoTMpNp1F9ye0DeOBkCZPRNJ5JvdnpjeOV+9xgbfaFvhu7MzRUS6XVnLsE0RIz8L7zGn3hRPWRXS1I9bpHqUNabppuXc5uYRLCJbOvm4c22Hse9cct7HOg","merkle-array-index":2,"proof":{"hash-factory":{"hash-type":1},"path":["DjbOB9UgTNgMECLCCp9ltg1dv5f8BzMQ06Eo/7V3wsj3In73Qozcb7vvI3IP+UwLNBMBUSCtUu6xMzcX24Jl5A==","ua7G8jP3yC82DU7yQRHGFXmennSLp5h+v08DirS6ynbvt6Skgw4FYw2xgL7DcYfvIWMziFxnf5ta8QOzLC8q8A=="],"tree-depth":2},"verifying-key":"Ckw2y5QgXxV7edqwhN3tgCWL6J4XDVRWhDmmkfc/VJNaEOeBE9xLoflHAGU9E9cJGOOvKm7irczuRb6esNFYGkQUuVJkY5kDtG261UYbssoteB/T9Q8A/qk7av9Utg0ygybZU+DJWNISp4l4zpeaSlU+IsGLkNIqNep2wj/h6rep1YgeX98i3d1G7mYgrhgMM6iPbq2Q3bvV0mih6kIA1Z9We7JdwGutObKeiaeFJboXGHAjXCh4sv4tO92KCW+sW6C2UCIiwD72RxckJzSTWnnM7kFkVuZrZHRg0eljcUBXBNYoN8qdk11gp2ainOWszfMx3andDJV4Rv9MMCmd0uGaIXe8dEQjjpNXjTYl4EmDkLGA5SMrHH4abmWxLw+gSAxU6JIJl2gSLAqNC5EaDNILBS0JP6nIKbJnOCtwoQgVUYOPNBvGyKoVSiiyWBcdoiLhyXG6lj4YJKzLmSwDL4jqUWCQID/Qn7CcKKg0oMRyhcb2rCVWiT+hJW7BqfUgw1KjQC/FXGEaEUrjNUVuLT9lKrCbKUA2gpXVgYjCaSxN9dEVapfoLHtGVrtqNV+lMGWFNKJJGJUGsX+I9LSlVmSyRd77NJijndbxuIEa8ilYhGojl/F2AEDK8aO/QxAvkD4gEq65J1tk31yq3hzqkA1+s7m62h+hDhVhFGjKYDNtNveJP2yTOtS7Ey3DVUAkCbaWJTub7YUEvIb3jCYSQ/9TKAJQUurKb/6uZfBCI+BQVv1CACiO7T4NXNp6xe9jPeMxO+zyZw5z5EwrJ14QizvLHSd4jhP54gQjuJK9CpLVM2nu6ZLtXu5Gbm5CttpASfX1kSHDQThQPBk25XoIEtLKUahNZtGuqoQvQWsRrei0k7RQvB5BqOo1FaqndYbM2JRFs3fGYm6d4aKnUeRjHLY8g8bt7R4sNOAFAI8POnS3l6fVjiz1Md7McwSISiv/Du+FYO0ZG+BNFvYwJggYm5qZoCHZJGF/WA7p25D9tJlCpX7Ua4l6z8DPbiIx5oe6WdB/GhlmBHbLSyaZtKMiIXeTrFJaMawpcqaEsC/Z52ZdNSGKGZ9oVKQ4IB8ZnOLr45cYGGkNyGl8qTAbhQJnNiA5TKzipQYA7T8EHYmPSAd7FaGXC8SBWsBCG9SGzqFy31pA3QS0bqokVoe4vsYzEXhPvgu6++o/xN6HSsgmvUdQu6SY+lUYoXkc2KnfVU+xPqz5iodXmbHM85JauibQtUBgGoqC8v3XX08DFvUT0hMtvyu0++io4fWE+f2lVSmNrYysJ6ntxhc+MON8TSmCaezkN9f1a7Qz0XcDjlQEyKWG13S2imdgsmqceDzkOBPf1wixPLTs0W+zuDhjk269kw74yHbM/1OpJ7JlRu4LgPNZBEWweeySCS7cTV6a8jo1L7EO5upRg0AWtVISGJmKRqd1oCp0rIKcIQi7kBDSIFmK1l+dJjFCSTOm5wCUCfpIACKkZ1W6OnYJiqd22GvF560C0EabYQWHv8QNg51XFn2xWOifpQUfvDxqrxAdaxWqAp/dC76Ra0naYGIKnh/ZAIZjSVmCkKEK6I4okAq9obgb4sdjCARxmWk1Re9G03Ztk0KvAYoZVD0Z/ec5XwZYp5wTBKKAHtXxqG2JqGOW9aJ7FBqtRURGVhp44XBdzgJqRC04hMWGXwJl1H0mhDq5YZd7h9ypJCZV26MokyZ5WUeOHjkp3XTaUgyzqlFgeaCAnqYfydVKDYigxTq2YCKUDOFK2kM9HeouJM2MTn36HqZsQNKtWbW6ApRxjyVzSiUSSC0KfsJgCScP/fCTDVyVh/BPhurRdHBC1uaoH495QRBWAMRqUfoYKEMdF4YAWZJPTk44asVDOoQ6YkwS5KaNeAjasSKKWwyYhBnUdm0+Q578aGiatLT+7esRGLxaoLmiEZUNhBChGMFG462mHAlDH7yovO6DP8AlEKTIhUggb1dMpEuRIZmrPKLJFSFBHkpjis9mzg+y/6hzKuGjRQw0UqHyO7EdIUzrZErpZciE1T1XMPeo1GCnN9ltN8Rs5lqRpOWYE3m68jCa/AaaGy04GXVnH7/lLCIC68aECk7lbUwdaDW/poOGUI+JOZJY1iZFur7JNwU1CjrUMwIgCEO+2Ls6YRiANkZxkGKuWgb58zTRpg9dz7YWZbKBit6oIem9EWnPcFAdwJrFNTco4qENeYVS3ybFJk452p0CJZcO0KeB7TkZLX0B/0juqwUM+fas6nP2x9n+DShcXjFxv1dvlZYh02TEYW6OslKQVFuLfaoX2mTAq7xRovpVPiOoNoM04LcqruMJpqRODKXkevoFIVGViDTigKIC4kIxHqL7HOGrAQccdjQ5wekHI6BJUjgYBOZZQ2n5SM1r3JKY3XJsGvs="}}},{"participant":{"verifier":{"commitment":"7SSYD4RzQAqK+vG14+ONfAtC1TCn+VC0R9KReLZ0IKl7KYaob2sGQ4gjK2h/Mnv3Po9LrXDAFFuhYuFyt9h16A==","key-lifetime":256},"weight":1000000000},"position":13,"sig-slot":{"lower-sig-weight":13000000000,"signature":{"falcon-signature":"ugAZ+N13tCMJatdxI5KM60bLzrY4qCzaxuYib+eusQQ+LX+GYIpBc/+YG60JfyDv8sSqfTTrslCa1WKthk0R4Jcj86HMMEXiCPcmB6mEdtTLeuvTlc3Qxv8ucLuUb9JHmXUvHWhKteeti6RRAE2qzspvZWHJNwfvGOP0osYWmvMjrEUPbMa2bUYRskOoTCYldfG57BWlIkQ6mY1Cf469O69qw6+xwlsUBs3/t9Hp9EUxCsmq/R9vh62zJK3LXadAFkiVPeLVqTHM0SobxFkgibHG0hpBEUlzJtqxu+Ia7zjuhmnI+EoQqH2BVMmQGM/mzK76UzsmMr0Gf7+V2rRN65tmP9omGnERXTZPnNHKilUIZbmQJkuaZvTDJGLflLarSrpGiFnwDkXuDXOdGdkLQQLKK1wWikU/illlUjpPr7wdagKpwkXQyjSZthItD4YewqCWnQvk2UEHNNTJ9mMti3+wSJY77PReIfn2HjOssNwQZ4DDPKlqV0BzX+gRC6uxFJZxmd3QPq8AqsHhL9IzJunUpdLbDuRnDiyzSmpSCLtC4V3VKxYGIp7bhUNaEvxK0J/O8oxSgVU6nMe1h9WZO1sHn3h0n7mP72ONStF2rQ1Xos7iq0zx+B9UyZJBSnI9jkd1WpSBKi8R9LsS013bBxrDjUsSA7VhJLR/9Kqi0dpkugkKKS35tU8KV9nY+Zqb7F6HQ8EQ5f09jHIrKUnrSS8J/Nrxc7x6zvsgcmPoFGDW/5Apzs9lJU4VinVvfSGQwTV8DjwFhML6PtvXfsemqQrehTfRxtYoMgbwma067XFQ1nd85VZaXSY1Cdxso6wqwR8r8oT5NktGa9sCedDOaTbImcgj3VdgEjy/RmuDdBlWlZhFXApnKcHN6FAHMRBE3QlLztDg0UpsJrLUTuNVv6XMxZAZlw1Y2mCI+7UE5Ff1SMsAqcL8HBaDdc41UX/NgvSU3FMk+dGHsujBQa+rkaj+5RmPOKSBU2ekeVVpDXZyqjGK3dp78rJQdhCJfYMhQHrojPQ3yxfVEyVdz5M0XkytEzd4uuOksWfEo9Dz262Ph/aFmkczdUbOHOPYZfwtktr6Y6fQRrkn2RI80TvAxFHt4RZLjBcVJ2dexeqUgparHrp68us1bNKq3eOblujHv1o8e4OGLvvUp/GXgzp72r2G3ZLFrTzfG1kVp61yGOtQz17rU6YqM85UsOYWB+O/IycSabvPxmOJlmjYKJumB8CxOYzCDDUJ+x+hK6yO42NxqZLYxi3c8u7hbVIDTZfv5J3scVahdtgeshOPjdNeblOfCE7PIkjbVi9ZnDbLb4+KOgX3sQ6h4/cZQ6NAlSmdZ9HxG+XmhSkYBjlSo6c/HGmfpSsG9iMhfJjvcQrIxbRyRTPDncMpl8ax0bsovx7sBFAYyJw/caB1MW8JJHBKA3WSiqvsKlH+awbSry2dorM+kv3nlJA0jMmWJt0OdBbYU1Oc2LKi+bhhZnboFcZLSnK5JIqBXsehdT9ztwh/p03sN0SCFPstruUcW35EfKUc9vjPuvOWCMUixrdN+nASeI6jVpggLV00jj8wBiyhGZLB1bzGInMHDz3BsTcm79z0nqYUtu7oLGtlXZulhT43dbxruWl3Ii2P2OpjTqo=","merkle-array-index":2,"proof":{"hash-factory":{"hash-type":1},"path":["Y74/+F6qgALCAAcjXofWt/2bpnHNK/o6nNtYBg3GVlPeVB2kA70s61vfGhdVt1w+zyrUUpQIcb5xDIxIfgMNrQ==","x5qeX0Z6+H00v/S7r6oe1x2gJAsCMOLuEMAgpAqLIZbE6rKgGIcAtCP2+T5QCIOyBwmYIcPTBRxl1hjVgQCXhA=="],"tree-depth":2},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"7vOTkeIh74Zf7PkHD9GojWQ1YcJD4i1YAxo/zeK9w436wfeRLtotlZ4m+M/Iih/oHu4tsqB1zLwRnOIeljBotA==","key-lifetime":256},"weight":1000000000},"position":14,"sig-slot":{"lower-sig-weight":14000000000,"signature":{"falcon-signature":"ugDHTVxrdNiQKpLHorItqoxwoX0jSLQSRUt1b63BKkLGs+1o19vRvHZOBnWq/qZaLmHfB7eaMK7rWWXWLXubbobdzg7zJsr35uf/UD3Ide1JyGfZf1+bBNjZ1GtAl9PUCYfv0TRHHocjdSbtNqiUsaJsZ45Eiz2rhvBr/+5BE3mzTduYt0KElRB8e9gmhYNxvChtN+9Mpde1N47PtRdsc2W3bys0U1kmSW+PQPbsVTb96AosgiUGiKXjt0/jxTPHApinRk+2BR+IVKYqJFbJBCkkkFaimm5eNjAj3ObFn3xXimGB3iBKym6BZ5Y99RUZsOWarPviTJNPtBv42c8rLjuSYXiZrHPn1ovBlcXXDC8XsqWKhKYe69el23+b+/uhjVpeHAL7wY2a9on2tIh+LdqeM8j/pz+pzS04Za8yxzXPpapnHtG2WaoE4x8/hEVn1NknefXIsgr8aOrsmfI1OarA9CffMGqKrgrk4xhG7LVeGRJ6qMYyaQuTP8Iakgqx5F5yklZxjAxxdS4LbfDSwqGw0hK/XegUr2Pr1FQelY/NO5Ufe87XB0Q7djoA1UGemOSNSRmDvOW68Q6HCE6JPgpFmYC46pF7e7Uvhc1b4+pf3YpNIR+NPu00lZwHcU/OyegpjG1twsFJodKzrzoGrfzjITVo0ax3OlGumcxwf3U2Iq+TmHTs5xCNtLFGwxMM3cYZfgWFR+NN0SSvGaIuzQOdDUWXRBpZE73dTipSzVDuJkTyU6uZPQI+Ro8NwQs/d1cbVSdUPKI0F2tcORGUJUxfzYV8U44RnqZHNpgdBp9pK9JBhxVFYyEbC/ZDDpZLjHKvSG8fu4ZZFXkWGaVLEyeaYQafCoW8VKmSo1vvmTbf4MZpqxwSAl/jX5Zj5aai5ba0bUXfoL0LbXCqWRi2yWtcFq4Th77YpQwmbVBEu7qe8cuBp61D6PpC/rwOCyGkszSP3uGSibfVLA6JT9OazD8PSrWtSPn9cvftlgqLX2pLRSIJw63GCcSGBmDOPQDxdBfVz05NVIgG498kepJCvTKZ+VpZBJSvYsoqPq0vqhFLRjLYNLK5sSL5b3xZ7JPCl22rKkH2GMo0saCvKhC0SYaA3rUCWMtn96/JjLYYEuituflNvXoRl0Il9IoN8ZkStlxmMUvavf5GztY54/dUY7vUzDt56wn2ZUtf0ovmkUcsSnSTh5NwUfsWOO+18WwUiTFWjILcffIa7guwkA+2P/Y0XOsrGNokdnJRQay7daw1RmfFwMvU/QWbZLv8aY4W5yzhIt1VtWaHdYmyCcMmMsZEjB8ydPHcE9bBBOJ6PjeScrPk6c7KFOhrCqsZixZKOmBIePQkS+jZIOgyUzX4FmzogPyeuN8KSpJSZ5DD0sywkQlY12o3M2mOKQnUbC+tg311Pi7DvroOlTSx/fWZ6Lv3Ci2TQhpFDVJoq2UevYapGu0xiHvHRvV2ZQ6tvk5TI5MYzhsC6Bmxsg0n14NsgtNISpBOp6zE5Mh0TA6rKYgmeMJFQiHfLG7Y+e/4dSj7XfH6fmKez4T0l3L3mptu+MMdPMnHmKgY5OHbdWH0rDQeCkrRn813xG9YpseSiaZEtuNJaFXrjxCZ94MhbGemTpUew0eCECkE3S9lR2sXhvtU6408","merkle-array-index":2,"proof":{"hash-factory":{"hash-type":1},"path":["L4bTWGq9ihVXKZhVn5fv8Xepd80bNrpY+2LXgfby2PpxLfU+spO+qUbFGMumqH3myqF6wrpH66txgJ8tpktw+w==","WZiMCbAwHIAHnxYGN9tPoJfI24VAN4n5WwgovqaSxxpgowrmCB5I9lYDh+IvBJjV7eTRMihI/P8zlCUrp2oq1w=="],"tree-depth":2},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"6eO3kwp1y3bJ4VMUTSv6brVvHcgJ2Lav1SccA1cUcrWvKXfCH3KBKIU+hECCGTk5GX3jHHSDCTxsiVS6W6jdJw==","key-lifetime":256},"weight":1000000000},"position":15,"sig-slot":{"lower-sig-weight":15000000000,"signature":{"falcon-signature":"ugAv2c5y2ffYnSv4B77pbZJM7es6K/aeuOb1ZavhCDSPsutBecwuEP1vcTXXhoepZ2Fof29nPSgyIohL08/LTmdQ0lXswXZ4ST4bjN14LQkeHlcE6fv8f+xfbMMXOTar6Z9RZTe5JO0EwKfQy+7RLEOluAOjdZAwqMtkXtRyR21+JG/LqZzXmqIcTmdCQXh5012HBjkjNtT9TueYlURJKk8i0LfTPItratfo4D0zltsyGQ/dIcLkRhZ73K9GtSBIyY/d6Przc1Wg5CUYiKwz4ETM02xNZFFvc70cYPFXlW+Zhm8RMwNS/rPpIfaOKC1eUorUulimM7TdoCP01j9RWPmW2cKNqY8kWZ0eEzDv47jwB0C2bBOTcsx+Z1SKR02darCUBdJGhtupBmsU5DmOpwM2zkAS2tObhoHZZg4CCzNBF/1alY07mPpMdgDgQSmN0sSI5NOdATHI5R+a1+PMnaovLpOJNu46yjzOMI/OpsQcr7CUuUe1tO3/OvnDCtQyA5VAxiSoWV1QNX+N5AyKm/w0GZUw34tkrxWdf22SngtFQuV7o6pGZbY9M70aJTInjBP3BTSQY2hHeoeSiZ9NPai9RODENZDJzb+nTKlnMhbWxQjD80qFFbBSE9+iDUXlmvghVc2mtOvUfdGeS9XkoSZYBEEQ4qz90iDQtYrUaypqp4X9BEA4muz/yIryeil16W+WNnp2fpkZyMXWwtcxdCRy933/cMlUKLfMufMJfvO3g/65RMmydCP71+KA5bieZJDJZE6q89Xx1U9OOxnkvPDw7qZAjR7ehMyJlBKAThi3XncqMtbl7Q+g5qEQggBdaJKe6imUNnGVYYZX8AZRliQEoM2PcgrUkAWZNM3HGRNednZ8um9BhW9Xu6XVuj17/MoniIsMq1bMJ18ulj5O2kiW/pkCVJMch38jL23b5wEhfmrQjIIageuRXycv7eI0EtaxxmKmLScLrMd4Vy/PVgnuSGLdzM69i2BXvtUSV7mnPk2mM7TFX3PN4x29IvyUaa5o4EmOh3BvRYu7Gl6ZNRECShZiwwX0bOp+5RKnjWIPJj9T9kTLVFdptTMHDlHuLm7neh9RwztPPMKZRVJZKQthP26ggaBRX5/RvlITcgmVwLn+GnYFvpCRnZvcQXy4fcYN0uWmHEnUKabqYs5kfwTfZZ2cjEyUk3N8k3wEcaq10IuFvhgyf4efM5mfPcuzOmEM7DIQ11SblU2vQeCwd09fyzAFbsJ1ECk7Xxi5R3cOiqPTwf2ya6LVfWLa3kaqHfJP1sWuQpNDmn9evVvM52Ew+JmMsy7OXL4F8pnlBxM4d+kV6KcqgMbCyq7iq1xykka6AEvmbillXJFcnjd9pzx928tva4mRCrtIj6ErWTI5auT6hfnLnqcduWZp2DRskfSShVZHKUu4toad+GDvjhc6W3+N+N4eFGzas4r3NXnRHZqGOUp41mZlfFbyChs6XVI9xFeXqMRZ3XQi3viyutWT6ySJ1DHzuIXjU8Tn4tHj+b6eMJPzM4jdQZG9RCtoq9dYRLVxuCGZPftNold/TaZxeatZOzcoS2zJX44a6F9gK601sOCQyOevQ6L7rqbG0b91bdr5yrZqmyyBWDJq9Urzkjmr7LbmjeP8Sa9bTIA=","merkle-array-index":2,"proof":{"hash-factory":{"hash-type":1},"path":["sOsrNIhPKApSlltnGAGqw4KFsaHjamJrvOfwjAFV8tkOBU/eixvObA+Hxp3PsS/eoRKYI3qvDnjTTqx5p4bydg==","H1xu80CnHW4iz4624WRWFbVAScn3xbtg+1uD8XSySx5vxuUSHh8+l63bNsSmaMSH2LECR7uS06OIamvVR96FgQ=="],"tree-depth":2},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"cLorSZc54ZqSuD8usYa2A4XY5jeHfmr3OeJkJeck9bzTJ5xRys9apNIimIrCsxDyyTceXtLJ8/WuMQlFlEQMkg==","key-lifetime":256},"weight":1000000000},"position":16,"sig-slot":{"lower-sig-weight":16000000000,"signature":{"falcon-signature":"ugAWgdWIpdqj9bhce2Z9TzuGq6JzdS1Rb6JhZgeBDGunDGX5WeIprvqIcucnPnzk2+auxfCOoYoMpKAq+myz+e3CZ/ApshTvQNj8YxiFMHoiS6LxUIlSwolu+WxzOdr3Ky5i0/bo/jDw1RTu9Sr6QlOJi2NUHIM8VbL9cqT3xdFCfpeRRInqYvi+msMawDTTbUiJ5bTkHcPnxvwJrOP9K+veNm68x9zjRphuDU4q8K27wrEh3yXzLwJPDKPr1E3HQxzYkKbI1Tw8J25vUbi9FvgHYg1Tp7ovso6PMenc/dXoSXhGGzrgqtOGvyxoaikGe4Y4Hg8Ubx5udJp48b7ACllE2OI6wkb16hq/9X3ljpTd291lzND/FquqlqfDIy0GPRhQ+dAIYxqQPr21Qlz2YNGlTTzhTR/673o4sGypbyIdpTLkprOQyL1kQwKyMHl3QTFXF5l92Z0mhLL5ZNW1N8uKx1FOINMn3YTRYpXN7G0GNzL2iNfzarQ8vifx1018zhYeW7n+zl7CEs+z16sonDM0JFuS0VKQdIEIKEmtl4/MnpgDZx5UFP1LMSQQ2EngPBK6Uw752H/azm825+eRa7fTBWSQPRATwf1MlvktNUVNcSxsphMCMfhrXpnedHyCg9/QKf0Rj3ut/AkryYc2Kg+jHM3zcvgFnusFRI4VH+XoYsyO6pTc2zkQlYmDdrxqZNZGX+P6bDVZXUzL6ivJsVb47boYRWFN4f16EWWue+3ISU9w1iYn3UHjFAYMgXNt+HiS0zfLGDovLIenTGKkRS73/M6M+qSZ9t1MhuViHoNvuIaSmiNQVHFUKMm1iq0kgaxAEjX6wt9jdkUhkUV6HCajOVGrO+rqfPNKe8wjFnQhcs7MJcHgVOyIY8f2Sm94/XIkqcCbU1TC0HXleb6SRvVO9uzcyBy5Ieo6MsQe3l/tbE35u2MYBmTScInuSqMTfXqrZNSNMEZmxvkpdLtOLtunzpFeabyH96SWNwUq/ir9XPJK5Uh984tzpzGDPTAgpOEIDpis5Ia1je1e3XgB8PKY2SNzLhjVlMgZ7MOzFHM7bkP7iGyQRIGTpqIjhoFScMgCLs19dNlckVvCsDac/hBefo37dqfQ0Ql7HwUndZzcaJ87lK72mTsmjCQO64EhiuudB7N9rbo8ArUGSNl66YOZx5esxOGabjx5ZiRKOXdZOXLe+zQtMx4hpmGU17FKvGD8HaMCllCqDzKHEG8jOg6jYQT1EtdZwETcTUw9eUDxrhFBy90T3GXVaGBoDddDVEzbDWKOhpqTYYzJB5po9fE6SIIdC0IdeIwBwTDC8wRIYWN9KJ7wFC1OMes4RQZ71cPRHibts+q0Xzyv2SjVczcP6kWguJPan/f82xJT/eGeY7WMyUbBJ71e8bk6SqKbmjgaHkRk4pqHm6Tp2Nt2gxMvwd1g0dS/iIaR/3kZOpSyiExOgaTNJeZDG0N7vuisVwSi8liecwrIEoi5BX5vWPVFLISqyM+GwNCwCaQeDi/0C8VVy9VWfuYo9+qSZdiJ3VKdyqcHSOySe7du44xOp/kF7zx4cXjoNBDnUrf1fJpy4cpNr0sSXHNTeLCXypUFWU5T0Qkc7s6r3pv4ETa8ObEiStM4vuxnXrlxzuzTpqfzdOp7oA==","merkle-array-index":2,"proof":{"hash-factory":{"hash-type":1},"path":["RcKIdxsW8sSxFdsz/r491xyPUX8EYzX4OrzmCfbE5DV/Bud29ogRl/fAiQ+0wBnNl+zYh+psIcAfXAQukOZmig==","XhYVcfDm3nIIsBPl52ci12kCrO54uhk86QjdKdt5L1CuBpAPkU1dxgqFuUTDe4vpJ2rnWLgVdloLQBGJ+79F6Q=="],"tree-depth":2},"verifying-key":"CkHOwYB+CCWUbszwOopPi/wg2KkNwWaNtQHGhJcP4sAXBViDmBB6mMYfrFdxXVRcGQNNuIdD2plIYLjgQcHS4BltP4B4FdK0PrPpLckAu2Tr+qlTyJyBAOZS3/AdBelbBM/OJJwVcdUETa+6F9JmQk+txB6HsIG7fKjOhhQFLwAYaBCRST4eGPcVL2uCjtlAYXPNwAcFwGspVsAUggBg7K+MiGRNkdHvMEsMqUgoxl4pfvmBveD+LT5p+8HD8Q9w/TsF6V0CWp3Shu8Lc0Ka4NxW7BCFxdTy0lZJXZ94ke+tWG7Kw/9WQyjZFNNaHVU50joV+4vQiaV7G1AiTEvhESVYiDF49s2mxyZCimp3IFHQC5aiKjqBETiLEZKEyN/doEC06lqRtpVs60S6pAl6IChmpNTJfr5/5HLd+JrVSQKVC7sP7fPh4O0UQJX8mqxFWrR9zCFHTJeh4rmqzSjNb2YXcTWOWEy97kdFSvsP2KgTRVtgHnrMt2hAs5/GHKR2ErJtzVQy5Qv5kBw3oNTvups8gOaP32Zx/KGwsuWlurU/m04ZMSeVg2V3r06a6VeShWlwGxoLEgXQSXdlChiD34cLcJIJ7eWJhd2n29mswbx2qln923O8zeRQeuwlOgICtSTaQjY1GeHnQlg3ZNcIAca7H/jpaEwLVkDtaIOETzVKkWTi9sdVOJx3kEyd8CHMpAM1kg8p4q/izlL6URHf8JoBHhpo+3Y10bp56ZWCGgP9W34ApmtGlA0G2Bph0Fy3YnHlXsyDfQx4WQQlZAqC48lkmysILbNExxWJMmLVuexMWEN+KUeC3kqiJf74/QPcVjgJE8eDdpFwxLufaPF5AtoYPl3sQ8YH9jglnUy+xKADgPtI5Am7AGcBpsRceSoOw4ZgQ1Ocye+RISo2sUW4BJZJO5PeFHGKepm+JN+K8WDiEBB/GlkSqPLTVhsRDtbnr2WXzc1gx2RfUHmoi/lJMbK2xIHs5mdMVTtYdO/APCZ/WvKRRE+ohOucWguF3pvVttFQMHRsd8WuwUj6TIebjxMnacsw8F/dbKEQIJQehRIo/AdQXekSTpXad8/PQXG9hq8eebpgMahv1g6xgAOZhKQeqjw964QUcqIETZARmMZ5WKvmJyaaOAp0BY3Vn5w+2fXTDq0ABqpJRE7GMnTBkQZYiC3uMCNcSElstCn5qiWJK40hG7tdaiMRpyKCUql68RZCb6uCGplrpEDCem75MvCNQGW6uSXARgjuBYxViV3S+2w1IrTmZoK4IOgnzcspju51AkSBX00RGqN2gcNI3gQVpYIKaqiIUR/ATwJ1oPCTJP6uKpLAFdQMBWWmO/FC8xrQ0EMWQqJ7AEmh2wqZtJb2h+eSpVKSgoUXWnVopns2I93lnqLRxqWhmz/WffSbl246oA/ZbsLUaZSmkAaJlKvC3FK3xYiulSqzIK09R6Y4yyDZSXVkUQEagMSxnENC5p14Hrlq1/hkcS9ammoZj/UpBLbGH5mxGuULVDnPeyaKm4VGTFkQPDgKNdiPZggK4IuZpZQh+kChl8dU6BPGLGvftqp/Gshc1rStdsU+mHm7Nu5mFe26ekW/48hZILFe2lN+Y5Mf7rCbBaPKe1UUMDZRQSko+GSQCM+oImCEHcZtAVCShfaGuYE+hUDKg06F4fdEa0Kbn9AaeNGkFIqks3fYYGMA/adWlgCyQkr4xcikrBRdzNdNGBudDFoaHRpkCbA12T8mApzKdjMbVa9PypG05Byml/jFqk0G14B526c2qaBRyWGa5xuQM52sEhNrLBS0OnRQGxNkrtPk2y31eQ6bKRWjhUbiBXqngDIlZbZ1pRGMA9DPCOJqjJMd2wmMTXNcPfx0eoYnojCesmNadnmhY3WKBtgoKM4jSAZKkbLNaijtZUqGJmuuKPoC9Af0UasVZZn9unNkFKF5aNDcS6sZhX1yasPQTnlQMAiuV4zMXDCt1SpjUHx4SCxsUFnzlMvrFJECJvEPy+4wzrvLm0huAwbyooLKGGVBwlDpZrmMyocE9cAnWkgue7BEPlMZA2AcQZBKcdg0LBO9mFqeKa0FxDad4vfxGfoRRgOFV6dQLE5WZDfGHFBxKjP3Ekmfbi6VekWGn6pi4UPl3oI2+VSMT6AjzTtHL+lmss0q0RnBnCsaOCQTj8ebmMgrkM6HidYM97iCvoiUFvpkHyRDVc0UBJPDQKrTML/shC2tyNHF1GYPRThGf+0GTm7V5p2jlQaWMhuELqQDQsBVeAy0b2zKZOfk8BAG5vifCwsb5WbSVGbzveBfI3ScXjo5sjLIJWRAzZAjxYPOqnBXQDBvZrn9lza9FztoADHq5RkZX9DHFxku6SMJDib8Au2mqvzyFh2MfWF+oWPFvGZuMGtzw48="}}},{"participant":{"verifier":{"commitment":"ihogiQtzp4q1xaX3nLFJ2LE0IX8EBoCgfxRuW2aFL/e3+IA9+zqHU8csbdhE4ACgSmwuUk8Y48jdQW3bY5uSVg==","key-lifetime":256},"weight":1000000000},"position":17,"sig-slot":{"lower-sig-weight":17000000000,"signature":{"falcon-signature":"ugCYQON8jKMFDl+gKU/3myDYUWAowSOK6Tz64apYbNKe5guFrou15GUzenAyA5rHGbjqrYYw+RlaXxUnNA/JLyEIVDcbNe4S6o6qgbay1SveSH6PvJzP48tdF1WdSu6YLzKQ9mfTkx3e77mu5LVKTEmv0jUWj7kXz5LRkHzl2rhaiNaqWPTuNvFiKz95OgyYMfAURZdIdtDYsWEaY3UWdyjadJ99qdSt1KpxBurr9UTKhKHn2qROIH3p/YpDVw7CTJAsTiJaxMsTdNUdTjZOD+EDv/RPHsNOzkdfuIM64M8R55LHYMUKtTmjZzwT60WmyIEhJYzHm4LlPzco/Q/8wesN70p7cLP4YAwNvw9Co/xrzdZ3FZrCtq5JhM7P00p7ne69Ke1nCz+XJNwVstV8RGcM3HDxsjnjbJCw1WXVIlYxKXIld5hSv+RiwVDMt6oiNxtwvRPuNK4/se0pUtn2icPUyNR9GYmF4mYMnstZH5+Sxwolh/HSPAgTaGMqA3pHfLHqFGdOqXhhsNqaIdPtUKyXf2tFzMnunolEx0cutIZ3+yKTKoTXcy+sPDIk14XthPJrD3Rrk1OEUK+sttiTZuCYRTJ3gTRYWmdY9imoK/eiakSyV7vkNpbVf+5ZbGcNu8JPbZypdwWoqvxcErPJ1Fbw6IQJEUO5VcXKvS1uzpJwx3RetqzOwBgFfQLKk3W3BHzdCHFvJTCel/NEnaBp5lq3u0sRFS+7kOU9trz69xo4te4862+KuOsVlykO8Fg2ewbKJSipzpHlUhWbv7WNU/ybzqy2btvnoUE8vEptd9M/rK5salSsowwUFQBw0sSa5q9NmYUKZnS4zZ/Lj090Hva+LQcuiDZ1qCdupqlWql/jBhzYvbAon35ObTn1Rukf7sOclVuO0Rr0jL31Us1hu8qbFeq1CWNJXYjk4/wGsyFKhmWdlgjEJrlUMGnn6Kp/gmV/0hEHS3tOA/cObc0zIlCQ+poodaIkRu8RU8joxDoH1Ue6OmbqgObJxEpp4OM8KYdJ3+nrXlnGWfWxE6+uNpyqtFU2F7++rWmbR2IobGk31Ei5whoSdt/HMMjRLNaZVntqkjMR6HsDxDA4dLE/0eu/KAm68jsTxnSDSfPaQzkRkCTG7IWkBsY71cvhmRJw/Ews/4O1i2IXxB4d0ULZNkGyzW9rPVj8dwsV3FGZlJ8uqLK7TAo22CkIZjVfK61BDCx6zCMXRpmgzRrGri+TmzLV4c8cZQZNCNJG6swD2yHK8ZDKWSdGl2u+O012xGYQlI0NO9jEBExXbLiqF9/K8FJhrpYVvooboYOnLll2yIUyUBhzidZA2glFSgaGaVKma05+4jHxwXAMAfqrWtHdOiMGL3z5x/GsoNXYIkb/QGcpDh4ilex1G91r5pXfJnDs1lmNZGfexrJNO5J4KxS4o6WLQxCWPhr5orpJf3JbzN9l8d3LVCiKbSSbh6IxcmxVNgDiuMjXXTIhKBLmii+xjrR9bPzJVVsc72FIp/RjpH/LGS/NPGVt9HQMV3vpAmK81mmMILLL1dlizOQJJ27PH+A2fS3i/y7uxY1C3yPIT3JY6X55fLnnUaNqWPN/BSOimsEReVZnQyXXHSc3vIAkAmfCvJ+tsUx5YserhIA=","merkle-array-index":2,"proof":{"hash-factory":{"hash-type":1},"path":["GE9mG7nBx60aMnFgjW3l5qSHHmMWWswzoap6nOM9oIY5ftyA6i2ekcofD2ZgS91tepBzYn7BYxybHquxPS//ow==","YN/XrHrudlPO6IzY5asdiBBitHZFwONst94bR94GDu0JVqlYnicUdV32df34Ge2gNIdXwYx9cGGd1mAw48yGPg=="],"tree-depth":2},"verifying-key":"Cjgw+zoVXw4gHsCWi1YvaZVj23hB+JIdL8ASAv4IYQtWeRFTDuzAC1QJRzgdL6QGBrKy3r1DLZ20PwbNem4YCChcExIDQTiytlYiSU7SdTJzdHhX2JYlW9qozIxdFM0IMVi6syldZXMn92cY3ggCKJUJeXELBmbRq2wRK8nifgvlD5PNZAWPqRswCEhBtt5JFF/lr5ViV0bqmVAFUfzw3tNWdUJhp/1QkhVqhQJIaQBIUMJ1rwmREQ5imcQS52pc4jAYQ9YJ+YI5lll1fV2Ex/4ZkoUqrMbeZg6INkxCIs40A0iCmg2rdhV9kul6AcURdAfLJeDhVLDRNVhBDZCZBwFrZjikDFPD1sYAeaAeh9TPXjfKs4beUV2RVgY2Z117XhSJhasIdioO9URSB0FTOQ6hXMr2NSAtwe2fSzTAzAM6CwNUvse2oolFcfK/1c6eV29eFztYLrtWIkf6f6vOgfAqmL9IsWHWdwamjAQ/Fa7koNTsNukpVf7H2wYx2hAMS0FbSt86RKWShpktKlVpcVza+trO0sabOW7xlFHYDzLxwfkXwLnaW9j1SqatIv5UuObEWDpChPiGYJ8Ry9Az2VWu8FHyywRMgDE1kSefq6qikzKvXztgYQ23SGQNV7D8UhHeJwb4IFtRi2qWNG06hgB+JZ7cc7IHHK/lvFpKj5yFxmm4DBAfWbJqiCWlOnjKaDDTz+MNVE5nzlreaJpUOMCcfrNKh7Sz52VWNAMHcZ/RDAyFykivHS655ScqGqFOINI1MtCGJLAbZPSD5Yqu0sTaneRqsSSRCEy7bdy82VgS1pRJ4NR0EaFbvJTzBWOeIEBYM/xudCKE6YQVzkG+EEwK3J+JsWBlcWCtKHEB23M0Dee+8SqJtkfjbHCMydLXZS2BQVqoxUKSOv1jJ4rONMhxFYsHP11+Clp1BBsH0gugudMmRgChI1kG/oTyeYEnTWkrltjSjdD3Zaqe+pfFaquCjzhUnjkLjJZ0Ba+Rppl/ZvNs8KcomMVcVGRf7eiHIIN6d8lldV2VTVzeh/e41t4YUqW6ri1CZpmq8BJJ1CBRusYFCTpLsqNjHs4nbVDX5XzkRl2t3XvEgphEaksQcJ2diZVwwfzAuouQ/PAbhsMEVm4534L8dB7b8hmaxhAKeaGnC94fUCCkpR6aqIFwEo+nMGi6pzcHb5uojfA4Ty5QlsVs+a/VXmTtI3GKbr1xInFGa0mXNR1TBbpd0zMmX2OhozNInjzQouJ5jAxK8t3sZYNNL9Lvb7qexWd1nUU1lXywKU4EV5VWC8ttQ1sLyK0b8ykHnSAXpP6o6khm2ENdpxinLWZyfU57OYAtwGui5IDxRLm8wE0xlN5LYKXlRNaDqfxAY1k5iUt2Z7CU8ZXm58JOtGQ0QldfaL+40gnJyZgTJGaTY1vBSmkAhPmnFrnko3NTXqKEKGeRhVAmbKlopk2mZ3IRlFSowdyslivIX9TPVgq4wbxmAY/kYMnpBV+WfF0WC2XSjvDcWnSecWPazMIwaVgn4cNILBjtJhB1+jePjnVagUkOhpwO7bzHPEdqpyAnsl2QyY6ISFf83+UvpA8wcWmWObqdyDJHzTBAbgWgEao5EAClW1Eia8n11mLQyFyM+BRUJlceAPMZEq4CDB7zqdIrEAF2hHT1RoEfvfBFhUT+sF58GkPpHReFO1gi3PoqpB9obIWHKzzvWs8IPWhG5JBdBqRVFVoTMF9HWM1UQooUryrop9EL1CEtWv5gXZE9a+oqAMtfukikbXXxVhAqNotk5I9MFUwY2p2CTDWYKMh6p45MEf27WtmNGWRBl1vl2Hw5D1uMgixekCLCfyFavx1T8ODGqBVgogVL1dYpJiAHTe6kUaasEVaJqncCwRtczvSIvdShlsH4Swy4pVXpNi6CuxQSyFwCmaPnqKrwvDGySc4RunD8IpDbAQhT3oQGgJGBXbVMyZ0HZIq2k0E0YaayhX1wrVtlM3raqM0OshM06GBKiuBwzMsAmWCQKvglZ3Mr+xGhNBXJwZsk0ZmAUGCWc02jCOKNBoOpHhLp6hw8gV+QHwVDIA2bBmnIUqfqU8teUvw4VV/HNeLbcoFolvKAB1DaJHsvkEtGumz0T+BLIfw+OJ9YbKz+OuYiYSIWQeCLs9a2DaqYu/5vmg5GKjI4IVgsNcPKeABgK5CTQn5od1XioiqDFgM41d8BsBPppR59EhrHuBhkk2CUqNA0EMiYhmqiUu6Q6utseiQmV2aF12MomdVZ49lEpRZ7eMMYvAKUU7BGbaAwmPt74l3uTc7GR/PA1zblkbirUAxeLezQ2kmcvYoNO9lC8rosYta4ybMzXjAHaoqAhnkR4HjVkUgRZzu8Rli8RfZYnQCuPKg/Se8ZWjParTnCqc4="}}}],"salt-version":0,"sig-commit":"OCB7px8WDlgndRDQJgk1FA6G9webviSuJ2qxJ6wy+tSdvdfuM3SGY9FvA08Hypgx35qRDzt2y4zUJ2uQcH1Oqw==","sig-proofs":{"hash-factory":{"hash-type":1},"path":["waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag=="],"tree-depth":5},"signed-weight":18000000000},"state-proof-type":0},"tx-type":"stpf"} diff --git a/api/test_resources/state_proof.txn b/api/test_resources/state_proof.txn new file mode 100644 index 0000000000000000000000000000000000000000..42babdc129e4638b92bbf9761988fad86c959cf2 GIT binary patch literal 61925 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 W3o@WY&-1t3-N)Io+|At?{C@z`XS03) literal 0 HcmV?d00001 diff --git a/api/test_resources/stpf_block.block b/api/test_resources/stpf_block.block new file mode 100644 index 0000000000000000000000000000000000000000..778d62967b31560ac04a73b7c2bdcf997d36a7f2 GIT binary patch literal 8365 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 NKia Date: Wed, 10 Aug 2022 21:52:04 +0000 Subject: [PATCH 20/39] Bump version to 2.14.0-rc1 --- .version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.version b/.version index fb2c0766b..39b888cfe 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -2.13.0 +2.14.0-rc1 From d525b29a9ada880d7525a5978ef1f40934676dda Mon Sep 17 00:00:00 2001 From: AlgoStephenAkiki <85183435+AlgoStephenAkiki@users.noreply.github.com> Date: Mon, 15 Aug 2022 13:23:02 -0400 Subject: [PATCH 21/39] Stop Panics if no config is supplied (#1180) Give a default config if not supplied to stop panics. --- cmd/algorand-indexer/api_config.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmd/algorand-indexer/api_config.go b/cmd/algorand-indexer/api_config.go index e5e88a081..2ae8a1c45 100644 --- a/cmd/algorand-indexer/api_config.go +++ b/cmd/algorand-indexer/api_config.go @@ -42,6 +42,8 @@ var apiConfigCmd = &cobra.Command{ fmt.Fprintf(os.Stderr, "failed to created disabled map config from file: %v", err) panic(exit{1}) } + } else { + potentialDisabledMapConfig = api.GetDefaultDisabledMapConfigForPostgres() } var displayDisabledMapConfig *api.DisplayDisabledMap From fc5f373e078816dfe56e4286c3d82dfd10b579fc Mon Sep 17 00:00:00 2001 From: Will Winder Date: Mon, 15 Aug 2022 19:16:58 -0400 Subject: [PATCH 22/39] Fix spec name collisions. (#1182) --- api/converter_utils.go | 4 +- api/generated/common/routes.go | 336 +++++++++++++-------------- api/generated/common/types.go | 46 ++-- api/generated/v2/routes.go | 402 ++++++++++++++++----------------- api/generated/v2/types.go | 46 ++-- api/indexer.oas2.json | 8 +- api/indexer.oas3.yml | 70 +++--- 7 files changed, 456 insertions(+), 456 deletions(-) diff --git a/api/converter_utils.go b/api/converter_utils.go index 1baf2381b..cf5a02120 100644 --- a/api/converter_utils.go +++ b/api/converter_utils.go @@ -468,7 +468,7 @@ func signedTxnWithAdToTransaction(stxn *transactions.SignedTxnWithAD, extra rowD }, } } - proof := generated.StateProof{ + proof := generated.StateProofFields{ PartProofs: &generated.MerkleArrayProof{ HashFactory: &generated.HashFactory{ HashType: uint64Ptr(uint64(stxn.Txn.StateProof.PartProofs.HashFactory.HashType)), @@ -490,7 +490,7 @@ func signedTxnWithAdToTransaction(stxn *transactions.SignedTxnWithAD, extra rowD PositionsToReveal: &stxn.Txn.StateProof.PositionsToReveal, } - message := generated.StateProofMessage{ + message := generated.IndexerStateProofMessage{ BlockHeadersCommitment: &stxn.Txn.Message.BlockHeadersCommitment, FirstAttestedRound: uint64Ptr(stxn.Txn.Message.FirstAttestedRound), LatestAttestedRound: uint64Ptr(stxn.Txn.Message.LastAttestedRound), diff --git a/api/generated/common/routes.go b/api/generated/common/routes.go index 5e464d873..8d22415a4 100644 --- a/api/generated/common/routes.go +++ b/api/generated/common/routes.go @@ -71,174 +71,174 @@ func RegisterHandlers(router interface { // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "H4sIAAAAAAAC/+y9e4/cNrIo/lWI/h1g7fxaM46zCc4aWBx47RgxYieGPckC15N7w5aqu5lRkwpJ9Uwn", - "19/9glWkREmU+jHjsRfIX/a0+KhiFYvFevHPWa42lZIgrZk9+XNWcc03YEHjXzzPVS1tJgr3VwEm16Ky", - "QsnZk/CNGauFXM3mM+F+rbhdz+YzyTfQtnH95zMNv9dCQzF7YnUN85nJ17DhbmC7q1xrP9KHD/MZLwoN", - "xgxn/VGWOyZkXtYFMKu5NDx3nwy7FnbN7FoY5jszIZmSwNSS2XWnMVsKKAtzFoD+vQa9i6D2k4+DOJ/d", - "ZLxcKc1lkS2V3nA7ezJ76vt92PvZz5BpVcIQx2dqsxASAkbQINQQh1nFClhiozW3zEHn8AwNrWIGuM7X", - "bKn0HjQJiBhXkPVm9uT9zIAsQCPlchBb/O9SA/wBmeV6BXb2yzxFu6UFnVmxSaD20lNOg6lLaxi2RRxX", - "YguSuV5n7HVtLFsA45K9ffGMffXVV/9gtIwWCs9wo1i1s8c4NVQouIXw+RCivn3xDOd/5xE8tBWvqlLk", - "3OGd3D5P2+/s5fMxZLqDJBhSSAsr0LTwxkB6rz51XyamCR33TVDbdebYZpywfscbliu5FKtaQ+G4sTZA", - "e9NUIAshV+wKdqMkbKb5eDtwAUul4UAupcZ3yqbx/J+UT/Naa5D5Lltp4Lh11lwOl+StXwqzVnVZsDXf", - "It58g2eA78tcX6Lzlpe1WyKRa/W0XCnDuF/BApa8Li0LE7Nalk5mudE8HzJhWKXVVhRQzJ0Yv16LfM1y", - "bmgIbMeuRVm65a8NFGPLnMZuD5s3nRxcJ60HIvT5LkaL156VgBvcCEP0v73x270ohPuJl0xY2Bhm6nzN", - "uPFQrVXpNruZs0iSsVLlvGQFt5wZq5yEWCrtj24SH3Pfv9VGWI4ELNhi128pi87o+/u49YGbqlQOsyUv", - "DaTXK2AfLxJiGR+SvCxnXvQ6jcFPmTU/8KoyGWKcGcstxG2qyrWQSkLiJG1+4Frznfvb2J1TF1BGzFrq", - "ZHmpDGRW7dEkgnKACxad/fGKHaVXsIs1MJzcfSCdCjlbOnFTljtmPQEcQ7CgRcyZWLKdqtk1bp1SXGF/", - "j43j6Q1zxEeSdVQepzeOMfdgMRKsvVCqBC6Rtb0OmTn6jZ9mZeBrau4OLpygaA66OSugBESyZUL81Vit", - "doi8Y4U5U5UjuqrtcHPIwg9Ln/t7BRlnVF2NMdmDdCk2wg7Rfc1vxKbeMFlvFqAdwcPJZxXTYGstkdga", - "WI40W3R2fsVXYBi4g1GQro3zOMEllWUaeL4el0oE0x5BtOE3mVa1LA5QKS1TOj6yTQW5WAooWDPKGCzt", - "NPvgEfI4eFpFNwInDDIKTjPLHnAk3CTI6ran+4IEiqh6xn7yZwd+teoKZHPEkLAEVmnYClWbptMIjDj1", - "9GVOKgtZpWEpboZAvvPL4SQEtfEH3MZrV7mSlgsJhTv7EGhlgaTNKEzRhMeqkAtu4Ju/j+lP7VcNV7BL", - "Ct0+AxA6zZ117b5Q32ksmhn2bOoD+ZDO2Jj/JnnvIL7DRhmJjYSO5L56oZK2D3T6H2AhiOem22l2K0sB", - "jRGOt7Gl6M308S4lRqwyGnGwS8Tqwp3FS1HiOf2b2xyBsrVx51KXtuHkNmIlua01PLmUX7i/WMbeWS4L", - "rgv3y4Z+el2XVrwTK/dTST+9UiuRvxOrsUUJsCYtB9htQ/+48dKWAnvToJuaInxOzVBx1/AKdhrcHDxf", - "4j83S2QkvtR/kO6FR6KtlmMApG7Lr5S6qqt4QfOO9WixYy+fjzELDjklD1F2mEpJA8i1T0mReOt/cz85", - "kQcSJXqkC5z/ZhTeRNqxK60q0FZAbK1z//0vDcvZk9n/d95a986pmzn3E7aXPzt2lNEG5taLMBJdXqiR", - "MrCpaktHe0o6NNv5fQNbf86WLGrxG+SWFqgLxgPYVHb30AHsYTd3t1qmo9UfuG59zfwjriMd7hke0sOR", - "fzL+9lTxlZCI+Jxdr0GyDb9yUoFLZdegmaMFGBuOeRJ/dPI3ZkavK3iF+2yW2jEJmppbE7Wl2iun7r5D", - "dfcuSNy7ex1B6xRIf1G+ofxgYe+SBVZ3RPtJ++vl5XteVaK4ubz8pXPjErKAmzQ9PiqxS7XKCm75aTy6", - "eu66Jhj0c+ahrm37rhjobpnnCCrc74l6V8t1x5vtJBn7l2RN7IrbC1VjwP6Ll1zmd3KcLvxQB1P4tZAC", - "gfiOTF1/kTmQuVnKuyCxX9072chktj54C/9F3NQebpwBtybtXZH0IELe840Qp7yLRfpUjP8Xx98tx/+r", - "VPnVSbScIhWOumfmb7VW+g64KOjvPaznsw0Yw1eQto/HKxkaHrJ0AWAkOzgU0Ir4HfDSrp+t4SMsZjT2", - "niW9aA1md7CwH3VbRba9ffhHWO1RyLvDHrkTomnM5756n49Q6iz54bK8Q9O+RD+cxuY4In8INuLYCJyI", - "3PJRlkKSw0Ao6SjFfSASuXAu5aV8Dksh0SP75FI6OXS+4Ebk5rw2oP0l4Gyl2BPmh3zOLb+Us3n/IBzz", - "p2CsiYemqhelyNkV7FJUoCCYtMmlXKnLy1+YVZaXkb85Co3xXr7WYDxkOZogc5yhapv5kLJMwzXXRQJ0", - "0/gYcWSK0Zmadc782OQK9SFrfvz0NhjEeYxYnMqevckkwmGE7MarOPr+oKx3HvJrRvzFagOG/brh1Xsh", - "7S8su6wfPfoK2NOqao2Wv7bBNQ5odFvcqQUUEUd6ZnBjNc8wHCCJvgVeIfXXwEy9wciSsmTYrRvDo9VK", - "842PLOhHB00QgOA47CyLMETk3lGvD/NIGRxS0H1CEmIbtoZyGF90LL2iW9TJ5NpzE5sI3by8fI9RmYEy", - "TZzQigtpwqlgxEq6TeAD3hbAcqcFQHHGXi4ZSrV5p7sPu/YSsxEdwlCMGrtwOKIDnOVcYuxaVWC0kJCM", - "y13f5WbA2uDnfAtXsLuI/OdH+mF9sA3fcyQWtRuuORZbCrNrbthGoQ82B2nLnY/fSbBmGphaSEuBBJ1o", - "sBGhgbsmCtNyGycWISOBblHUEq8qtirVwkuahkWfNDwa+owLlTcOAHMHAiV5ceoGzqUXguvEQtBGHIv1", - "Ox5RN96ttuEkeiez3FJog7FhwP0ZweMtcgLn+cC1ISj/XgNqZUpjAFeXpUzY0immb+JS5rOKaytyUR1m", - "RafR33T6uEH2He3Jw1wt+2f24EhNHiHUOFtwkz6+wX1xHFgbCmp0OAZBF2YibRkxOGMYhOK36qLEOMcm", - "Qp5ozDUGYAa0KWJ8DLT0vgAtW50qgNFdkVh5W3MTYjExoDiIiIPUnBHmvXALgAzs9k3EvbHeKty8JWz5", - "2PqPx7+8lIWTHWC6calNdEs4VobhwSGMjDKBQhRMCH0J8S7uX8ftdVkysWS1vJLq2inHx0S0zGdO86vT", - "RFISNT+351a0HNQ4sI8H+G8mIpuD6sflshQSWMZEswYW14Biv1UuKMS23Z9+DnAXgy+Y40E3wMEjpJg7", - "ArtSqqSB2Q8q3rFydQyQEgTKGB7GRmET/Q3pGx4qeKjrUTytkGluzINccBpm57BEwDBgfwEgKSyXCTln", - "7p635aXTVqwi5aUZJB2+/qCjans1zzwc0+PT1gfCCE+xo3Cic+8UbGJlMQCd1mQnIJ7WW1IkMLhepEW0", - "azURpL936hFdYWytHiDitwCgb/ZsIgL9lXfv1XR4orWifd7GXJIYSXP7GMck6TKyYkNLRRNa9aZ/bCft", - "EZ1WjJos/P06Us9SItntilxJA9LUmNliVa7Ks4EhwkAJqNlkHU0iu4Jd+g4DKGDfhW6RkYI9EEt3pXgY", - "qS4aVsJY6GSfNAGxbbzvDjM2Km4taDfR/37wP0/eP83+F8/+eJT94/8//+XPv394+MXgx8cf/vnP/9v9", - "6asP/3z4P/81Gzk1IKu0Ustx7Gyllw6/t0o1Uhk7MuzYQfPeMdgqCxkqqNmWlyPhNq7RC4OX5xeoyyYV", - "hg6xGSVPiRHTI057BbusEGWd5lc/7/fP3bQ/NPYmUy+uYIdqIfB8zRbc5mvUGzvTuzYTU5d8L8KvCOFX", - "/M7wPWw3uKZuYu3YpTvHf8i+6MnaKXGQYMAUcwypNrqkEwISj/rnUJKnZzyplzZn4RqeTVlZB5upCGNP", - "XZgiKMZPJRopiUs3wGkcC4yGwwQlYaNsLDPA6NALLlr/6TyIprnmzQ3+o19kY+ziy6wfJX2b9R9vgd5w", - "+EPRu6vwRaTeMXYa0pQGDIYbxw+2h7ki0/Ewp8EpycH8TbsluipQyqKMcRtuozZp7jDCBBXE5/CpujlK", - "e9N8NAaExFWCcE/xIltqtcGdN1RKI+YUIzfyDgu2R05vVl8iYsgvTnhi6vJeDxrw8nvY/ezaIlVd76CY", - "HrplWgNFuMP4a8vtSHM7X0CK8/2IezmfQnLH2B6LCZBBtuPbO3IHlGqVtjeUK9Q71KrN/IrZYQHu7gc3", - "kNe2Tfrr2RMbk+f9apN922k6Sydy21Jli2n9ARfKj7WHdG8aOfkxKcerSqstLzPv7BqT8VptvYzH5sE3", - "ds/qWHqbXXz79NUbDz66VYDrrLnOjGKF7ar/GKycXqL0iIgNmfFrbhtLQv/8984uYToOsmtMqO7dmJ2m", - "5ZmLBHTr/Ix2r3eYLYNefqT7y/tpCcUJfy1Ujbu2tbOTt7broeVbLspg4A7Qpg8VQq71kR99rsQD3NrT", - "Gznsszs9KQa7O7079kiieIaJzOkN5e8bpnyGdHPPxcstWsuRQTd85/iGzJNDkSTrTeY2XWZKkaddIHJh", - "HEtI8t67xgwbj1yT3YjuLE6PVYtoLNfMHGB06wEZzZFczBD9OrZ2C+XDi2opfq+BiQKkdZ807sXe9nS7", - "MdRmOfkKlPDxUQ2Xe7wE4YTHXH98NYtbIdeMcsolyN1rhpN6qnl8Gtrd5v7T2oiH+h8CMX35iQMxBuA+", - "byylgYsauzuXHZ/1EfFc8YwDLWMiFstvPi8qaim8F+AE6uwvPRYuWr7qSVpcHHWPiouo3Or2ZLKlVn9A", - "2nqIRtfr4fTRxNQ7PfjBt6Devhm5DYleZaUTSNWUobktSM3t+dZA9c/OxpnS1qVriTS66cbU9tjp040E", - "HBHsuP+ieBO8oAZvKJe04Z5hfbvOjSm9beMQ0XMav922HuahXYNfL3h+ldaeHUxP2yirjt/WKhY6NwWG", - "ulQ6Y1HAVtPW1+qpQG+E7R4D7cXsVE2Ypj1YB25VXuSqWNn15b5KoxLD1PKaSxsqLnmB5nsbIM+T63Wt", - "tLFYQC2JZQG52PAyrRIXuPoXHSWrECtBtZJqA1GlHz8Qq5SQlrioEKYq+Y7i2Nqleblkj+aRVPPUKMRW", - "GLEoAVt8SS0W3KCy0pquQheHHki7Ntj88QHN17UsNBR27YtQGcWa2wpafprwiQXYawDJHmG7L//BHmDg", - "iBFbeOhW0augsydf/gOrI9Efj9JCHmveTQndAqVuEPppPsbIGRrDHZ9+1LQUpqql4/J9YjdR10P2Erb0", - "R8L+vbThkq8gHY652QMT9UVqoherty6yoDpuqGwxYdPzg+VOPmVrbtZp/YDAYLnabITd+EACozaOn9pK", - "MzRpGI6KwpGEb+AKHzFKp2Jpu9792pioWksKa4yl+oFvoLusc8YNM7WDubWXeYF4xnyxpYIpWe4iiyau", - "jZsLFRSnbKLdeckqLaTFG3Ntl9l/s3zNNc+d+DsbAzdbfPP3Icj/wopUDGSu3PzyOMDvfd01GNDb9NLr", - "EbYPqpbvyx5IJbONkyjFQy/lu7tyNHAoHZUeJHo/KWF66EP1LTdKNspudYfdeCSpb8V4cmLAW7Jig89R", - "/Hg0ZvfOmbVOswevHYV+evvKaxkbpaFr+F2ERJGOvqLBagFbDJBPE8mNeUta6PIgKtwG+k/r9g8qZ6SW", - "hb2cughQsudwOdzPMdpjV2ylrq4AKiFX5wvXh1R1GrWvpK9AghFm/ABdrR3nuM/uyIssIjg0W0Cp5Mrc", - "P6cHwEf8yitAmfTy+T6oBwOHmpEZNh1fGNfOTfEm1JikoV37T3EiNZHVe9OI3/q244HQ7hijVJpnPvGF", - "on66HljC95qjnRxkQWodir81F3IkOhqgGIl8A5zxndJWUOwJwCeOY7Oa51dJE9iF+2Ka+DWKgI4i2czB", - "yRZoHX/j+lyE2VLeQ7EBY/mmSh/+aM4m+YCyxi1f08XdkQzkShaGGSFzYFAps96XRTyS/XYjcbJSGDoI", - "45qUudJUFRA1Hat6GZ6HLslkLmsXxkwrZccARZUoTkJWyjJe2zVI28R3A5Zp7mNCGSp4D6JjjgQpe+1O", - "nlBPkZflbs6E/RuNo31QI2cb0FclMKsB2PVaGWAl8C20FdNxtL8ZdnEjCoP10Eu4EblaaV6tRc6ULkCf", - "sRfe5413M+rk53t0xnxuno9Pv7iRiF6hgC5uMZ6EZkgzaDwsMcZzOtb7P2MhawPlFswZu7hWBIRp85mN", - "U406PRa1pbyeQiyXgNID0cErHfZrP0QwYe13DAFvhvU43b8MsDcyQ6195GpryX5yI59RI+aTYbpuq97W", - "2NA9OjBUCcUK9JzMu7jsYgNt/rrTKJW2rRlpCZQj4uStkFaros6BsqbfdfgxAksMQGrKJUdxB8hDofR+", - "C2cwAQVJf8bYS1S7H5HyJ1UXQ6QdbEFTDH870AMSOhFcxnKNARsYv+FRheJh+sioq5XmBRzmbUUh+BP1", - "aLJ9wwhbddwAP7v2fWWuozF19JC07hBFxLuzL5blKVk2qhC+HUueekE16zWUlL+C5c6x7Xyg7i0BMiNk", - "2ia7BEDZzvMcKsfO8WNDAE5QkWqNogLTbcOJ7ygsrdgCZdZMqChZzsu8LilKdUL/uM55qbvOnRKWVjkG", - "i9+gaA2Vws21wChZqhNO82knAKMeWGdkC3rnW9CdLpTldptD9yIShhlsWQlbSN+0gFMi23fqmm243DW0", - "cFO0YMyjdJcGctKg0N1N1P7JXzcj8Gkzea6bBtKRYmRxi5jOFWihCpEzIX8Dv5sbsRQ4hur7K2mFrPFZ", - "BA0t3HROMMzJ6+fdDTlAj1UWcB+6Ie4SrjvULiItsxsQbiy/AgI7ZA/6o/FQmmowoqhHDKya513IjmNG", - "v3nfcgvnuiGtuSO+7EmoZpNPbbo+L/fYpket4SqNyqmO8D1EWPEmf4Z5QZ2IkfUlS0LLkRuZsirYwULK", - "fjP2FrTpRl9Glkm42TO2a9EZnwq5aEVWj+NnyUJwjRmdb0fiuOW5oHxRzi32Bx/dkVjBkSo3DQDmWth8", - "nY0knLi21IISdnr3v+GUpELgLoTlEnJ7CAyYuUDPXIxCQZ8dFM+BF5gG2iahUPpJH5QHPyjmhjaRXiON", - "QC20VWtwlIdHVCltOGQf8/+sDuT9rcL/oeP2gG0QFBlP+7Qxltp45mlzjjnbgcFVaWJpoz1SKcPLtN8p", - "TFpAyXdTU2KD7qSNYhtcb3TmcHeGuQOFYnfTQdHR1H6fTU3umvQRbrbncFfE9fP7lPx2y8uR3Ji3UGkw", - "TmFknF18+/SV9zCOZcjkowld3PpMasvZaPGDD3O88KRFBAWx4Xf/OFfSujoWuEZxa+7zoPdpAQ9jRcKi", - "BQ1xkEOAvg9h+qziwrvP2/Sg4cr6lLFhEt8hof4tgftI+EQsHCSFyXfcrF/w3Cq9G1Yoc+r+SOq/99Ac", - "s8RffpPmTgdCehJ0//iiAmiwXdaStPcmqgIjGoL4VstBZQGGpQXW/OsvH/+fx19/E/58/PU3cRmB5ru7", - "1NDXVCGBuM7eMKCFrfEzVeBh4TWJIaVHyxEWi6wJ2U29KjOf+XKCcQ21vXH6wmQbsdIoodOjjpdBjAyq", - "ibxH0gwS75t5KTyuOvSYtIN4D+IWvPbeGWZOMfRrNFU9ddijEXKEq5ctz09WVoy2B8Yq2hHbuV3Tbvhc", - "kjM0uPOtGgHXFkfu3f9Ob91BKenErjBiU5UUlODpNih2cFQiZhs7+fFDce86jvGjRyLCyQ7xuw9APBWW", - "/eUcpsMOf5TP1KYqYVxTqSichN5UJJ0OC9hEr+cFI6DK81q31uF+YOHPvBT0rJPBIjZSqQqr1lRWSPcf", - "zGlUtaX/A9fuP1RSrfs/4qroUHJDzZAuWEYiDBRSFmZOmSzoKuv7po6sE/OiD3JrDLWghCRq3UEjNe4w", - "Hz7WQiOv09AhnOtdZdU5tsEm58bqOreGfMLRbH2ZUnFtyQ22v0J+/wxxol8ZQVZNqzINW+Bjd3aqd/F7", - "De5OgHY715g1A3TW98hd2l9dGtuMB+7EThUK9OS5JXuXL4eDr4BuePWeZvmFZewtQdxU33Qd2MasquN9", - "gDRU8t1UXtpsVIe4vHyPzuh3vLTxueEA8t6oxtcyXraKbPaj8br374sVq1uwoEMYiuwaxGqdRur6yGPd", - "i9uBCG3p97rVDXvPTpBDAHgB2mRtNGL6ZvcpFpsKT7gpjDvaxk3zyxNWbT4r3Z38oPHL08aXGdpE5BTB", - "35w09FbZA4i2vX+iTfNiU96IAO7y4xY05RgdLJp+Dj0+zGf3uqfeNqfH8ISK8DsMi3hRomMqfZkOX4No", - "byv1cVmwaH7DUE4nIiDwGAFp9e6UtH+xykypjkDvnVi9cx32LGloNljTUl2Dzty8EyQuu7Gm1LJTybAp", - "RU3jkQsPCuaQMactBA181Er4LvvXoh275y3lZa5k1pn9foUynd0ZclfWZA/uWT2+6a5eFdTJY09QFBI7", - "IVfjFZquYPe5yb2LKGqrlxoMN3bi4KEo5sbTFhW5uvbeDbJed5XuPfVr3V0Ra1f6st4T+2o0hnsjcq04", - "egnbAofAaNy2Fqu/abpP7WpMeT5HnulF3Kjzxa6CJtRoWAZ8w6voIWJu2BWcIucOP2CbynGcbSG3SseJ", - "Hf6RbawH2VuaNsZlDWWFgqq1gp59Vuz7c3Qy95yg0+uTb5CBIhdFHJXm/j9cMqsB7j++6gp2WSmWYMVI", - "QkGJCU3fw46FZmd3plOMVSLouHbQ7FFSpGNbXYEpTV9W+CUu4sBIjmLmkAl/GVaABb1xrLhW12xT52u8", - "R/IVhDIGaJrHeLneRJ3RQ2ZntxyHj4Q3Fc9pIMqWK7legWY+gY35Z9oaU/+Gi95j9P0cFYxg4Cm3y77i", - "Cq8pgy6SXegki0osJGo4BDCuYHdOPiD8/QRBMl6pYQQwrNfwEUG6VdmHuHLIHn696rjP6PGBTrGVBvw7", - "dKM5+Lwh60g32rAmyqHoIR64HWoDQzwPjzGO1zZhbmlxO9QHPFzccdetXRziuh13JaKgpwXByv4MQWW/", - "fvkr07AEjXm8X3yBE3zxxdw3/fVx97NjvC++SDve78trTGvkx/DzJjmm+7xVz4NGB7/BMslLirJwh5yS", - "GF9Ulr3gblkwTMJDlYVLBnILpaog2ZoWOCI6FlvRsKpLTkHNQkrQnU6HZNGTecreSG+KxT8vbmSqbaxi", - "YutoOVLPH0WvEp/2LljvnQuqYZBjtYBTR2zrDbQjUl7ybUZ8QUnRzYg41BL0bca88GMc8OTMSmoqLkXG", - "YhFy5FApJgp3uanJmwtP0YTs/yZwH36veekTEySmAVxgBnx+BZJemXGSz78txkCaWnuTtYMVx3Og+GFU", - "fMCbtsmp781kU2846Jy8Ez780udEYjUH6upUj8IRR01XSHft3bVzovBLjpVffMNQ2QsDm/Zdx5CN9Wbc", - "Btmr6BiHQWN1o9B/ZPi2dHn7NHi67k9bwKl3WlPB2gcvnz9kWNx4rMxsdPnaj3ZcPf0wiCjRdgBLv87T", - "MVAsAcZiz3vpOmwJI66KfTW6l9u2PDe26scL7oXywKzI77jBetu+uc+T+ExTITtAspfPkypHpy7d0TWc", - "57OVVnU6R21FtRJ7Ob14MUCliy71FFp0/vjrb1ghVmDsGfs3Fq6hw3f4MkeXmky0L350HhZiCFhTDI30", - "IZ8eE8259gQdpEEJnyaDw9w/hU8pHTqfoV6S2ZtUKt/Lgc7CKp9ThHW8InnTidG8iwQ+Ia3mJHwztVwm", - "a9v9iL+3cRo6yGQNQ6ofIJWvYKfhVN3le+xMXqxJyVNumzr5pwmeEsaebSpvEtvnq8dZu4PO2CvXm4Fc", - "Ku1u2psaPdFwgzVuvEM41lKx8Ittn7DDmi/yD9AKDQmSKZnD4AwU0WJjShDPUZ83Pq/NwdAUsWuMlQ/e", - "oTYzJyAf0j11uNVYLa0g9cct48/RKlbu4HFA/3stygQXVMp9NzEccyYVo8dZ45aUwNkWMCKYfdGADiPd", - "7zaPC3kW6SAUxwkFFUVu61+3Vop8zWX72uT+aslDnjzshbjBKwKJbX6XVZ0n4Py0kYNSjeQySf92hbug", - "YCmhxqJ2vwBXfLcBaU+UfG+oN8XO4GtrevoGoEduAKH3vrfrrmCXWZUeG8jZRJp5c9VC2ylJ2wjH+ci9", - "p0kICe90tror7SCnIixrdPJG7sxgO/VXuibA7Qp2bTRW/EwQXZtOuGXRsZi2jF+IDbT3ElLkUiqQOOhI", - "pOtl+l5L1R9IZP9tAp1mmGmuMCNcQX2neeJg32/EtpHzd1DR4YRdEIXJYXb4RJD/roJuFkrnqb9u2jXa", - "DM7Y8yYdHgMjKTG0zZEne1Y/fJJK3TWVB4UOdi+ugw0bIywvL99XlJSTEAS+AelGrs1QS/JNeL5cNQ8G", - "JwxBodnNEnTbLmWMCS2X+o+24dAOFJoN35pOtDK2QofRGKXbKNGK72ZBGZzNZw4t948D2/271H/M8BHm", - "Eh8wq5bDINH0BvY8keE8iXzMWffW2lEkm53YstYeC+jkwzc+yww9RtGpeqx5MjaqU6nP9odnvCwvbiTN", - "lEh6IqE7FkxMb0n5+iGNhHZi3McTB6uVlw6xd4bnuVPxijY/OYLzb4b1K5ZT1vKwZnkqqPRQCZ14O7zh", - "Ta5Xo3ijwWqohoqccb2qN+RQ+Pj47cFg9J0eUfiCSsPHZrzKRmKh1lAwpX3RErH0FWnGqiUf+IIEvbn+", - "Sq1E3qqGbcr0CKfP3eUHKl+3VMksb0Ld3TnpbphWsUsKEb+cnbGXVOBAAy9IwGphIfWWQQd/rAF3DfhG", - "Y+DorKFu9FLNmdtFnbciDHK2BoypSLxe8p/6OgavTD1CsTGpRFpVl0ifgELP3ExtgA8RKedSKvsfRKcj", - "X8folpSOEzuqqnkmowS37r/XGMDrBDYOO2KjVRrESk49CL/k4SAwfXIlj4OulPKFlWLCm8Ep0ajjpwlR", - "9LzQYPTuMy8yJcvdVEpCQrw2azH5KnxTVsu0yUDGYxnVlT4MxSBm3kQYImMHVfYu8TvhMZNbv2DSG6Aj", - "Nfb17WQ8Jd48ic/C/tD7NLPIyzmpmVGR49IhTvJJQxbOzyCxZEH1j+s2gepSPmV/gFb+stoM5TZEaxv3", - "RTB9JbizRKemWLkZdOtPeWQxeEJ+QjscfWTh8vL9DR9oGQjTLfSL097L2EvjFyPFuGMaB1eZr759yyr7", - "NOPEwrZJoEOPGC+KXl3iOO6LhExTV5dW21clR2bh1yMFwCepuZyk5sT4nXIh1+F2OPEufbhNUmGW67Di", - "1COVaDqeNNm+1jCc+pDN3wQPHMQa4YZ8W+YIs06wx8QbKpwiR582z2N54FQD3xnzIsQ72sPvOthxymWQ", - "ZsE3F7zHMae5k4nOtQ2v7vSFlr3CI4J4POYARiMO2iI84cl6P15U9RQHaEMbnKoZnJEJjfFI1MPoaQri", - "137pFR6XRDZrVZcFVUXeYN2g9oqZII5/SqFRC9s3LiiKA4Mu4qRvE80QrzVjL93IvLzmOxPstC1jjQ8X", - "VpVqJydshHFhMTIup9dG5xQ5DrmoBEjbhNzEdHE8Pm7dTA/sraRO6FDFI7FtjBY+Fp+3j5N0PW/B8eaf", - "WeDRAT33y8zLrrWABg6WaNfmWRg7YNSQNDrP9teTSD1V0yzpHpnnXaOTws6bFY+VcdSLhBxNMy7dZP9J", - "7RGfjHSNHNFec33VOQN55xVzuaLyBp1ROypGVJTghEf+vSfjTfuKOcaBN34FnwRQsLdcFmrDXoRKLg9+", - "fvviIdNg6tIGJgulNh3zeUg+0/f/K730mL/rvfofwuDJobISxuqE3fLesRo8yT72TP2SnsinoCPyVyde", - "xnfYHfA6fufB97EZr4pucThTL/AdFSGpguSC2xyDWQYgmImp9wQ4uDYloYpRDrfF9LANg+j6HdOZpert", - "n8+NgfbcJIJ3dVp6esfNseLTdyP56Wc6TT0k7bDNnIiKVjp6hsrvvYP/VkpWNAWlbjntw/jXe1plqxtR", - "2r6jJZvA0MiPsDfitDveyKO/Xs/CSfD5DzHUuNyEePr7s6XVjPyb7fT+VxkpP8taFqa3hO07tBPu10nd", - "x6s+oc2kJ3dMKThUE+jk0XYhQb+lz0NpU6h7T03jm0z0+tKPstz5imT90uXtUlZabUWRegG2VCuRG7LA", - "HOswfhX6fpjPNnVpxYnjvA59yYOdPg7Fyh+FsuC6YFA8/vrrL//RrdTxGYmr4SIlo3s8Wt7IyK3Iu3ps", - "g90BQiyQ8mylhiJr1NemV63rofGtzfEVuTZ47jgXGQIyng0f7Kw+PmSxYzxideXU9tKK9qe5+23NzboV", - "ndFLgPhCI2deXvWD/jDl6NM8NR5tiuxWcRm97TEmONpN8jnsjd5L/CI/WCS+jiTJ8KE8jyKZXR2/hDxM", - "XOuqBKfbtTJwtMpTIA0d+WHOd2L4oG48XnrVsQG+/KOcJkJFOZ0y2WpcaCBooTohOHiwPu9iuFJ1+tYa", - "jIMoHXyz1sniI1PFF9vCLYkawEfR9l1vTXvFSnDdRjXc6uoT1Vea4oHPo7BDOg5rWmUeK8/ADsnLa2ql", - "9WukjWvPUUnQw6qThDpR3Yvz4f0HcW1jAWmmCiFpFyEGzb9ZFIofsJfE8W0cI6qukqrW+Kp/5O719am7", - "S3T7xPwPmBOwVFTjQFqe492AnhucPfUjzfzrdrO1tZV5cn5+fX19FqY5y9XmfIV5TZlVdb4+DwPRu+9x", - "GT/fxb/A4k7acmdFbtjTNy9RLxa2BEyRKOAG0Wmkx+zx2SOq/giSV2L2ZPbV2aOzL2lXrJEVzqmsLb2t", - "hng4RkHl92WBiehXEBfGxdcksfQtdn/86FFYBn8zjByS578ZkmGH+UjjaXCRuwvxAD1oD6PXbIcc9JO8", - "kupasm+1ViQTTb3ZcL3DPGhba2nY40ePmFj6cr5U/oM7zez9jHJwZ7+4fufbx+dRZFjvl/M/Q1CGKD7s", - "+XzOq8pkkct4b/vgd59slcjbO7zPQTP0HtcKbdPzRb+e/9l1Sn84sNm5j8APbftA4t/nfwar74eJT+e+", - "iMRU9xH86NGC8z8psJmsCNFU6U4difynvfHQobFVu+04e/L+z548gBu+qUpAUTD78EvDho0k8ez4Yd78", - "Uip1VVfxLwa4ztezD798+H8BAAD//wfJpixV0AAA", + "H4sIAAAAAAAC/+y9fW/cttIo/lWI/T1Ak/5WdpqeFk8DHDzISRo0aNIGidsD3Lj3livN7rLWkipJ2d7m", + "+rtfcIaUKInSvthxcoD+lXjFlxnOcDicN36Y5WpTKQnSmtmTD7OKa74BCxr/4nmuamkzUbi/CjC5FpUV", + "Ss6ehG/MWC3kajafCfdrxe16Np9JvoG2jes/n2n4sxYaitkTq2uYz0y+hg13A9tt5Vr7kW5u5jNeFBqM", + "Gc76syy3TMi8rAtgVnNpeO4+GXYl7JrZtTDMd2ZCMiWBqSWz605jthRQFuYkAP1nDXobQe0nHwdxPrvO", + "eLlSmssiWyq94Xb2ZPbU97vZ+dnPkGlVwhDHZ2qzEBICRtAg1BCHWcUKWGKjNbfMQefwDA2tYga4ztds", + "qfQONAmIGFeQ9Wb25P3MgCxAI+VyEJf436UG+Asyy/UK7Oy3eYp2Sws6s2KTQO2lp5wGU5fWMGyLOK7E", + "JUjmep2w17WxbAGMS/b2xTP29ddff8doGS0UnuFGsWpnj3FqqFBwC+HzPkR9++IZzv/OI7hvK15Vpci5", + "wzu5fZ6239nL52PIdAdJMKSQFlagaeGNgfRefeq+TEwTOu6aoLbrzLHNOGH9jjcsV3IpVrWGwnFjbYD2", + "pqlAFkKu2AVsR0nYTPPxduAClkrDnlxKje+UTeP5Pymf5rXWIPNtttLAceusuRwuyVu/FGat6rJga36J", + "ePMNngG+L3N9ic6XvKzdEolcq6flShnG/QoWsOR1aVmYmNWydDLLjeb5kAnDKq0uRQHF3Inxq7XI1yzn", + "hobAduxKlKVb/tpAMbbMaex2sHnTycF11HogQp/vYrR47VgJuMaNMET/+2u/3YtCuJ94yYSFjWGmzteM", + "Gw/VWpVus5s5iyQZK1XOS1Zwy5mxykmIpdL+6CbxMff9W22E5UjAgi22/Zay6Iy+u49bH7iuSuUwW/LS", + "QHq9AvbxIiGW8SHJy3LmRa/TGPyUWfMDryqTIcaZsdxC3KaqXAupJCRO0uYHrjXfur+N3Tp1AWXErKVO", + "lpfKQGbVDk0iKAe4YNHZH6/YQXoFO1sDw8ndB9KpkLOlEzdluWXWE8AxBAtaxJyJJduqml3h1inFBfb3", + "2Die3jBHfCRZR+VxeuMYcw8WI8HaC6VK4BJZ2+uQmaPf+GlWBr6m5u7gwgmK5qCbswJKQCRbJsRfjdVq", + "i8g7VpgzVTmiq9oON4cs/LD0ub9XkHFG1dUYkx1Il2Ij7BDd1/xabOoNk/VmAdoRPJx8VjENttYSia2B", + "5UizRWfnV3wFhoE7GAXp2jiPE1xSWaaB5+txqUQw7RBEG36daVXLYg+V0jKl4yPbVJCLpYCCNaOMwdJO", + "swseIQ+Dp1V0I3DCIKPgNLPsAEfCdYKsbnu6L0igiKon7Bd/duBXqy5ANkcMCUtglYZLoWrTdBqBEaee", + "vsxJZSGrNCzF9RDId345nISgNv6A23jtKlfSciGhcGcfAq0skLQZhSma8FAVcsENfPuPMf2p/arhArZJ", + "odtnAEKnubOu3RfqO41FM8OOTb0nH9IZG/PfJO/txXfYKCOxkdCR3FcvVNL2gU7/PSwE8dx0O81uZSmg", + "McLxNrYUvZk+3qXEiFVGIw52iVidubN4KUo8p/9wmyNQtjbuXOrSNpzcRqwkt7WGJ+fyS/cXy9g7y2XB", + "deF+2dBPr+vSindi5X4q6adXaiXyd2I1tigB1qTlALtt6B83XtpSYK8bdFNThM+pGSruGl7AVoObg+dL", + "/Od6iYzEl/ov0r3wSLTVcgyA1G35lVIXdRUvaN6xHi227OXzMWbBIafkIcoOUylpALn2KSkSb/1v7icn", + "8kCiRI90gdM/jMKbSDt2pVUF2gqIrXXuv/+lYTl7Mvv/Tlvr3il1M6d+wvbyZ8eOMtrA3HoRRqLLCzVS", + "BjZVbeloT0mHZju/b2Drz9mSRS3+gNzSAnXBeACbym4fOoA97ObuVst0tPo9162vmX/EdaTDPcNDejjy", + "L8bfniq+EhIRn7OrNUi24RdOKnCp7Bo0c7QAY8MxT+KPTv7GzOh1Ba9wn8xSOyZBU3NrorZUe+XU3Xeo", + "7t4FiXt3rwNonQLpb8o3lB8s7F2ywOqOaD9pfz0/f8+rShTX5+e/dW5cQhZwnabHRyV2qVZZwS0/jkdX", + "z13XBIN+zjzUtW3fFQPdLfMcQIX7PVHvarnueLMdJWP/lqyJXXF7oWoM2H/xksv8To7ThR9qbwq/FlIg", + "ED+QqetvMgcyN0t5FyT2q3snG5nM1ntv4b+Jm9rDjTPg1qS9K5LuRch7vhHilHexSJ+K8f/m+Lvl+H+V", + "Kr84ipZTpMJRd8z8vdZK3wEXBf29h/V8tgFj+ArS9vF4JUPDfZYuAIxkB4cCWhF/AF7a9bM1fITFjMbe", + "saRnrcHsDhb2o26ryLa3C/8Iqx0KeXfYA3dCNI353Ffv8xFKnSXfX5Z3aNqX6PvT2BxG5JtgI46NwInI", + "LR9lKSQ5DISSjlLcByKRC+dcnsvnsBQSPbJPzqWTQ6cLbkRuTmsD2l8CTlaKPWF+yOfc8nM5m/cPwjF/", + "CsaaeGiqelGKnF3ANkUFCoJJm1zKlTo//41ZZXkZ+Zuj0Bjv5WsNxkOWowkyxxmqtpkPKcs0XHFdJEA3", + "jY8RR6YYnalZ58yPTa5QH7Lmx09vg0Gcx4jFqezZm0wiHEbIbryKo+9PynrnIb9ixF+sNmDY7xtevRfS", + "/say8/rRo6+BPa2q1mj5extc44BGt8WdWkARcaRnBtdW8wzDAZLoW+AVUn8NzNQbjCwpS4bdujE8Wq00", + "3/jIgn500AQBCI79zrIIQ0TuHfW6mUfK4JCC7hOSENuwNZTD+KJD6RXdoo4m146b2ETo5vn5e4zKDJRp", + "4oRWXEgTTgUjVtJtAh/wtgCWOy0AihP2cslQqs073X3YtZeYjegQhmLU2JnDER3gLOcSY9eqAqOFhGRc", + "bvsuNwPWBj/nW7iA7VnkPz/QD+uDbfiOI7Go3XDNsdhSmF1xwzYKfbA5SFtuffxOgjXTwNRCWgok6ESD", + "jQgN3DVRmJbbOLEIGQl0i6KWeFWxVakWXtI0LPqk4dHQZ1yovHEAmDsQKMmLUzdwLr0QXCcWgjbiWKzf", + "4Yi68W61DSfRO5rllkIbjA0D7s8IHm+RIzjPB64NQfn3GlArUxoDuLosZcKWTjF9E5cyn1VcW5GLaj8r", + "Oo3+ptPHDbLraE8e5mrZP7MHR2ryCKHG2YKb9PEN7ovjwNpQUKPDMQi6MBNpy4jBCcMgFL9VFyXGOTYR", + "8kRjrjEAM6BNEeNjoKX3BWjZ6lQBjO6KxMrbmpsQi4kBxUFE7KXmjDDvmVsAZGC3byLujfVW4eYt4ZKP", + "rf94/MtLWTjZAaYbl9pEt4RjZRgeHMLIKBMoRMGE0JcQ7+L+ddxelyUTS1bLC6munHJ8SETLfOY0vzpN", + "JCVR83N7bkXLQY0D+3iAvzAR2RxUPy+XpZDAMiaaNbC4BhT7rXJBIbbt/vRzgLsYfMkcD7oB9h4hxdwR", + "2JVSJQ3MflLxjpWrQ4CUIFDG8DA2Cpvob0jf8FDBQ12P4mmFTHNjHuSC0zA7hyUChgH7CwBJYblMyDlz", + "97xLXjptxSpSXppB0uHrDzqqtlfzzMMxPT5tfSCM8BQ7CCc6947BJlYWA9BpTXYC4mm9JUUCg+tFWkS7", + "VhNB+junHtEVxtbqASJ+CwD6Zs8mItBfeXdeTYcnWiva523MJYmRNLePcUySLiMrNrRUNKFVb/rHdtIe", + "0WnFqMnC368j9Swlkt2uyJU0IE2NmS1W5ao8GRgiDJSAmk3W0SSyC9im7zCAAvZd6BYZKdgDsXRXioeR", + "6qJhJYyFTvZJExDbxvtuMWOj4taCdhP97wf/8+T90+x/8eyvR9l3///pbx/+cfPwy8GPj2/++c//2/3p", + "65t/Pvyf/5qNnBqQVVqp5Th2ttJLh99bpRqpjB0Zduygee8YXCoLGSqo2SUvR8JtXKMXBi/PL1CXTSoM", + "HWIzSp4SI6ZHnPYCtlkhyjrNr37eH5+7aX9q7E2mXlzAFtVC4PmaLbjN16g3dqZ3bSamLvlOhF8Rwq/4", + "neG7325wTd3E2rFLd47/kH3Rk7VT4iDBgCnmGFJtdEknBCQe9c+hJE/PeFIvbc7CNTyZsrIONlMRxp66", + "MEVQjJ9KNFISl26A0zgWGA2HCUrCRtlYZoDRvhdctP7TeRBNc8WbG/xHv8jG2MWXWT9K+jbrP94CveHw", + "+6J3V+GLSL1D7DSkKQ0YDDeOH2wHc0Wm42FOg1OSg/mbdkt0VaCURRnjNtxGbdLcfoQJKojP4VN1c5T2", + "pvloDAiJqwThnuJFttRqgztvqJRGzClGbuQdFmyPnN6svkTEkF+c8MTU5Z0eNODlj7D91bVFqrreQTHd", + "d8u0Bopwh/HXltuR5na+gBTn+xF3cj6F5I6xPRYTIINsx7d34A4o1SptbyhXqHeoVZv5FbPDAtzdD64h", + "r22b9NezJzYmz/vVJvu203SWTuS2pcoW0/oDLpQfawfp3jRy8mNSjleVVpe8zLyza0zGa3XpZTw2D76x", + "e1bH0tvs7Punr9548NGtAlxnzXVmFCtsV/3HYOX0EqVHRGzIjF9z21gS+ue/d3YJ03GQXWFCde/G7DQt", + "z1wkoFvnZ7R7vcNsGfTyA91f3k9LKE74a6Fq3LWtnZ28tV0PLb/kogwG7gBt+lAh5Fof+cHnSjzArT29", + "kcM+u9OTYrC707tjhySKZ5jInN5Q/r5hymdIN/dcvNyitRwZdMO3jm/IPDkUSbLeZG7TZaYUedoFIhfG", + "sYQk771rzLDxyDXZjejO4vRYtYjGcs3MHka3HpDRHMnFDNGvY2u3UD68qJbizxqYKEBa90njXuxtT7cb", + "Q22Wo69ACR8f1XC5x0sQTnjI9cdXs7gVcs0ox1yC3L1mOKmnmsenod1t7j+tjXio/yEQ05efOBBjAO7z", + "xlIauKixu3PZ8VkfEM8VzzjQMiZisfzm86KilsJ7AY6gzu7SY+Gi5auepMXFQfeouIjKrW5PJltq9Rek", + "rYdodL0aTh9NTL3Tg+99C+rtm5HbkOhVVjqCVE0ZmtuC1Nyebw1U/+xsnCltXbqWSKObbkxtj50+3UjA", + "EcGO+y+KN8ELavCGckkb7hnWt+vcmNLbNg4RPaXx223rYR7aNfjVgucXae3ZwfS0jbLq+G2tYqFzU2Co", + "S6UTFgVsNW19rZ4K9EbY7jHQXsyO1YRp2r114FblRa6KlV1f7qs0KjFMLa+4tKHikhdovrcB8jy5XldK", + "G4sF1JJYFpCLDS/TKnGBq3/WUbIKsRJUK6k2EFX68QOxSglpiYsKYaqSbymOrV2al0v2aB5JNU+NQlwK", + "IxYlYIuvqMWCG1RWWtNV6OLQA2nXBps/3qP5upaFhsKufREqo1hzW0HLTxM+sQB7BSDZI2z31XfsAQaO", + "GHEJD90qehV09uSr77A6Ev3xKC3ksebdlNAtUOoGoZ/mY4ycoTHc8elHTUthqlo6Lt8ndhN13WcvYUt/", + "JOzeSxsu+QrS4ZibHTBRX6QmerF66yILquOGyhYTNj0/WO7kU7bmZp3WDwgMlqvNRtiNDyQwauP4qa00", + "Q5OG4agoHEn4Bq7wEaN0Kpa2692vjYmqtaSwxliqn/gGuss6Z9wwUzuYW3uZF4gnzBdbKpiS5TayaOLa", + "uLlQQXHKJtqdl6zSQlq8Mdd2mf03y9dc89yJv5MxcLPFt/8YgvwvrEjFQObKzS8PA/ze112DAX2ZXno9", + "wvZB1fJ92QOpZLZxEqV46KV8d1eOBg6lo9KDRO8nJUwPva++5UbJRtmt7rAbjyT1rRhPTgx4S1Zs8DmI", + "Hw/G7N45s9Zp9uC1o9Avb195LWOjNHQNv4uQKNLRVzRYLeASA+TTRHJj3pIWutyLCreB/tO6/YPKGall", + "YS+nLgKU7DlcDvdzjPbYFVupiwuASsjV6cL1IVWdRu0r6SuQYIQZP0BXa8c57rM78iKLCA7NFlAquTL3", + "z+kB8BG/8gpQJr18vgvqwcChZmSGTccXxrVzU7wJNSZpaNf+U5xITWT1zjTit77teCC0O8YoleaZT3yh", + "qJ+uB5bwveJoJwdZkFqH4m/NhRyJjgYoRiLfAGd8p7QVFHsC8Inj2Kzm+UXSBHbmvpgmfo0ioKNINrN3", + "sgVax9+4PmdhtpT3UGzAWL6p0oc/mrNJPqCsccvXdHF3JAO5koVhRsgcGFTKrHdlEY9kv11LnKwUhg7C", + "uCZlrjRVBURNx6pehue+SzKZy9qFMdNK2TFAUSWKk5CVsozXdg3SNvHdgGWa+5hQhgreg+iYI0HKXruT", + "J9RT5GW5nTNhv6BxtA9q5GwD+qIEZjUAu1orA6wEfgltxXQc7QvDzq5FYbAeegnXIlcrzau1yJnSBegT", + "9sL7vPFuRp38fI9OmM/N8/HpZ9cS0SsU0MUtxpPQDGkGjYclxnhOx3r/ZyxkbaC8BHPCzq4UAWHafGbj", + "VKNOj0VtKa+nEMsloPRAdPBKh/3aDxFMWPsdQ8CbYT1O9y8D7LXMUGsfudpasp9cy2fUiPlkmK7bqrc1", + "NnSPDgxVQrECPSfzLi672ECbv+40SqVta0ZaAuWIOHkrpNWqqHOgrOl3HX6MwBIDkJpyyVHcAfJQKL3f", + "whlMQEHSnzD2EtXuR6T8SdXFEGkHl6Aphr8d6AEJnQguY7nGgA2M3/CoQvEwfWTU1UrzAvbztqIQ/IV6", + "NNm+YYRLddgAv7r2fWWuozF19JC07hBFxLuzL5blKVk2qhC+HUueekE16zWUlL+C5c6x7Xyg7i0BMiNk", + "2ia7BEDZzvMcKsfO8WNDAE5QkWqNogLTbcOJ7ygsrbgEyqyZUFGynJd5XVKU6oT+cZXzUnedOyUsrXIM", + "Fr9B0RoqhZtrgVGyVCec5tNOAEY9sM7IJeitb0F3ulCW220O3YtIGGawZSVcQvqmBZwS2X5QV2zD5bah", + "hZuiBWMepbs0kJMGhe5uovYv/roZgU+byXPdNJCOFCOLW8R0rkALVYicCfkH+N3ciKXAMVTfX0krZI3P", + "Imho4aZzgmFOXj/vbsgBeqyygPvQDXGXcNWhdhFpmd2AcGP5BRDYIXvQH4370lSDEUU9YmDVPO9Cdhgz", + "+s37lls41Q1pzR3xZU9CNZt8atP1ebnHNj1qDVdpVE51hO8+woo3+TPMC+pEjKwvWRJajtzIlFXBDhZS", + "9puxL0GbbvRlZJmE6x1juxad8amQi1Zk9Th8liwE15jR+bYkjlueC8oX5dxif/DRHYkVHKly0wBgroTN", + "19lIwolrSy0oYad3/xtOSSoE7kJYLiG3+8CAmQv0zMUoFPTZQfEceIFpoG0SCqWf9EF58JNibmgT6TXS", + "CNRCW7UGR3l4QJXShkN2Mf+vak/ev1T4P3Tc7rENgiLjaZ82xlIbzzxtzjFnWzC4Kk0sbbRHKmV4mfY7", + "hUkLKPl2akps0J20UWyD643OHO7OMHegUOxuOig6mtrvs6nJXZM+ws32HO6KuH5+n5LfX/JyJDfmLVQa", + "jFMYGWdn3z995T2MYxky+WhCF7c+k9pyNlr84GaOF560iKAgNvzuH+dKWlfHAtcobs19HvQ+LuBhrEhY", + "tKAhDnII0I8hTJ9VXHj3eZseNFxZnzI2TOLbJ9S/JXAfCZ+IhYOkMPmBm/ULnlult8MKZU7dH0n99x6a", + "Q5b4q2/T3OlASE+C7h9fVAANtstakvbeRFVgREMQ32o5qCzAsLTAmn/z1eP/8/ibb8Ofj7/5Ni4j0Hx3", + "lxr6miokENfZGwa0sDV+pgo8LLwmMaT0aDnCYpE1IbupV2XmM19OMK6htjNOX5hsI1YaJXR61PEyiJFB", + "NZH3SJpB4n0zL4XHVYcek3YQ70HcgtfeO8PMKYZ+KQu4Bt1aIV+32PUKJ9OVFngB2mStPz0tm4jZ79ds", + "Q6mTbgpjoZi4XC4P3IrkAy3dqbLX+OVx48sMT3WZXYFYrdML++aood2pv5tol/dPtJSAe43W06duQyJH", + "jgjaZSuGJ4t9RhIbw2ftiDvHrgn9zyVfSINTuaoRcG1xICP898hi96ubJwS1EZuqpDgZL0oG9TcOyg1u", + "w3k/fnT4XYfWfvTgWDg6RuPuY2KPhWV3hZHpSNif5TO1qUoYV54rinCiZz7pmoE1laIHHYNdWuV5rVuH", + "RT/W9VdeCnppzGBdJalUhYWUKiuk+w+m2ara0v+Ba/cfqvLX/R9xVaQnuaFmSBesbBIGClk0M3e/Kci6", + "4vumtKgjU/X38rQNFfOEJGp1A7rAjhRfxEIN8fUococOIxVyva2sOsU22OTUWF3n1lCwQjvnQLJUXFvy", + "z+5+uqF/krgDQBlB5narMg2XwMeMSVSI5c8a3GUVDcquMWsG6KzygXu1v8Y0thmPKIu9fRSBzHNLhlhf", + "pwmfp93w6j3N8hvL2FuCuCkL6zqwjVlVhzunaajkg768tNmocuvVCvaOlzY+PRxA3k3aOAHH66mR4jIa", + "SH7/QQJidQsWdAhDMaXlXR2h5aVO95Z+Ta0jOni7W+oSNCUc7c0Ov4YeN/PZveLxttmxQ6kQ4bcfFvGi", + "RKIhfbMOX8N2asv2cVmwaH7DcG8kwiFw64K0entMDQCxykypDkDvnVi9cx12LGloNljTUl2Bzty8EyQu", + "u4Gn1LJT1rCpS03jkT8PCuaQMcctBA180Er4LrvXoh275zrlZa5k1pn9fqUOycsMuStrUgl3rB7fdFev", + "CleqQ6UWComtkKvxck0XsP08rpCJoKoBPdERMX6Hp5Dmxu0WVby68q4OMmV3FZ0dxWydlo6FLH2N74l9", + "NRrQvRG5Vhxdhm21Q2A0bluY1ev47lO7GlNu0JE3exE36ny2raCJOxrWBN/wKnqVmBt2AcfIuf1tFU0Z", + "Oc4uwd3w4ywP/+I2FofsLU0b8LKGskJB1ZpETz4r9v01Opl7HtHp9ck3yECRvyIOUXP/Hy6Z1QD3H2x1", + "AdusFEuwYiS7oMTsph9hy0KzkzvTKcbKEnT8PHjhLCnssS21wJSmLyv8Eld0YCRHMY3IhL8MK8CC3jhW", + "XKsrtqnzNerufAWhpgHa6TF4rjdRZ/SQ5tmtzeHD4k3FcxqIUudKrlegmc9mY/7Ntsbuv+Gi9zJ9P2EF", + "wxl4ygezq9LCa0qni2QXesyieguJgg4BjAvYnpJDCH8/QpCMl20YAQyLN3xEkG5VAyIuI7KDXy86vjR6", + "iaBTeaUB/w59ag4+b0I40Kc2LJCyL3qIB26H2sAQz/0DjuO1TVxxW9z2dQgPF3fcj2sX+/hxx/2KKOhp", + "QbDMP0NQ2e9f/c40LEFjUu+XX+IEX345901/f9z97Bjvyy/TXvj7ciHTGvkx/LxJjum+ddVzp9HBb7Bm", + "8pJCLtwhpyQGG5VlL9JbFgwz8lBl4ZKBvIRSVZBsTQscER0rr2hY1SWnCGchJehOp31S6skkYK+lN3/h", + "n2fXMtU2VjGxdbQcqbeQoieKj3skrPfoBRU0yLF0wLEjtsUH2hEpSfk2I76gDOlmRBxqCfo2Y575MfZ4", + "f2YlNVWaIgOdCAlzqBQThbvc1CTRhXdpQimAJoof/qx56bMUJOYEnGE6fH4Bkp6ccZLPPzTGQJpaezOh", + "gxXHc6D4YVR8wJu2ybGPz2RTDzronCzCPhbTJ0hiaQfq6lSPwhFHTZdLd+3dtXOiCkyOZWB8w1DmC6Oc", + "dl3HkI31Ztyd2yvvGMdEY6mj0H9k+LaOeftOeLoIUFvNqXdaU/XaBy+fP2RY6Xis5mx0+dqNdlxKfT+I", + "KOt2AEu/6NMhUCwBxgLRe7k7bAkj5uFdBbuXl22tbmzVDx7cCeWeKZI/cIPFt31znzTxmeZFdoBkL58n", + "VY5OkbqDCzrPZyut6nTC2ooKJ/YSfPFigEoXXeopzuj08TffskKswNgT9m+sYkOH7/CZji41mWif/+i8", + "MsQQsKYyGulDPlcmmnPtCTrIiRI+ZwaHuX8KH1NHdD5DvSSz16m8vpcDnYVVPsEIi3pF8qYTsHkX2XxC", + "Ws1J+GZquUwWuvsZf2895DrIZA1Dqu8hlS9gq+FY3eVH7EwBQZOSp7xsiuYfJ3hKGHvDqbxObJ+vH2ft", + "Djphr1xvBnKptLtpb2r0/sE1FrzxTrhYS8UqMLZ9zw4LwMi/QCs0JEimZA6DM1BEi435QTxHfd74JDcH", + "Q1PRrjFWPniH2sycgHxI99ThVmO1tILUH7eMv0arWLmDxwH977UoE1xQKffdxHDMmVSMXmqNW1I2Z1vN", + "iGD2FQQ6jHS/2zyu6lmk3f+OEwqqkNwWw26tFPmay/bpyd2lk4c8ud9zcYMnBRLb/C5LPE/A+WljtqQa", + "SWyS/iELd0HBukKNRe1+Aa74dgPSHin53lBvilfAp9f09A1Aj9wAQu9dD9ldwDazKj02kLOJNPPmqoW2", + "U5K2EY7zkXtPkx0SHu1sdVfaQU5FWNbo5I3cmcF26q90TWjRBWzbCJj4zSC6Nh1xy6JjMW0ZPxMbaO8l", + "pMilVCCx15FI18v0vZZKQZDI/mICnWaYaa4wI1xBfad5Ym/fb8S2kfN3UN7hiF0QhSZhqvhExP+2gm5K", + "Sufdv24ONtoMTtjzJjceQ9IoS7RNmCd7Vj9wjereNWUIhQ52L66DDRtj287P31eUoZMQBL4B6UauzVBL", + "8k14vlw1rwcnDEGh2fUSdNsuZYwJLZf6r7bh0A4Umg0fnk60MrZCh9EYpdv4vIpvZ0EZnM1nDi33jwPb", + "/bvUf83wReYSXzOrlsPwvPQG9jyR4TyJ5MxZ99baUSSbndiy1g4L6OQrOD7lDD1G0al6qHkyNqpT3c/2", + "h2e8LM+upY8NHGZAkdAdC+Okh6V8MZFGQjsx7iM5g9XKS4fYO8Pz3Kl4RZusHMH5hWH98uWUwjwsYJ4K", + "5NtXQiceEm94k+vVKN5osBqqoSJnXK/qDTkUPj5+OzAYfbRHFL660vDlGa+ykVioNRRMaV/BRCx9eZqx", + "0sl7PidBD7C/UiuRt6phmz89wulzd/mByhcxVTLLmyBjd066G6ZV7JyCc89nJ+wlVTvQwAsSsFpYSD1s", + "0MEfC8JdAT7YGDg6a6gbPVtz4nZR5+EIg5ytAWMqEk+Z/Kc+lcErU49QbEwqkVbVJdInoNAzN1Mb4ENE", + "yrmUyv4H0enApzK69aXjkPqqat7MKMGt+5815kI5gY3DjtholQaxklOvwy95OAhMn1zJ46ArpXyVpZjw", + "ZnBKNOr4cUIUPS80GD0CzYtMyXI7FQaeEK/NWkw+Ed/U2DJtGobxWEZFpvdDMYiZNxGGyNhBlb1L/I54", + "2eTWz5n0BuhIjV19O7kmiQdQ4rOwP/QuzSzyck5qZlTxuHSIk3zSkIXzM0gsWVAx5LpNXTmXT9lfoJW/", + "rDZDuQ3R2sZ9RUxfFu4k0ampXG4G3fpTHlgZnpCf0A5HX1w4P39/zQdaBsJ0C/3iuMczdtL4xUhl7pjG", + "wVXmS3HfsuQ+zTixsG363dAjxouiV6Q4jvsiIdMU2aXV9iXKkVn41Ug18ElqLiepOTF+p3bIVbgdTjxS", + "H26TVKXlKqw49Uil+I2nq7VPNwyn3mfzN8EDe7FGuCHfljnCrBPsMfGgCqfI0afNW1keONXAd8K8CPGO", + "9vC7DnacchmkWfDNBe9xzGnuZKJzbcOrO32uZafwiCAejzmA0YiDtiJPeL/ejxeVQMUB2tAGp2oGZ2RC", + "YzwQ9TB6moL4tV+Hhcf1kc1a1WVBJZI3WESovWImiOPfVWjUwvbBC4riwKCLON3WRDPEa83YSzcyL6/4", + "1gQ7bctY48OFVaVCygkbYVxljIzL6bXROUWOQy4qAdI2ITcxXRyPj1s30wN7K6kTOlT+SFw2Rgsfi8/b", + "l0q6nrfgePNvLvDogJ77ZeZl11pAAwdLtGvzLIwdMGpIGp1nu4tLpN6taZZ0h8zzrtFJYefNiofKOOpF", + "Qo6mGZdusv++9ohPRrpGjmivub7onIG886S5XFFieWfUjooRpYMf8eK/92S8aZ80xzjwxq/gkwAK9pbL", + "Qm3Yi1DW5cGvb188ZBpMXdrAZKHupmM+D8mnLaI8inillx7zd1ECTYO+kN6hshLG6oTd8t6xGrzPPvZm", + "/ZLey6egI/JXJ57Jd9jt8VR+5/X3sRkvim6lOFMv8FEVIamc5ILbHINZBiCYial3BDi4NiWhilEOt8V0", + "vw2D6Pod05ml6u2fz42Bdtwkgnd1Wnp6x82h4tN3I/npZzpOPSTtsM2ciCpYOnqGMvC9g/9WSlY0BaVu", + "Oe3D+Kd8WmWrG1HaPqolm8DQyI+wM+K0O97IC8Bez8JJ8C0QMdS43IR4+vuzpdWM/APu9BhYGSk/y1oW", + "preE7aO0E+7XSd3Hqz6hzaQnd0wp2FcT6OTRdiFBv6XPQ2lTqHvvTuMDTfQU08+y3PryZP065u1SVlpd", + "iiL1HGypViI3ZIE51GH8KvS9mc82dWnFkeO8Dn3Jg50+DsXKH4Wy4LpgUDz+5puvvutWR/iMxNVwkZLR", + "PR4tb2TkVuRdPbbBbg8hFkh5slJDkTXqa9Or1vXQ+Nbm+KRcGzx3mIsMARnPhg92Vh8fstgyHrG6cmp7", + "aUX709z9tuZm3YrO6FlAfK6RMy+v+kF/mHL0ad4djzZFdqu4jN72GBMc7Sb5HPZG71l+ke8tEl9HkmT4", + "ap5Hkcyujl9CHiaudVWC0+1aGThaWSeQho78MOc7MXxdNx4vverYAJ8BUk4ToQqdTplsNS40ELRQHREc", + "PFifdzFcqQppaw3GQZQOvlnrZPGRqUqMbQ28REHgg2j7rremvWIluG6jGm518Ylq2kzxwOdR2CEdhzWt", + "Mo+VZ2D75OU19an6danGteeoPugU649W3uzen/cvcuLB6Qe5jUWnmSrEp52FgDT/mlGohMBeEvu3QY2o", + "x0oqYeOLr5Hv11eu7q7X7bP0bzBBYKmo4IG0PMeLAj1EOHvqR5r5d+9ma2sr8+T09Orq6iRMc5KrzekK", + "k5wyq+p8fRoGohfh42pqvot/m8Udu+XWitywp29eopIsbAmYL4Gki0qrPpk9PnlERfhA8krMnsy+Pnl0", + "8hVtkTXyxSkVvKVX1xAPxzWoCb8sMCv9AuKSufjOJBbFxe6PHz0Ky+CviZF38vQPQwJtP4dpPA0ucnch", + "HqA77WH0zu2Qg36RF1JdSfa91ooEpKk3G663mBRtay0Ne/zoERNLX+iXaoFwp6a9n1FC7uw31+/08vFp", + "FCbW++X0Q4jQEMXNjs+nvKpMFvmPd7YPTvjJVokkvv377DVD79mt0DY9X/Tr6Yeuh/pmz2anPhw/tO0D", + "iX+ffggm4JuJT6e+osRU9xH86DmD0w8U5UwmhWiqdKeOeP5grz10aHnVbjvOnrz/0JMHcM03VQkoCmY3", + "vzVs2EgSz4438+aXUqmLuop/McB1vp7d/Hbz/wIAAP//lO4nuW/QAAA=", } // GetSwagger returns the Swagger specification corresponding to the generated code diff --git a/api/generated/common/types.go b/api/generated/common/types.go index 98c27448e..6ef3c5451 100644 --- a/api/generated/common/types.go +++ b/api/generated/common/types.go @@ -452,6 +452,25 @@ type HealthCheck struct { Version string `json:"version"` } +// IndexerStateProofMessage defines model for IndexerStateProofMessage. +type IndexerStateProofMessage struct { + + // \[b\] + BlockHeadersCommitment *[]byte `json:"block-headers-commitment,omitempty"` + + // \[f\] + FirstAttestedRound *uint64 `json:"first-attested-round,omitempty"` + + // \[l\] + LatestAttestedRound *uint64 `json:"latest-attested-round,omitempty"` + + // \[P\] + LnProvenWeight *uint64 `json:"ln-proven-weight,omitempty"` + + // \[v\] + VotersCommitment *[]byte `json:"voters-commitment,omitempty"` +} + // MerkleArrayProof defines model for MerkleArrayProof. type MerkleArrayProof struct { HashFactory *HashFactory `json:"hash-factory,omitempty"` @@ -485,8 +504,8 @@ type OnCompletion string // StateDelta defines model for StateDelta. type StateDelta []EvalDeltaKeyValue -// StateProof defines model for StateProof. -type StateProof struct { +// StateProofFields defines model for StateProofFields. +type StateProofFields struct { PartProofs *MerkleArrayProof `json:"part-proofs,omitempty"` // \[pr\] Sequence of reveal positions. @@ -506,25 +525,6 @@ type StateProof struct { SignedWeight *uint64 `json:"signed-weight,omitempty"` } -// StateProofMessage defines model for StateProofMessage. -type StateProofMessage struct { - - // \[b\] - BlockHeadersCommitment *[]byte `json:"block-headers-commitment,omitempty"` - - // \[f\] - FirstAttestedRound *uint64 `json:"first-attested-round,omitempty"` - - // \[l\] - LatestAttestedRound *uint64 `json:"latest-attested-round,omitempty"` - - // \[P\] - LnProvenWeight *uint64 `json:"ln-proven-weight,omitempty"` - - // \[v\] - VotersCommitment *[]byte `json:"voters-commitment,omitempty"` -} - // StateProofParticipant defines model for StateProofParticipant. type StateProofParticipant struct { Verifier *StateProofVerifier `json:"verifier,omitempty"` @@ -960,13 +960,13 @@ type TransactionSignatureMultisigSubsignature struct { // TransactionStateProof defines model for TransactionStateProof. type TransactionStateProof struct { - Message *StateProofMessage `json:"message,omitempty"` + Message *IndexerStateProofMessage `json:"message,omitempty"` // \[sp\] represents a state proof. // // Definition: // crypto/stateproof/structs.go : StateProof - StateProof *StateProof `json:"state-proof,omitempty"` + StateProof *StateProofFields `json:"state-proof,omitempty"` // \[sptype\] Type of the state proof. Integer representing an entry defined in protocol/stateproof.go StateProofType *uint64 `json:"state-proof-type,omitempty"` diff --git a/api/generated/v2/routes.go b/api/generated/v2/routes.go index 6992a5ab4..7f16516ee 100644 --- a/api/generated/v2/routes.go +++ b/api/generated/v2/routes.go @@ -1748,207 +1748,207 @@ func RegisterHandlers(router interface { // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", } // GetSwagger returns the Swagger specification corresponding to the generated code diff --git a/api/generated/v2/types.go b/api/generated/v2/types.go index 9b93af62a..1f4a704cf 100644 --- a/api/generated/v2/types.go +++ b/api/generated/v2/types.go @@ -452,6 +452,25 @@ type HealthCheck struct { Version string `json:"version"` } +// IndexerStateProofMessage defines model for IndexerStateProofMessage. +type IndexerStateProofMessage struct { + + // \[b\] + BlockHeadersCommitment *[]byte `json:"block-headers-commitment,omitempty"` + + // \[f\] + FirstAttestedRound *uint64 `json:"first-attested-round,omitempty"` + + // \[l\] + LatestAttestedRound *uint64 `json:"latest-attested-round,omitempty"` + + // \[P\] + LnProvenWeight *uint64 `json:"ln-proven-weight,omitempty"` + + // \[v\] + VotersCommitment *[]byte `json:"voters-commitment,omitempty"` +} + // MerkleArrayProof defines model for MerkleArrayProof. type MerkleArrayProof struct { HashFactory *HashFactory `json:"hash-factory,omitempty"` @@ -485,8 +504,8 @@ type OnCompletion string // StateDelta defines model for StateDelta. type StateDelta []EvalDeltaKeyValue -// StateProof defines model for StateProof. -type StateProof struct { +// StateProofFields defines model for StateProofFields. +type StateProofFields struct { PartProofs *MerkleArrayProof `json:"part-proofs,omitempty"` // \[pr\] Sequence of reveal positions. @@ -506,25 +525,6 @@ type StateProof struct { SignedWeight *uint64 `json:"signed-weight,omitempty"` } -// StateProofMessage defines model for StateProofMessage. -type StateProofMessage struct { - - // \[b\] - BlockHeadersCommitment *[]byte `json:"block-headers-commitment,omitempty"` - - // \[f\] - FirstAttestedRound *uint64 `json:"first-attested-round,omitempty"` - - // \[l\] - LatestAttestedRound *uint64 `json:"latest-attested-round,omitempty"` - - // \[P\] - LnProvenWeight *uint64 `json:"ln-proven-weight,omitempty"` - - // \[v\] - VotersCommitment *[]byte `json:"voters-commitment,omitempty"` -} - // StateProofParticipant defines model for StateProofParticipant. type StateProofParticipant struct { Verifier *StateProofVerifier `json:"verifier,omitempty"` @@ -960,13 +960,13 @@ type TransactionSignatureMultisigSubsignature struct { // TransactionStateProof defines model for TransactionStateProof. type TransactionStateProof struct { - Message *StateProofMessage `json:"message,omitempty"` + Message *IndexerStateProofMessage `json:"message,omitempty"` // \[sp\] represents a state proof. // // Definition: // crypto/stateproof/structs.go : StateProof - StateProof *StateProof `json:"state-proof,omitempty"` + StateProof *StateProofFields `json:"state-proof,omitempty"` // \[sptype\] Type of the state proof. Integer representing an entry defined in protocol/stateproof.go StateProofType *uint64 `json:"state-proof-type,omitempty"` diff --git a/api/indexer.oas2.json b/api/indexer.oas2.json index 1b94c4d46..fd824568b 100644 --- a/api/indexer.oas2.json +++ b/api/indexer.oas2.json @@ -2063,10 +2063,10 @@ "x-algorand-format": "uint64" }, "state-proof": { - "$ref": "#/definitions/StateProof" + "$ref": "#/definitions/StateProofFields" }, "message": { - "$ref": "#/definitions/StateProofMessage", + "$ref": "#/definitions/IndexerStateProofMessage", "description": "\\[spmsg\\]" } } @@ -2259,7 +2259,7 @@ } } }, - "StateProof": { + "StateProofFields": { "description": "\\[sp\\] represents a state proof.\n\nDefinition:\ncrypto/stateproof/structs.go : StateProof", "type": "object", "properties": { @@ -2302,7 +2302,7 @@ } } }, - "StateProofMessage": { + "IndexerStateProofMessage": { "type": "object", "properties": { "block-headers-commitment": { diff --git a/api/indexer.oas3.yml b/api/indexer.oas3.yml index 48c4585e9..21cf70306 100644 --- a/api/indexer.oas3.yml +++ b/api/indexer.oas3.yml @@ -1378,6 +1378,38 @@ ], "type": "object" }, + "IndexerStateProofMessage": { + "properties": { + "block-headers-commitment": { + "description": "\\[b\\]", + "format": "byte", + "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "type": "string" + }, + "first-attested-round": { + "description": "\\[f\\]", + "type": "integer", + "x-algorand-format": "uint64" + }, + "latest-attested-round": { + "description": "\\[l\\]", + "type": "integer", + "x-algorand-format": "uint64" + }, + "ln-proven-weight": { + "description": "\\[P\\]", + "type": "integer", + "x-algorand-format": "uint64" + }, + "voters-commitment": { + "description": "\\[v\\]", + "format": "byte", + "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "type": "string" + } + }, + "type": "object" + }, "MerkleArrayProof": { "properties": { "hash-factory": { @@ -1454,7 +1486,7 @@ }, "type": "array" }, - "StateProof": { + "StateProofFields": { "description": "\\[sp\\] represents a state proof.\n\nDefinition:\ncrypto/stateproof/structs.go : StateProof", "properties": { "part-proofs": { @@ -1496,38 +1528,6 @@ }, "type": "object" }, - "StateProofMessage": { - "properties": { - "block-headers-commitment": { - "description": "\\[b\\]", - "format": "byte", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string" - }, - "first-attested-round": { - "description": "\\[f\\]", - "type": "integer", - "x-algorand-format": "uint64" - }, - "latest-attested-round": { - "description": "\\[l\\]", - "type": "integer", - "x-algorand-format": "uint64" - }, - "ln-proven-weight": { - "description": "\\[P\\]", - "type": "integer", - "x-algorand-format": "uint64" - }, - "voters-commitment": { - "description": "\\[v\\]", - "format": "byte", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string" - } - }, - "type": "object" - }, "StateProofParticipant": { "properties": { "verifier": { @@ -2171,10 +2171,10 @@ "description": "Fields for a state proof transaction. \n\nDefinition:\ndata/transactions/stateproof.go : StateProofTxnFields", "properties": { "message": { - "$ref": "#/components/schemas/StateProofMessage" + "$ref": "#/components/schemas/IndexerStateProofMessage" }, "state-proof": { - "$ref": "#/components/schemas/StateProof" + "$ref": "#/components/schemas/StateProofFields" }, "state-proof-type": { "description": "\\[sptype\\] Type of the state proof. Integer representing an entry defined in protocol/stateproof.go", From 7617f0113c9e938b329489742ef301d205edca12 Mon Sep 17 00:00:00 2001 From: John Lee Date: Tue, 16 Aug 2022 11:49:19 -0400 Subject: [PATCH 23/39] Update go-algorand submodule to v3.9.1-beta (#1185) --- third_party/go-algorand | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/third_party/go-algorand b/third_party/go-algorand index 701d43178..379ec4f8e 160000 --- a/third_party/go-algorand +++ b/third_party/go-algorand @@ -1 +1 @@ -Subproject commit 701d431782c0cc3ddbd386e3db8640c943bcc070 +Subproject commit 379ec4f8e1b7f81b8494e3ec889c7ffc8ee67389 From 777a34d5a591faae356f75b0f0367ac9e1e677c5 Mon Sep 17 00:00:00 2001 From: DevOps Service Date: Tue, 16 Aug 2022 15:51:55 +0000 Subject: [PATCH 24/39] Bump version to 2.14.0-rc2 --- .version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.version b/.version index 39b888cfe..8c690861d 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -2.14.0-rc1 +2.14.0-rc2 From b129605cb39b55e03a42d0959a7eb4f450909a24 Mon Sep 17 00:00:00 2001 From: Will Winder Date: Tue, 16 Aug 2022 17:05:37 -0400 Subject: [PATCH 25/39] Disable deadlock detection (#1186) --- cmd/algorand-indexer/main.go | 1 + util/disabledeadlock/disable_deadlock.go | 8 ++++++++ 2 files changed, 9 insertions(+) create mode 100644 util/disabledeadlock/disable_deadlock.go diff --git a/cmd/algorand-indexer/main.go b/cmd/algorand-indexer/main.go index c1540fcca..a12015820 100644 --- a/cmd/algorand-indexer/main.go +++ b/cmd/algorand-indexer/main.go @@ -17,6 +17,7 @@ import ( "github.com/algorand/indexer/idb" "github.com/algorand/indexer/idb/dummy" _ "github.com/algorand/indexer/idb/postgres" + _ "github.com/algorand/indexer/util/disabledeadlock" "github.com/algorand/indexer/util/metrics" "github.com/algorand/indexer/version" ) diff --git a/util/disabledeadlock/disable_deadlock.go b/util/disabledeadlock/disable_deadlock.go new file mode 100644 index 000000000..ca1a19991 --- /dev/null +++ b/util/disabledeadlock/disable_deadlock.go @@ -0,0 +1,8 @@ +package disabledeadlock + +import "github.com/algorand/go-deadlock" + +func init() { + // disable go-deadlock detection + deadlock.Opts.Disable = true +} From 055a502d22c6b7519669bf1318df500e21a35b9b Mon Sep 17 00:00:00 2001 From: Or Aharonee <17099688+Aharonee@users.noreply.github.com> Date: Thu, 18 Aug 2022 23:29:52 +0300 Subject: [PATCH 26/39] Add support for new block header: TxnRoot SHA256 (#989) --- api/generated/common/routes.go | 338 ++++++++--------- api/generated/common/types.go | 3 + api/generated/v2/routes.go | 396 ++++++++++---------- api/generated/v2/types.go | 3 + api/handlers.go | 27 +- api/indexer.oas2.json | 6 + api/indexer.oas3.yml | 9 +- api/test_resources/stpf_block_response.json | 2 +- 8 files changed, 404 insertions(+), 380 deletions(-) diff --git a/api/generated/common/routes.go b/api/generated/common/routes.go index 8d22415a4..25db61101 100644 --- a/api/generated/common/routes.go +++ b/api/generated/common/routes.go @@ -71,174 +71,176 @@ func RegisterHandlers(router interface { // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", } // GetSwagger returns the Swagger specification corresponding to the generated code diff --git a/api/generated/common/types.go b/api/generated/common/types.go index 6ef3c5451..2185be09c 100644 --- a/api/generated/common/types.go +++ b/api/generated/common/types.go @@ -342,6 +342,9 @@ type Block struct { // \[txn\] TransactionsRoot authenticates the set of transactions appearing in the block. More specifically, it's the root of a merkle tree whose leaves are the block's Txids, in lexicographic order. For the empty block, it's 0. Note that the TxnRoot does not authenticate the signatures on the transactions, only the transactions themselves. Two blocks with the same transactions but in a different order and with different signatures will have the same TxnRoot. TransactionsRoot []byte `json:"transactions-root"` + // \[txn256\] TransactionsRootSHA256 is an auxiliary TransactionRoot, built using a vector commitment instead of a merkle tree, and SHA256 hash function instead of the default SHA512_256. This commitment can be used on environments where only the SHA256 function exists. + TransactionsRootSha256 []byte `json:"transactions-root-sha256"` + // \[tc\] TxnCounter counts the number of transactions committed in the ledger, from the time at which support for this feature was introduced. // // Specifically, TxnCounter is the number of the next transaction that will be committed after this block. It is 0 when no transactions have ever been committed (since TxnCounter started being supported). diff --git a/api/generated/v2/routes.go b/api/generated/v2/routes.go index 7f16516ee..dd20e498d 100644 --- a/api/generated/v2/routes.go +++ b/api/generated/v2/routes.go @@ -1748,207 +1748,209 @@ func RegisterHandlers(router interface { // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", } // GetSwagger returns the Swagger specification corresponding to the generated code diff --git a/api/generated/v2/types.go b/api/generated/v2/types.go index 1f4a704cf..e58c9d030 100644 --- a/api/generated/v2/types.go +++ b/api/generated/v2/types.go @@ -342,6 +342,9 @@ type Block struct { // \[txn\] TransactionsRoot authenticates the set of transactions appearing in the block. More specifically, it's the root of a merkle tree whose leaves are the block's Txids, in lexicographic order. For the empty block, it's 0. Note that the TxnRoot does not authenticate the signatures on the transactions, only the transactions themselves. Two blocks with the same transactions but in a different order and with different signatures will have the same TxnRoot. TransactionsRoot []byte `json:"transactions-root"` + // \[txn256\] TransactionsRootSHA256 is an auxiliary TransactionRoot, built using a vector commitment instead of a merkle tree, and SHA256 hash function instead of the default SHA512_256. This commitment can be used on environments where only the SHA256 function exists. + TransactionsRootSha256 []byte `json:"transactions-root-sha256"` + // \[tc\] TxnCounter counts the number of transactions committed in the ledger, from the time at which support for this feature was introduced. // // Specifically, TxnCounter is the number of the next transaction that will be committed after this block. It is 0 when no transactions have ever been committed (since TxnCounter started being supported). diff --git a/api/handlers.go b/api/handlers.go index 060950476..a1726cae4 100644 --- a/api/handlers.go +++ b/api/handlers.go @@ -1150,19 +1150,20 @@ func (si *ServerImplementation) fetchBlock(ctx context.Context, round uint64) (g } ret = generated.Block{ - GenesisHash: blockHeader.GenesisHash[:], - GenesisId: blockHeader.GenesisID, - PreviousBlockHash: blockHeader.Branch[:], - Rewards: &rewards, - Round: uint64(blockHeader.Round), - Seed: blockHeader.Seed[:], - StateProofTracking: &trackingArray, - Timestamp: uint64(blockHeader.TimeStamp), - Transactions: nil, - TransactionsRoot: blockHeader.TxnCommitments.NativeSha512_256Commitment[:], - TxnCounter: uint64Ptr(blockHeader.TxnCounter), - UpgradeState: &upgradeState, - UpgradeVote: &upgradeVote, + GenesisHash: blockHeader.GenesisHash[:], + GenesisId: blockHeader.GenesisID, + PreviousBlockHash: blockHeader.Branch[:], + Rewards: &rewards, + Round: uint64(blockHeader.Round), + Seed: blockHeader.Seed[:], + StateProofTracking: &trackingArray, + Timestamp: uint64(blockHeader.TimeStamp), + Transactions: nil, + TransactionsRoot: blockHeader.TxnCommitments.NativeSha512_256Commitment[:], + TransactionsRootSha256: blockHeader.TxnCommitments.Sha256Commitment[:], + TxnCounter: uint64Ptr(blockHeader.TxnCounter), + UpgradeState: &upgradeState, + UpgradeVote: &upgradeVote, } results := make([]generated.Transaction, 0) diff --git a/api/indexer.oas2.json b/api/indexer.oas2.json index fd824568b..2d0f9ebc8 100644 --- a/api/indexer.oas2.json +++ b/api/indexer.oas2.json @@ -1452,6 +1452,7 @@ "previous-block-hash", "seed", "transactions-root", + "transactions-root-sha256", "timestamp", "genesis-id", "genesis-hash" @@ -1506,6 +1507,11 @@ "type": "string", "format": "byte" }, + "transactions-root-sha256": { + "description": "\\[txn256\\] TransactionsRootSHA256 is an auxiliary TransactionRoot, built using a vector commitment instead of a merkle tree, and SHA256 hash function instead of the default SHA512_256. This commitment can be used on environments where only the SHA256 function exists.", + "type": "string", + "format": "byte" + }, "txn-counter": { "description": "\\[tc\\] TxnCounter counts the number of transactions committed in the ledger, from the time at which support for this feature was introduced.\n\nSpecifically, TxnCounter is the number of the next transaction that will be committed after this block. It is 0 when no transactions have ever been committed (since TxnCounter started being supported).", "type": "integer" diff --git a/api/indexer.oas3.yml b/api/indexer.oas3.yml index 21cf70306..031dd02f7 100644 --- a/api/indexer.oas3.yml +++ b/api/indexer.oas3.yml @@ -1176,6 +1176,12 @@ "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string" }, + "transactions-root-sha256": { + "description": "\\[txn256\\] TransactionsRootSHA256 is an auxiliary TransactionRoot, built using a vector commitment instead of a merkle tree, and SHA256 hash function instead of the default SHA512_256. This commitment can be used on environments where only the SHA256 function exists.", + "format": "byte", + "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "type": "string" + }, "txn-counter": { "description": "\\[tc\\] TxnCounter counts the number of transactions committed in the ledger, from the time at which support for this feature was introduced.\n\nSpecifically, TxnCounter is the number of the next transaction that will be committed after this block. It is 0 when no transactions have ever been committed (since TxnCounter started being supported).", "type": "integer" @@ -1194,7 +1200,8 @@ "round", "seed", "timestamp", - "transactions-root" + "transactions-root", + "transactions-root-sha256" ], "type": "object" }, diff --git a/api/test_resources/stpf_block_response.json b/api/test_resources/stpf_block_response.json index accf326e8..609b2ae8c 100644 --- a/api/test_resources/stpf_block_response.json +++ b/api/test_resources/stpf_block_response.json @@ -1 +1 @@ -{"genesis-hash":"VzQ1JThQHhP+papUD3M3uZZCWixzALc2NdKNdw0NXbw=","genesis-id":"sandnet-v1","previous-block-hash":"Fvc8IbGTiRrBQP4uHkSWpfVqOeGuLjsbhID0RmacUbk=","rewards":{"fee-sink":"A7NMWS3NT3IUDMLVO26ULGXGIIOUQ3ND2TXSER6EBGRZNOBOUIQXHIBGDE","rewards-calculation-round":500000,"rewards-level":71,"rewards-pool":"7777777777777777777777777777777777777777777777777774MSJUVU","rewards-rate":249999999,"rewards-residue":5999997136},"round":2864,"seed":"eO1fkFoLJbRJMzfV6WbmMyZiUKEcHemqo05x2HVPWJ8=","state-proof-tracking":[{"next-round":3072,"online-total-weight":0,"type":0}],"timestamp":1659992405,"transactions":[{"close-rewards":0,"closing-amount":0,"confirmed-round":1,"fee":0,"first-valid":2862,"id":"G6K3ITFCN6CCJNYE525R6RBF6N35DZ6FCLTLL65LULW4TESBFS3Q","intra-round-offset":2,"last-valid":3862,"receiver-rewards":0,"round-time":1660154614,"sender":"XM6FEYVJ2XDU2IBH4OT6VZGW75YM63CM4TC6AV6BD3JZXFJUIICYTVB5EU","sender-rewards":0,"signature":{},"state-proof-transaction":{"message":{"block-headers-commitment":"2c0LiOJoMoJy7u26wD7o3S+A8Q21FZZkw22OgZsH4aw=","first-attested-round":2561,"latest-attested-round":2816,"ln-proven-weight":1662179,"voters-commitment":"waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag=="},"state-proof":{"part-proofs":{"hash-factory":{"hash-type":1},"path":[],"tree-depth":1},"positions-to-reveal":[0,0,0,1,0,0,0,0,0,1,0,1,0,1,1,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,1,1,1,1,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,1,0],"reveals":[{"participant":{"verifier":{"commitment":"8SvMm7uS8WigJaGzYDRrBpUMC6K8YdsRWpkJYp81Ry9uHlK3NsX2o8jkC1x4Yw6NGyRBRft5nfO6AZp36rcxWg==","key-lifetime":256},"weight":4000252000000000},"position":0,"sig-slot":{"lower-sig-weight":0,"signature":{"falcon-signature":"ugDJdzkHdVSVpzkpbTODYYAnUu+fAwQj/i8FiediMpEr3BHtb2F6wOFY3vQBNVlYPQE5K+nn1nzT2eqsIV7evLDapqW83/iwCG1h3sqhE/Ij/0EHaNmYvRXp1KfAEjzuGWWtVjeMQu6Y4pKvy1tq6sujVBwu7pTq2+hcNCCs41LydoywS91RkGGxDfazcHlMX4pyfzC54pyALBmGT1HQcD+RsxCZuQhaIGTVxbMH9JiwLMIWwvQbNUZvOOZAjtNvgWFdXJeff8fMb1c4S2fy0W5WJ7i0GGdd1Xum9GnEScY6jgimOi6NUTH+UWBTfRk9/7cYJeX1NZVORJT6q+tshylON/4Vj2kaeUkSYkekND4UZWInRiGTpDYLdiIu/vM0Alxl0oIy28PtGjr6aI7nNMOjmkWtO3b86biHddOlVFBzHH1Mkbsh7mcvv4j7ZmKTQ6JLsxtdtnoDiJNcWaSbVQesQRZOKjp7LS8Na8eBwJrcoTHtJ5iZoj6lCO2TU49YHLe6Y8OpPaySXtOW6QQ54/DPkf0GnSt9NO2pqHf+aIoGXqW2NQMoy6KMXVYujfWkFZLZw8c6yb/qE8v2fSqO3A9cmicRNcZMaaTFKqGJtsM/ObyrMSXvx6caduZqyaUa3MQxLRHV6nshasj9dKHGDsbQqmZmCsXBxzGHilcp7iKIftXZu0gU/gdNhyAYyZKbHKOkMV3fPnVXhJ34UtAiOkRPFHKmLKrdaILmNNyuvfOO26mwt+YHEuHlUUM/VLLjlDsGE4Ef8MyVDIS/vIjD/dHvM42ARCUWLisgv8ToNXlXwMjB4rP07wCuqBYeC68e/fFiBgFMwxTy1sRcpBRyRs1oMZhIzv1IQ1r2NevaZLEDFdJH9vi52yLDZquIR6uRq2PPDy0hbDQQu/9y1R3CON2UpxTGoWst2j+ttMZ1OWaT2kGjcJKVyotixwLLwUdYfxYrzyvgTBGyqLjSrLrHd5So4kY8hAx+RxT3XR+axt4AeOEo4LzlKl7HuwXjnvA20t2+SQbYDNm4eX4uhga7YMn4zooroMX80VhCBHi10faUZXXLT4Ngk0881Op0J48ThhYP1Sf/hzMIW77QfSYt/kajZ3rld7eKiRfCotLmCojxf2Tr9p3O9r633Tx7LcRyLFRL2c9PJHGtXNCP+kLSnlrxGIYloHCtkW1zDL5JWauVDgfeULr+Goshk1ZQVEI3gHPte7/X2oFHfdKmim/umsXN/ESft+lzpwySGNoG/tB8NGuX6zXSQAW5p2SzExVDOIbLP61sLZN9kF9nzkcwx+V/8vyP0xti3qy5nMQlZd4pEu4sJOPxP72IHFl9VGT26tLha8I8jQICg0B6EjpyfqVFzn0XrKDDEbyhdnstQxG+Zgu++RH48DykhYFEvJTJljcixZqb7sZLAZUoRy4pMIotWlHoih6LPjkb233n+7wB5dJluewV5VZj8rOWmY8jPAwh13gJRp6ETfQFdU9DIbzfrDOpu6crfOzs1QrIdnduHhy4+Jox15vHPlk1ExJiSTs/k7FcHBgCs0vrMEY4nmfEb8TItAl7GKpn1Fw1onxTVNTBEy2qXKMA5h4p++Mg0U7uEEefIuc/Pz4MLhrFohL9XS23MpIkEtU=","merkle-array-index":11,"proof":{"hash-factory":{"hash-type":1},"path":["kjMClw7Cj4NPcQYST1KW1jA08ZuyxzpTZAStj87WGooSey5nyyhnWlPuNcvuXMfEXj8TLnmllrJS+fsdiAPYQQ==","deIE0tGTdzGGlqGBs2glPNb7qMObgfDyx+Phr4r6yNY5pu1X2X7LpvQPvaplhTdgWD3pqNOwXSD68825PugnUA==","k7n3HzFxge883zdLR/MkTJUM+Z+ECXR1ISKbCI2fAEF06AuMmV/sF2f5tA95FvTCAIbXA5QKT0hbo0dapK+TiA==","BlH3eQeuIuvfQMSV7NX5J1YmHZN+tTnYyRqYFlubV82MKG80klkma1b+FEw5m5VtkpuWpWg/ezVcIOWmdCmJEg=="],"tree-depth":4},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"v34aOEpoWCkletfLSvS6ndWcFDFmxlEWtz8BIxYcQh8r6BC89XzQESqu0E3fzyUwKR/LNRLGkjyYcL6GiIDxXQ==","key-lifetime":256},"weight":1000063000000000},"position":1,"sig-slot":{"lower-sig-weight":4000252000000000,"signature":{"falcon-signature":"ugDOYbSIGGH4NLVDTNilnuQFXb3SkKcjzch2Hvp8wQvw2NLKPpXncZV+ZY+WnLHkMnmpQxzlCSOCmDgz/+P3Y8hllQyc75pMJINTxFt+B6P5dKtuXlijYmsVxq7Chvb0cORizxc6Dw3iQKFA+Uq/rm/qJLiyMQ26ri6l7b5wcyVex1W5ohYOmx9vkkqzveg7CI8tsgCDeXOk2s0qeWqWXHi68q7RuWd5AsigB5KfN/Y16tEqbJDuvFeFoaNUmy6Gu75NyOarT0j0mRImxD1wpaKB8kdieiyfHdbSseeRYovIDeQc26HcNxlKttbUZHJMQo52wk8EmUmo52P0qpwnossfgw/k+ZvCDAxORSdaPCzix+nBM1qc3a9reLHUWQ9fOK2T+7oDkWCQ5Y9Q1mmhqbUZjDgtiwBWdVU9dwcsiJwOl0YdZIpQQ8s74L4T8rlqgtxRdmCxOCfDdYAM9bjutrYHEKYrvGRJXIGjSsclOeeSZX2440v0Ov5ZyOrhnZ6jw8GqIdtsFtyTQc9td3rnzgjkmiaFcA40/nR81Z4EMLDQIe0CL/feUdE3pZNR4vsCc+t03RfV64Qb5kmILSzEridVqCBS/B1/Pxhs22iETRTWPZsGJNZV6Fed1w0AV/2tKtfQF7xF2kEAXqa3vfrlE+ZlUDrcsXNDTVEUUz6+Fo3l3/OyZNymo4xryIIgRmjHKXJUSqKK7cnjAkdzqlli+TuLhY4fvWVoE0c8R/pwaOr7wukiT34rukY95KWvOIalZatIWe8HChzAG4z+RUbALtHB5krxDCIhlaKbFt8F3GJejlTOD4ZB+o72siMcYF19LjBAxBO9StuhFuiseymGLHS8Rzt9Qr8w3voXASlDyWp4Wu77ZlxkzO8XwdraCZjoclaKBI5xhkoUs9nzWpn2eWz87aG+TgzffJS5iqH4nHWz0+2XcicoVV1yh2H+63YiEGLQme0FuF3UhQaKmBa1JhZr9okrPPdukuaQduAoUPVMprhRo4FLf91k2YIiZoM+Jmcb3QlwYyQXTLgwpCyhT9qYMYFxmHsZSGMoaHuoTyVNBWtVoX4wovcRkdOmNVlxlcWylkI1mmtY1n3kr7StUk5zm5zsoymDVqd4JuIb2UmSKSsYkEsc+Uvpmmf6WzhMojdwQ5wtS5GIxjRY5D55qNQXfZR6PJuy+5XhLkg6Co8UonK0RCSyQscvBvQuHwxt5hBNNTQyAGXeXNuWnu1wu7YqQNfum0MpXoTLP/JrPETOZ0aNjjKcNWam6M1osqR/hR03iX17SZ12nLkpt8r5HUQv8fqR2aCkTc8i8Go1cjswkkswzFSnAJWS+i9iOdlSMEkpkD+zlh6lqaTDkIkVq0hPtEsDTVNTYHgShJ3uz/L59ry6HHjN+ouVjOdUmlMswumb6WWj+LN+5lXojYtjNA1OWxJFel215xHDlNMT9fP/K0/usF1C85BfyEdmq5h32CVGI6s0PKj2rQd6Z+27tvIg741c3f6LBPC/uG9vRvxIXKfVFIw+PAc6nNusyLae36xQWLa1lftU9hTUliEe089+KVJuxA3vKQdAEUfrMpJd9mizTYzbp2rRp+DyOcIIXylS/K9mPmLUkh1XmeeRROkOIWRJ7nO/3abxIcyzzLnNysA=","merkle-array-index":11,"proof":{"hash-factory":{"hash-type":1},"path":["IDhFONWiP+HkHkpO/lgoVhroCXc45RV3c1EiVJmWO15zhzLgylIk280ssytP0ZvsPwOK1eusWFqhA27gsjZYAQ==","9VT+ZTEcZCm/3P/YBA+TDu6Acl4UEHLLaay4b0pLbo1sCK7p6nR3+RheahZx2I+1aEqtRpIBYDiTbjuxnBkYxg==","NEgILmwVF/ZGQpDteqYeIByvdbU2ld2bZwTG0wx40vIKi3TS7dejFdufEb9ZFF2DB9NK9/cZbimyLTXhi2Yw5g==","+lOGXM8yhNhqwDg5Ms7TcNTvdowl8AsDM+xcqFFXEbqYAZQS8DUnpzzD2fWKfP91rR9bPCjLFgCwFGjepBUASA=="],"tree-depth":4},"verifying-key":"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"}}}],"salt-version":0,"sig-commit":"UqB1adnqFR8Gobx6I8fjaiGfuutkEBTBfM75cm+OIaqvUgAKZfAUO2fwjs1VPTipY+OFTQMkrSjRm+6/M8iLXA==","sig-proofs":{"hash-factory":{"hash-type":1},"path":[],"tree-depth":1},"signed-weight":5000315000000000},"state-proof-type":0},"tx-type":"stpf"}],"transactions-root":"7EhLYKNWBvZZfXTMStYwu99no2kPiLSX/ovMATr3wWE=","txn-counter":10,"upgrade-state":{"current-protocol":"future","next-protocol-approvals":0,"next-protocol-switch-on":0,"next-protocol-vote-before":0},"upgrade-vote":{"upgrade-approve":false,"upgrade-delay":0}} +{"genesis-hash":"VzQ1JThQHhP+papUD3M3uZZCWixzALc2NdKNdw0NXbw=","genesis-id":"sandnet-v1","previous-block-hash":"Fvc8IbGTiRrBQP4uHkSWpfVqOeGuLjsbhID0RmacUbk=","rewards":{"fee-sink":"A7NMWS3NT3IUDMLVO26ULGXGIIOUQ3ND2TXSER6EBGRZNOBOUIQXHIBGDE","rewards-calculation-round":500000,"rewards-level":71,"rewards-pool":"7777777777777777777777777777777777777777777777777774MSJUVU","rewards-rate":249999999,"rewards-residue":5999997136},"round":2864,"seed":"eO1fkFoLJbRJMzfV6WbmMyZiUKEcHemqo05x2HVPWJ8=","state-proof-tracking":[{"next-round":3072,"online-total-weight":0,"type":0}],"timestamp":1659992405,"transactions":[{"close-rewards":0,"closing-amount":0,"confirmed-round":1,"fee":0,"first-valid":2862,"id":"G6K3ITFCN6CCJNYE525R6RBF6N35DZ6FCLTLL65LULW4TESBFS3Q","intra-round-offset":2,"last-valid":3862,"receiver-rewards":0,"round-time":1660853678,"sender":"XM6FEYVJ2XDU2IBH4OT6VZGW75YM63CM4TC6AV6BD3JZXFJUIICYTVB5EU","sender-rewards":0,"signature":{},"state-proof-transaction":{"message":{"block-headers-commitment":"2c0LiOJoMoJy7u26wD7o3S+A8Q21FZZkw22OgZsH4aw=","first-attested-round":2561,"latest-attested-round":2816,"ln-proven-weight":1662179,"voters-commitment":"waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag=="},"state-proof":{"part-proofs":{"hash-factory":{"hash-type":1},"path":[],"tree-depth":1},"positions-to-reveal":[0,0,0,1,0,0,0,0,0,1,0,1,0,1,1,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,1,1,1,1,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,1,0],"reveals":[{"participant":{"verifier":{"commitment":"8SvMm7uS8WigJaGzYDRrBpUMC6K8YdsRWpkJYp81Ry9uHlK3NsX2o8jkC1x4Yw6NGyRBRft5nfO6AZp36rcxWg==","key-lifetime":256},"weight":4000252000000000},"position":0,"sig-slot":{"lower-sig-weight":0,"signature":{"falcon-signature":"ugDJdzkHdVSVpzkpbTODYYAnUu+fAwQj/i8FiediMpEr3BHtb2F6wOFY3vQBNVlYPQE5K+nn1nzT2eqsIV7evLDapqW83/iwCG1h3sqhE/Ij/0EHaNmYvRXp1KfAEjzuGWWtVjeMQu6Y4pKvy1tq6sujVBwu7pTq2+hcNCCs41LydoywS91RkGGxDfazcHlMX4pyfzC54pyALBmGT1HQcD+RsxCZuQhaIGTVxbMH9JiwLMIWwvQbNUZvOOZAjtNvgWFdXJeff8fMb1c4S2fy0W5WJ7i0GGdd1Xum9GnEScY6jgimOi6NUTH+UWBTfRk9/7cYJeX1NZVORJT6q+tshylON/4Vj2kaeUkSYkekND4UZWInRiGTpDYLdiIu/vM0Alxl0oIy28PtGjr6aI7nNMOjmkWtO3b86biHddOlVFBzHH1Mkbsh7mcvv4j7ZmKTQ6JLsxtdtnoDiJNcWaSbVQesQRZOKjp7LS8Na8eBwJrcoTHtJ5iZoj6lCO2TU49YHLe6Y8OpPaySXtOW6QQ54/DPkf0GnSt9NO2pqHf+aIoGXqW2NQMoy6KMXVYujfWkFZLZw8c6yb/qE8v2fSqO3A9cmicRNcZMaaTFKqGJtsM/ObyrMSXvx6caduZqyaUa3MQxLRHV6nshasj9dKHGDsbQqmZmCsXBxzGHilcp7iKIftXZu0gU/gdNhyAYyZKbHKOkMV3fPnVXhJ34UtAiOkRPFHKmLKrdaILmNNyuvfOO26mwt+YHEuHlUUM/VLLjlDsGE4Ef8MyVDIS/vIjD/dHvM42ARCUWLisgv8ToNXlXwMjB4rP07wCuqBYeC68e/fFiBgFMwxTy1sRcpBRyRs1oMZhIzv1IQ1r2NevaZLEDFdJH9vi52yLDZquIR6uRq2PPDy0hbDQQu/9y1R3CON2UpxTGoWst2j+ttMZ1OWaT2kGjcJKVyotixwLLwUdYfxYrzyvgTBGyqLjSrLrHd5So4kY8hAx+RxT3XR+axt4AeOEo4LzlKl7HuwXjnvA20t2+SQbYDNm4eX4uhga7YMn4zooroMX80VhCBHi10faUZXXLT4Ngk0881Op0J48ThhYP1Sf/hzMIW77QfSYt/kajZ3rld7eKiRfCotLmCojxf2Tr9p3O9r633Tx7LcRyLFRL2c9PJHGtXNCP+kLSnlrxGIYloHCtkW1zDL5JWauVDgfeULr+Goshk1ZQVEI3gHPte7/X2oFHfdKmim/umsXN/ESft+lzpwySGNoG/tB8NGuX6zXSQAW5p2SzExVDOIbLP61sLZN9kF9nzkcwx+V/8vyP0xti3qy5nMQlZd4pEu4sJOPxP72IHFl9VGT26tLha8I8jQICg0B6EjpyfqVFzn0XrKDDEbyhdnstQxG+Zgu++RH48DykhYFEvJTJljcixZqb7sZLAZUoRy4pMIotWlHoih6LPjkb233n+7wB5dJluewV5VZj8rOWmY8jPAwh13gJRp6ETfQFdU9DIbzfrDOpu6crfOzs1QrIdnduHhy4+Jox15vHPlk1ExJiSTs/k7FcHBgCs0vrMEY4nmfEb8TItAl7GKpn1Fw1onxTVNTBEy2qXKMA5h4p++Mg0U7uEEefIuc/Pz4MLhrFohL9XS23MpIkEtU=","merkle-array-index":11,"proof":{"hash-factory":{"hash-type":1},"path":["kjMClw7Cj4NPcQYST1KW1jA08ZuyxzpTZAStj87WGooSey5nyyhnWlPuNcvuXMfEXj8TLnmllrJS+fsdiAPYQQ==","deIE0tGTdzGGlqGBs2glPNb7qMObgfDyx+Phr4r6yNY5pu1X2X7LpvQPvaplhTdgWD3pqNOwXSD68825PugnUA==","k7n3HzFxge883zdLR/MkTJUM+Z+ECXR1ISKbCI2fAEF06AuMmV/sF2f5tA95FvTCAIbXA5QKT0hbo0dapK+TiA==","BlH3eQeuIuvfQMSV7NX5J1YmHZN+tTnYyRqYFlubV82MKG80klkma1b+FEw5m5VtkpuWpWg/ezVcIOWmdCmJEg=="],"tree-depth":4},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"v34aOEpoWCkletfLSvS6ndWcFDFmxlEWtz8BIxYcQh8r6BC89XzQESqu0E3fzyUwKR/LNRLGkjyYcL6GiIDxXQ==","key-lifetime":256},"weight":1000063000000000},"position":1,"sig-slot":{"lower-sig-weight":4000252000000000,"signature":{"falcon-signature":"ugDOYbSIGGH4NLVDTNilnuQFXb3SkKcjzch2Hvp8wQvw2NLKPpXncZV+ZY+WnLHkMnmpQxzlCSOCmDgz/+P3Y8hllQyc75pMJINTxFt+B6P5dKtuXlijYmsVxq7Chvb0cORizxc6Dw3iQKFA+Uq/rm/qJLiyMQ26ri6l7b5wcyVex1W5ohYOmx9vkkqzveg7CI8tsgCDeXOk2s0qeWqWXHi68q7RuWd5AsigB5KfN/Y16tEqbJDuvFeFoaNUmy6Gu75NyOarT0j0mRImxD1wpaKB8kdieiyfHdbSseeRYovIDeQc26HcNxlKttbUZHJMQo52wk8EmUmo52P0qpwnossfgw/k+ZvCDAxORSdaPCzix+nBM1qc3a9reLHUWQ9fOK2T+7oDkWCQ5Y9Q1mmhqbUZjDgtiwBWdVU9dwcsiJwOl0YdZIpQQ8s74L4T8rlqgtxRdmCxOCfDdYAM9bjutrYHEKYrvGRJXIGjSsclOeeSZX2440v0Ov5ZyOrhnZ6jw8GqIdtsFtyTQc9td3rnzgjkmiaFcA40/nR81Z4EMLDQIe0CL/feUdE3pZNR4vsCc+t03RfV64Qb5kmILSzEridVqCBS/B1/Pxhs22iETRTWPZsGJNZV6Fed1w0AV/2tKtfQF7xF2kEAXqa3vfrlE+ZlUDrcsXNDTVEUUz6+Fo3l3/OyZNymo4xryIIgRmjHKXJUSqKK7cnjAkdzqlli+TuLhY4fvWVoE0c8R/pwaOr7wukiT34rukY95KWvOIalZatIWe8HChzAG4z+RUbALtHB5krxDCIhlaKbFt8F3GJejlTOD4ZB+o72siMcYF19LjBAxBO9StuhFuiseymGLHS8Rzt9Qr8w3voXASlDyWp4Wu77ZlxkzO8XwdraCZjoclaKBI5xhkoUs9nzWpn2eWz87aG+TgzffJS5iqH4nHWz0+2XcicoVV1yh2H+63YiEGLQme0FuF3UhQaKmBa1JhZr9okrPPdukuaQduAoUPVMprhRo4FLf91k2YIiZoM+Jmcb3QlwYyQXTLgwpCyhT9qYMYFxmHsZSGMoaHuoTyVNBWtVoX4wovcRkdOmNVlxlcWylkI1mmtY1n3kr7StUk5zm5zsoymDVqd4JuIb2UmSKSsYkEsc+Uvpmmf6WzhMojdwQ5wtS5GIxjRY5D55qNQXfZR6PJuy+5XhLkg6Co8UonK0RCSyQscvBvQuHwxt5hBNNTQyAGXeXNuWnu1wu7YqQNfum0MpXoTLP/JrPETOZ0aNjjKcNWam6M1osqR/hR03iX17SZ12nLkpt8r5HUQv8fqR2aCkTc8i8Go1cjswkkswzFSnAJWS+i9iOdlSMEkpkD+zlh6lqaTDkIkVq0hPtEsDTVNTYHgShJ3uz/L59ry6HHjN+ouVjOdUmlMswumb6WWj+LN+5lXojYtjNA1OWxJFel215xHDlNMT9fP/K0/usF1C85BfyEdmq5h32CVGI6s0PKj2rQd6Z+27tvIg741c3f6LBPC/uG9vRvxIXKfVFIw+PAc6nNusyLae36xQWLa1lftU9hTUliEe089+KVJuxA3vKQdAEUfrMpJd9mizTYzbp2rRp+DyOcIIXylS/K9mPmLUkh1XmeeRROkOIWRJ7nO/3abxIcyzzLnNysA=","merkle-array-index":11,"proof":{"hash-factory":{"hash-type":1},"path":["IDhFONWiP+HkHkpO/lgoVhroCXc45RV3c1EiVJmWO15zhzLgylIk280ssytP0ZvsPwOK1eusWFqhA27gsjZYAQ==","9VT+ZTEcZCm/3P/YBA+TDu6Acl4UEHLLaay4b0pLbo1sCK7p6nR3+RheahZx2I+1aEqtRpIBYDiTbjuxnBkYxg==","NEgILmwVF/ZGQpDteqYeIByvdbU2ld2bZwTG0wx40vIKi3TS7dejFdufEb9ZFF2DB9NK9/cZbimyLTXhi2Yw5g==","+lOGXM8yhNhqwDg5Ms7TcNTvdowl8AsDM+xcqFFXEbqYAZQS8DUnpzzD2fWKfP91rR9bPCjLFgCwFGjepBUASA=="],"tree-depth":4},"verifying-key":"ClBGpOjhDmVJhm0IuWCFXJSH2zuOQTRZNaAJlIdnGdnYhikAB/IfeY7bUHmdsAEhTOslCNo4hY37ePWCBFDEyWnBXZZS0lsTXaIjNSqyHmSFxo+hBwpkQgpR3ylFbmnjSJdEGJHXenNpZmJ5yVIxSpS3njmkgQvemfC9aWmavZfZZfijaXUNRubwIKJ5Tj72eZ3E6bG2Wflurvxqln9Z4BIeVX31aX/QQxYWp+TGqUZnoAfk3INOmHGp2G1Rc3KteICTTRMx5CeEhBUEv0FsyxJN+iThGcIGr7uqzkalUW/WaZpG+rGt8RDYwTSHkEpmGYopbYSrSWnI0ndCLzJMu1r+SUqWwW8U7aChGay9Q/PQuln1zLloyHW/cufnX0WEpi1+hn9V2U7qV7IZ15gXHjWHiQnKCSqd4s8NvF6CxWLIwMwyRnVp5BjxEd3suQueTGZVDPrWRnhhvNhR0kcYnSa8iecR/Zz5A7Uuy4GpZpcl/MwdKjlVBVcKar2FDTBb4jQQGqaA6eRqBVqsR9VCCp7UF1iRJqR4+VG0ItXymcm86/BFgQHA8dVwaTVhyX+rHaEZsYT44GRgVnPyK+NpBNEPtMO4GIC2HOGtw+cqaX/B+QsDooh1qC7bvSS8ub1REe0Zg3S2/Oj8wF2IgN/GG2MCTBAxFGfhOgQBlcW5au8lbRhY4G60cy4rEDbDmoka9YpCS5oR+qGTscbpq7Z3ysAMjSVlMxGXa8ARwYy72wjLEmUZS9qK1wIYx/Ux765gNqfmW2tVNjyX9RlrpzP1BPpu6bCs3BQRWFO6fn5TgRGgaAiYH6u1mzaB3WlC8cWko0ow25QhtSwlojhP3FeuAD4wHmHPmvbFyPmH2miGZivlwFt1EYxm3Cr8evDQieJqCy4OfkLs6F1UQlmQmJw6vWgWKpzc+ogVG8PKiiJ4Khp42OaQFHnLlMzpi5VyyxezVLkXTZzxbhPJXVVdCY4FS55avGlTkLOQ4Kz5pGlKCdrB0YAeQCbGrRCqEzq3Bp56nNTovljmmldVRGt1RFMX5I+EloaxhsulIoBB4bRA2zDax/cV0SeQkvjK4xMWSS7cBpBkQFRaQVSeWyEr5WpBvqDyrnaaktoXTHo07yeTZolPwt8SZSFMYKCCU/0el4F07fcia7kF6GJY9oQ7uVCpMZNh87luhZE4JjVztjrq4xMfTr7x+v4siSXwQDeViwsenuETjUeyKz5Y16BNomVgDtce3d2qciL01BjWBJFnuYeAVw35qvIk4tZE9GEWg9gXj0Ikt5/i4Q1cYcavGnWBHjLw6xGraej+2mkH0G0xg5K3UY1LqDtBDktiDXjrCSVLQ0+yA1Z9XS0TqcADt8iJS6DHFCwnB7c1waYqlFg9ahRYJtABgFwEV1maOy7O1zYTjruTbpFFF+OCj67US0pGKZNZoPnt30Vw1QmUFa/fbWUyulMi8021GPCjoTCdSD9Fkl6SDETlFe+NNlS97xmj6GQxtTFKkB/YQ3ibB93VKJlanYrthl9ylUWbYcIFEUotkUEaqyzy+uBlL0eFKNjhGMbSV861pP5MqE6RkdJx7w6A0OdjT+/OBZG4uv/gmBHGApLd5mcweMl0zZUNU4k8JDfcjoOiRNXuCaiLEaehomJhM1gjspnbunYgaNS8luFrWTFRV+gApW40Cslogi2KxYZCGVwX4emUkNbrnYi4mP3air9Wmvi5UII3aIB0JaMKM774Qc/kSCzM6nM6WmqcLb7kMG/rmHp0OP2euaf8bdvCKXhRCoPS4kfFga128ISp2KPah5bwLi4zvPRxbJUXiVJcqqvp5DjJI3Y/ylCTgV37b8znkfCGF1Zau51CGTc5rWJyQgMZK4uBd8wtS9lVZXN8Npt1iEkhBbyJolBqVhC+gsXnV0lV4yefzrB2MkGnQu+wQynH0WXQ254Sq3gc6C9WSYXEOBimkGxgSb4szJDxK3LHifiLNFm0rqFIMHa4wFgWFwc8olNQha11kMLJbZ4Gv1bFM5rjsVUlb9BeWreAvQ0q9lDPRkU9J/9AG1OyB8h+qhNdyhnUHdbJBNbqRSlU4nmIEYWRg4BP7OsTdSkaQMiCd6WO+rcanPbZriFhUCJ2VGUnPcqZEyfE/wtUg8NbFScpsslkbAN4t97plEPRjj3dFSq2HoOxLGEno2MiOikeWR7BdH+Ut+SqQNJDJA3Rx4llocopCXcFj1Z0XpSUCGg8qsYwdN9OYSXb8ELiJgO0+MtMnVgJgSl4eYI4XVoQVeLjcrU0TUf5nNRKxQ2L74FGTmjBtNzHPScKmsHWS4QhdO6x7u5wcA3Ih1SArSE8bWFzl3CidvYDy0vlp/xUo1Pq3CIU2lN7YComYeZXFCeHdX4SxuiRbbEI8Pp7J/4="}}}],"salt-version":0,"sig-commit":"UqB1adnqFR8Gobx6I8fjaiGfuutkEBTBfM75cm+OIaqvUgAKZfAUO2fwjs1VPTipY+OFTQMkrSjRm+6/M8iLXA==","sig-proofs":{"hash-factory":{"hash-type":1},"path":[],"tree-depth":1},"signed-weight":5000315000000000},"state-proof-type":0},"tx-type":"stpf"}],"transactions-root":"7EhLYKNWBvZZfXTMStYwu99no2kPiLSX/ovMATr3wWE=","transactions-root-sha256":"ELBqekgmLFfXVpyke8lpjjNv2pOBBnQGvEu5tfFe35A=","txn-counter":10,"upgrade-state":{"current-protocol":"future","next-protocol-approvals":0,"next-protocol-switch-on":0,"next-protocol-vote-before":0},"upgrade-vote":{"upgrade-approve":false,"upgrade-delay":0}} From 31e7ddf00abcbedd462ab9159365a645081ea8aa Mon Sep 17 00:00:00 2001 From: AlgoStephenAkiki <85183435+AlgoStephenAkiki@users.noreply.github.com> Date: Fri, 19 Aug 2022 13:55:04 -0400 Subject: [PATCH 27/39] Accept yaml and yml configuration files. (#1181) --- cmd/algorand-indexer/daemon.go | 51 +++++++++-- cmd/algorand-indexer/daemon_test.go | 136 +++++++++++++++++++--------- cmd/algorand-indexer/main.go | 7 +- config/config.go | 4 +- 4 files changed, 141 insertions(+), 57 deletions(-) diff --git a/cmd/algorand-indexer/daemon.go b/cmd/algorand-indexer/daemon.go index 0c7c6a563..3ef7254eb 100644 --- a/cmd/algorand-indexer/daemon.go +++ b/cmd/algorand-indexer/daemon.go @@ -32,6 +32,32 @@ import ( "github.com/algorand/indexer/util/metrics" ) +// GetConfigFromDataDir Given the data directory, configuration filename and a list of types, see if +// a configuration file that matches was located there. If no configuration file was there then an +// empty string is returned. If more than one filetype was matched, an error is returned. +func GetConfigFromDataDir(dataDirectory string, configFilename string, configFileTypes []string) (string, error) { + count := 0 + fullPath := "" + var err error + + for _, configFileType := range configFileTypes { + autoloadParamConfigPath := filepath.Join(dataDirectory, configFilename+"."+configFileType) + if util.FileExists(autoloadParamConfigPath) { + count++ + fullPath = autoloadParamConfigPath + } + } + + if count > 1 { + return "", fmt.Errorf("config filename (%s) in data directory (%s) matched more than one filetype: %v", + configFilename, dataDirectory, configFileTypes) + } + + // if count == 0 then the fullpath will be set to "" and error will be nil + // if count == 1 then it fullpath will be correct + return fullPath, err +} + type daemonConfig struct { flags *pflag.FlagSet algodDataDir string @@ -146,17 +172,22 @@ func configureIndexerDataDir(indexerDataDir string) error { func loadIndexerConfig(indexerDataDir string, configFile string) error { var err error var resolvedConfigPath string - indexerConfigAutoLoadPath := filepath.Join(indexerDataDir, autoLoadIndexerConfigName) - indexerConfigFound := util.FileExists(indexerConfigAutoLoadPath) + potentialIndexerConfigPath, err := GetConfigFromDataDir(indexerDataDir, autoLoadIndexerConfigFileName, config.FileTypes[:]) + if err != nil { + logger.Error(err) + return err + } + indexerConfigFound := potentialIndexerConfigPath != "" + if indexerConfigFound { //autoload if configFile != "" { err = fmt.Errorf("indexer configuration was found in data directory (%s) as well as supplied via command line. Only provide one", - indexerConfigAutoLoadPath) + potentialIndexerConfigPath) logger.Error(err) return err } - resolvedConfigPath = indexerConfigAutoLoadPath + resolvedConfigPath = potentialIndexerConfigPath } else if configFile != "" { // user specified resolvedConfigPath = configFile @@ -188,17 +219,21 @@ func loadIndexerParamConfig(cfg *daemonConfig) error { logger.WithError(err).Errorf("API Parameter Error: %v", err) return err } - autoloadParamConfigPath := filepath.Join(cfg.indexerDataDir, autoLoadParameterConfigName) - paramConfigFound := util.FileExists(autoloadParamConfigPath) + potentialParamConfigPath, err := GetConfigFromDataDir(cfg.indexerDataDir, autoLoadParameterConfigFileName, config.FileTypes[:]) + if err != nil { + logger.Error(err) + return err + } + paramConfigFound := potentialParamConfigPath != "" // If we auto-loaded configs but a user supplied them as well, we have an error if paramConfigFound { if cfg.suppliedAPIConfigFile != "" { err = fmt.Errorf("api parameter configuration was found in data directory (%s) as well as supplied via command line. Only provide one", - filepath.Join(cfg.indexerDataDir, autoLoadParameterConfigName)) + potentialParamConfigPath) logger.WithError(err).Errorf("indexer parameter config error: %v", err) return err } - cfg.suppliedAPIConfigFile = autoloadParamConfigPath + cfg.suppliedAPIConfigFile = potentialParamConfigPath logger.Infof("Auto-loading parameter configuration file: %s", suppliedAPIConfigFile) } return err diff --git a/cmd/algorand-indexer/daemon_test.go b/cmd/algorand-indexer/daemon_test.go index 768fa0e72..2d25491c9 100644 --- a/cmd/algorand-indexer/daemon_test.go +++ b/cmd/algorand-indexer/daemon_test.go @@ -21,6 +21,7 @@ import ( "github.com/algorand/go-algorand/ledger/ledgercore" "github.com/algorand/go-algorand/rpcs" + "github.com/algorand/indexer/config" "github.com/algorand/indexer/processor/blockprocessor" itest "github.com/algorand/indexer/util/test" ) @@ -90,21 +91,61 @@ func createTempDir(t *testing.T) string { return dir } -// Make sure we output and return an error when both an API Config and -// enable all parameters are provided together. -func TestConfigWithEnableAllParamsExpectError(t *testing.T) { +// TestParameterConfigErrorWhenBothFileTypesArePresent test that if both file types are there then it is an error +func TestParameterConfigErrorWhenBothFileTypesArePresent(t *testing.T) { + indexerDataDir := createTempDir(t) defer os.RemoveAll(indexerDataDir) - autoloadPath := filepath.Join(indexerDataDir, autoLoadIndexerConfigName) - os.WriteFile(autoloadPath, []byte{}, fs.ModePerm) + for _, configFiletype := range config.FileTypes { + autoloadPath := filepath.Join(indexerDataDir, autoLoadParameterConfigFileName+"."+configFiletype) + os.WriteFile(autoloadPath, []byte{}, fs.ModePerm) + } + daemonConfig := &daemonConfig{} daemonConfig.flags = pflag.NewFlagSet("indexer", 0) daemonConfig.indexerDataDir = indexerDataDir - daemonConfig.enableAllParameters = true - daemonConfig.suppliedAPIConfigFile = "foobar" err := runDaemon(daemonConfig) - errorStr := "not allowed to supply an api config file and enable all parameters" - assert.EqualError(t, err, errorStr) + errorStr := fmt.Errorf("config filename (%s) in data directory (%s) matched more than one filetype: %v", + autoLoadParameterConfigFileName, indexerDataDir, config.FileTypes) + assert.EqualError(t, err, errorStr.Error()) +} + +// TestIndexerConfigErrorWhenBothFileTypesArePresent test that if both file types are there then it is an error +func TestIndexerConfigErrorWhenBothFileTypesArePresent(t *testing.T) { + + indexerDataDir := createTempDir(t) + defer os.RemoveAll(indexerDataDir) + for _, configFiletype := range config.FileTypes { + autoloadPath := filepath.Join(indexerDataDir, autoLoadIndexerConfigFileName+"."+configFiletype) + os.WriteFile(autoloadPath, []byte{}, fs.ModePerm) + } + + daemonConfig := &daemonConfig{} + daemonConfig.flags = pflag.NewFlagSet("indexer", 0) + daemonConfig.indexerDataDir = indexerDataDir + err := runDaemon(daemonConfig) + errorStr := fmt.Errorf("config filename (%s) in data directory (%s) matched more than one filetype: %v", + autoLoadIndexerConfigFileName, indexerDataDir, config.FileTypes) + assert.EqualError(t, err, errorStr.Error()) +} + +// Make sure we output and return an error when both an API Config and +// enable all parameters are provided together. +func TestConfigWithEnableAllParamsExpectError(t *testing.T) { + for _, configFiletype := range config.FileTypes { + indexerDataDir := createTempDir(t) + defer os.RemoveAll(indexerDataDir) + autoloadPath := filepath.Join(indexerDataDir, autoLoadIndexerConfigFileName+"."+configFiletype) + os.WriteFile(autoloadPath, []byte{}, fs.ModePerm) + daemonConfig := &daemonConfig{} + daemonConfig.flags = pflag.NewFlagSet("indexer", 0) + daemonConfig.indexerDataDir = indexerDataDir + daemonConfig.enableAllParameters = true + daemonConfig.suppliedAPIConfigFile = "foobar" + err := runDaemon(daemonConfig) + errorStr := "not allowed to supply an api config file and enable all parameters" + assert.EqualError(t, err, errorStr) + } } func TestConfigDoesNotExistExpectError(t *testing.T) { @@ -153,20 +194,23 @@ func TestConfigSpecifiedTwiceExpectError(t *testing.T) { } func TestLoadAPIConfigGivenAutoLoadAndUserSuppliedExpectError(t *testing.T) { - indexerDataDir := createTempDir(t) - defer os.RemoveAll(indexerDataDir) - - autoloadPath := filepath.Join(indexerDataDir, autoLoadParameterConfigName) - userSuppliedPath := filepath.Join(indexerDataDir, "foobar.yml") - os.WriteFile(autoloadPath, []byte{}, fs.ModePerm) - cfg := &daemonConfig{} - cfg.indexerDataDir = indexerDataDir - cfg.suppliedAPIConfigFile = userSuppliedPath - err := loadIndexerParamConfig(cfg) - errorStr := fmt.Sprintf("api parameter configuration was found in data directory (%s) as well as supplied via command line. Only provide one", - autoloadPath) - assert.EqualError(t, err, errorStr) + for _, configFiletype := range config.FileTypes { + indexerDataDir := createTempDir(t) + defer os.RemoveAll(indexerDataDir) + + autoloadPath := filepath.Join(indexerDataDir, autoLoadParameterConfigFileName+"."+configFiletype) + userSuppliedPath := filepath.Join(indexerDataDir, "foobar.yml") + os.WriteFile(autoloadPath, []byte{}, fs.ModePerm) + cfg := &daemonConfig{} + cfg.indexerDataDir = indexerDataDir + cfg.suppliedAPIConfigFile = userSuppliedPath + + err := loadIndexerParamConfig(cfg) + errorStr := fmt.Sprintf("api parameter configuration was found in data directory (%s) as well as supplied via command line. Only provide one", + autoloadPath) + assert.EqualError(t, err, errorStr) + } } func TestLoadAPIConfigGivenUserSuppliedExpectSuccess(t *testing.T) { @@ -183,17 +227,19 @@ func TestLoadAPIConfigGivenUserSuppliedExpectSuccess(t *testing.T) { } func TestLoadAPIConfigGivenAutoLoadExpectSuccess(t *testing.T) { - indexerDataDir := createTempDir(t) - defer os.RemoveAll(indexerDataDir) - - autoloadPath := filepath.Join(indexerDataDir, autoLoadParameterConfigName) - os.WriteFile(autoloadPath, []byte{}, fs.ModePerm) - cfg := &daemonConfig{} - cfg.indexerDataDir = indexerDataDir - - err := loadIndexerParamConfig(cfg) - assert.NoError(t, err) - assert.Equal(t, autoloadPath, cfg.suppliedAPIConfigFile) + for _, configFiletype := range config.FileTypes { + indexerDataDir := createTempDir(t) + defer os.RemoveAll(indexerDataDir) + + autoloadPath := filepath.Join(indexerDataDir, autoLoadParameterConfigFileName+"."+configFiletype) + os.WriteFile(autoloadPath, []byte{}, fs.ModePerm) + cfg := &daemonConfig{} + cfg.indexerDataDir = indexerDataDir + + err := loadIndexerParamConfig(cfg) + assert.NoError(t, err) + assert.Equal(t, autoloadPath, cfg.suppliedAPIConfigFile) + } } func TestIndexerDataDirNotProvidedExpectError(t *testing.T) { @@ -217,18 +263,20 @@ func TestIndexerPidFileExpectSuccess(t *testing.T) { } func TestIndexerPidFileCreateFailExpectError(t *testing.T) { - indexerDataDir := createTempDir(t) - defer os.RemoveAll(indexerDataDir) - autoloadPath := filepath.Join(indexerDataDir, autoLoadIndexerConfigName) - os.WriteFile(autoloadPath, []byte{}, fs.ModePerm) + for _, configFiletype := range config.FileTypes { + indexerDataDir := createTempDir(t) + defer os.RemoveAll(indexerDataDir) + autoloadPath := filepath.Join(indexerDataDir, autoLoadIndexerConfigFileName+"."+configFiletype) + os.WriteFile(autoloadPath, []byte{}, fs.ModePerm) - invalidDir := filepath.Join(indexerDataDir, "foo", "bar") - cfg := &daemonConfig{} - cfg.pidFilePath = invalidDir + invalidDir := filepath.Join(indexerDataDir, "foo", "bar") + cfg := &daemonConfig{} + cfg.pidFilePath = invalidDir - cfg.flags = pflag.NewFlagSet("indexer", 0) - cfg.indexerDataDir = indexerDataDir + cfg.flags = pflag.NewFlagSet("indexer", 0) + cfg.indexerDataDir = indexerDataDir - assert.ErrorContains(t, runDaemon(cfg), "pid file") - assert.Error(t, createIndexerPidFile(cfg.pidFilePath)) + assert.ErrorContains(t, runDaemon(cfg), "pid file") + assert.Error(t, createIndexerPidFile(cfg.pidFilePath)) + } } diff --git a/cmd/algorand-indexer/main.go b/cmd/algorand-indexer/main.go index c1540fcca..8a0a117fc 100644 --- a/cmd/algorand-indexer/main.go +++ b/cmd/algorand-indexer/main.go @@ -21,8 +21,8 @@ import ( "github.com/algorand/indexer/version" ) -const autoLoadIndexerConfigName = config.FileName + "." + config.FileType -const autoLoadParameterConfigName = "api_config.yml" +const autoLoadIndexerConfigFileName = config.FileName +const autoLoadParameterConfigFileName = "api_config" // Calling os.Exit() directly will not honor any defer'd statements. // Instead, we will create an exit type and handler so that we may panic @@ -134,7 +134,8 @@ func init() { // Setup configuration file viper.SetConfigName(config.FileName) - viper.SetConfigType(config.FileType) + // just hard-code yaml since we support multiple yaml filetypes + viper.SetConfigType("yaml") viper.SetEnvKeyReplacer(strings.NewReplacer("-", "_")) if err := viper.ReadInConfig(); err != nil { diff --git a/config/config.go b/config/config.go index 2ed3fe47f..27cf0d9e6 100644 --- a/config/config.go +++ b/config/config.go @@ -11,8 +11,8 @@ import ( // EnvPrefix is the prefix for environment variable configurations. const EnvPrefix = "INDEXER" -// FileType is the type of the config file. -const FileType = "yml" +// FileTypes is an array of types of the config file. +var FileTypes = [...]string{"yml", "yaml"} // FileName is the name of the config file. Don't use 'algorand-indexer', viper // gets confused and thinks the binary is a config file with no extension. From 499b7846ce5f8cec3dddf517e2a13eca7c416d8c Mon Sep 17 00:00:00 2001 From: Michael Diamant Date: Sat, 20 Aug 2022 13:22:02 -0400 Subject: [PATCH 28/39] Fix bug in reveals lookup (#1198) --- api/converter_utils.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/converter_utils.go b/api/converter_utils.go index 1baf2381b..d9a6a8da0 100644 --- a/api/converter_utils.go +++ b/api/converter_utils.go @@ -432,7 +432,7 @@ func signedTxnWithAdToTransaction(stxn *transactions.SignedTxnWithAD, extra rowD } sort.Slice(keys, func(i, j int) bool { return keys[i] < keys[j] }) reveals := make([]generated.StateProofReveal, len(stxn.Txn.StateProof.Reveals)) - for _, key := range keys { + for i, key := range keys { revToConv := stxn.Txn.StateProof.Reveals[key] commitment := revToConv.Part.PK.Commitment[:] falconSig := []byte(revToConv.SigSlot.Sig.Signature) @@ -442,7 +442,7 @@ func signedTxnWithAdToTransaction(stxn *transactions.SignedTxnWithAD, extra rowD proofPath[idx] = proofPart } - reveals[key] = generated.StateProofReveal{ + reveals[i] = generated.StateProofReveal{ Participant: &generated.StateProofParticipant{ Verifier: &generated.StateProofVerifier{ Commitment: &commitment, From 18b8a22cdd1bad3c972745e008fb2fe3b0e74b4d Mon Sep 17 00:00:00 2001 From: Michael Diamant Date: Sat, 20 Aug 2022 13:22:02 -0400 Subject: [PATCH 29/39] Fix bug in reveals lookup (#1198) --- api/converter_utils.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/converter_utils.go b/api/converter_utils.go index cf5a02120..6ad886bea 100644 --- a/api/converter_utils.go +++ b/api/converter_utils.go @@ -432,7 +432,7 @@ func signedTxnWithAdToTransaction(stxn *transactions.SignedTxnWithAD, extra rowD } sort.Slice(keys, func(i, j int) bool { return keys[i] < keys[j] }) reveals := make([]generated.StateProofReveal, len(stxn.Txn.StateProof.Reveals)) - for _, key := range keys { + for i, key := range keys { revToConv := stxn.Txn.StateProof.Reveals[key] commitment := revToConv.Part.PK.Commitment[:] falconSig := []byte(revToConv.SigSlot.Sig.Signature) @@ -442,7 +442,7 @@ func signedTxnWithAdToTransaction(stxn *transactions.SignedTxnWithAD, extra rowD proofPath[idx] = proofPart } - reveals[key] = generated.StateProofReveal{ + reveals[i] = generated.StateProofReveal{ Participant: &generated.StateProofParticipant{ Verifier: &generated.StateProofVerifier{ Commitment: &commitment, From 1195fcf1e4712367c8ed1057a3c8cefc79a46581 Mon Sep 17 00:00:00 2001 From: DevOps Service Date: Sat, 20 Aug 2022 17:34:57 +0000 Subject: [PATCH 30/39] Bump version to 2.14.0-rc3 --- .version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.version b/.version index 8c690861d..5c4974a25 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -2.14.0-rc2 +2.14.0-rc3 From 1ce539a4f6c194b2fa29900ab14da5bd25811a36 Mon Sep 17 00:00:00 2001 From: algoidan <79864820+algoidan@users.noreply.github.com> Date: Tue, 23 Aug 2022 18:44:55 +0300 Subject: [PATCH 31/39] add state proof example with high reveal index - from betanet (#1199) --- api/handlers_test.go | 14 ++++++++++++++ .../state_proof_with_index.response | 1 + api/test_resources/state_proof_with_index.txn | Bin 0 -> 82786 bytes api/test_resources/stpf_block_high_index.block | Bin 0 -> 90683 bytes .../stpf_block_high_index_response.json | 1 + 5 files changed, 16 insertions(+) create mode 100644 api/test_resources/state_proof_with_index.response create mode 100755 api/test_resources/state_proof_with_index.txn create mode 100644 api/test_resources/stpf_block_high_index.block create mode 100644 api/test_resources/stpf_block_high_index_response.json diff --git a/api/handlers_test.go b/api/handlers_test.go index 3a89f1231..ef9236a17 100644 --- a/api/handlers_test.go +++ b/api/handlers_test.go @@ -628,6 +628,15 @@ func TestFetchTransactions(t *testing.T) { loadTransactionFromFile("test_resources/state_proof.response"), }, }, + { + name: "State Proof Txn - High Reveal Index", + txnBytes: [][]byte{ + loadResourceFileOrPanic("test_resources/state_proof_with_index.txn"), + }, + response: []generated.Transaction{ + loadTransactionFromFile("test_resources/state_proof_with_index.response"), + }, + }, } // use for the brach below and createTxn helper func to add a new test case @@ -1270,6 +1279,11 @@ func TestFetchBlock(t *testing.T) { blockBytes: loadResourceFileOrPanic("test_resources/stpf_block.block"), expected: loadBlockFromFile("test_resources/stpf_block_response.json"), }, + { + name: "State Proof Block - High Reveal Index", + blockBytes: loadResourceFileOrPanic("test_resources/stpf_block_high_index.block"), + expected: loadBlockFromFile("test_resources/stpf_block_high_index_response.json"), + }, } for _, tc := range testcases { diff --git a/api/test_resources/state_proof_with_index.response b/api/test_resources/state_proof_with_index.response new file mode 100644 index 000000000..7c8e9ff4f --- /dev/null +++ b/api/test_resources/state_proof_with_index.response @@ -0,0 +1 @@ +{"close-rewards":0,"closing-amount":0,"confirmed-round":1,"fee":0,"first-valid":20028289,"id":"YLOVOY45NVAV22BERQADJH5E5LXSKJLQCOS42FN4IUF2BQ5WVJTQ","intra-round-offset":2,"last-valid":20029289,"receiver-rewards":0,"round-time":1661088335,"sender":"XM6FEYVJ2XDU2IBH4OT6VZGW75YM63CM4TC6AV6BD3JZXFJUIICYTVB5EU","sender-rewards":0,"signature":{},"state-proof-transaction":{"message":{"block-headers-commitment":"ZClIiTWJXFe6gpzHC+5imgisJOWEdV0k52xxhRkBulE=","first-attested-round":20027905,"latest-attested-round":20028160,"ln-proven-weight":2334949,"voters-commitment":"YvAZnMZrs+r/1V+MdyHco9OFGV8tLWq25p/onfPe9ox41zE0TlWZITXUGq037JepxGt6W9G/SSEu9vOhbLN65w=="},"state-proof":{"part-proofs":{"hash-factory":{"hash-type":1},"path":["waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","gUbLag90ryPo4QdPaGtlornLHX7kKgRxKK5n3Ezo55FIFZw6IKpbIVoYzIbI1uHWceoBFNoXr6fqkrPGhmSPmA==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","ao7DK6WeLMzlG5BS5j+/N9uWL189AZjs1zydciQRNYy5MVdpG27cDlHVXJkA3aU44FQm6YgiNc069Hi2IUH+3Q==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag=="],"tree-depth":5},"positions-to-reveal":[8,5,4,2,16,12,9,2,17,9,15,11,16,0,19,0,8,7,14,15,11,0,4,12,15,13,15,0,8,8,12,12,2,0,1,11,10,3,15,10,4,5,15,5,7,5,3,9,13,6,16,11,3,19,12,15,7,0,5,8,15,9,12,10,8,6,13,15,12,9,8,8,3,19,15,19,1,0,13,4,16,15,10,14,8,7,4,15,9,5,14,6,14,10,13,4,15,7,16,8,10,12,0,0,11,14,5,2,12,12,13,4,13,6,16,13,14,5,12,1,11,0,2,6,5,1,5,17,0,10,14,6,17,6,15,11,7,16,7,14,16,7,5,2,16,17,4,10],"reveals":[{"participant":{"verifier":{"commitment":"Ejf1ezIQaBFxlxsqRI+ykf/vZuMVc/2lTJd/rC2P1NwpCFecRdDsUg5eollQhhruWj6ijFZkYyECbqf4CkyxqA==","key-lifetime":256},"weight":506298128548891},"position":0,"sig-slot":{"lower-sig-weight":0,"signature":{"falcon-signature":"ugDfq6kkSyuabrZpu2qTNI31uZNFDX4ZX5mquypPWsHoXeYXWZaqfeSUYFUall8XrmFwBTFtvTs45ZTDQwyrQ9Qt0BQp/Sp0g+LUweuK8tz8z7P8NHp7smpZFzmNSgpDaUBNIYjTIjw2qAhNMCwWBWdqWmdS18pZGim51UTUQfR62fk0frw1V+hqzIW6y1J4fbxoFKm9hW5opCPj4WrlB0Xi0He8kd+zDICgsa0Lm49GNn0fGi+VYgtTclLsl4kDQunRQ7jFa9hl8cMkChSrY6REYnJyAbnXl5Z6XRNVXhQd0TVwZtq3Z84Y/BaC+WoX1tDiwJD191X5VZpL3UUFzkCbgoKIPUh90i0ArtcnGo/WYts7YuZs4zIcCIas1ll8LpVxKodGEGq/G5OvLuuFsZ57THSCmkHb8pu5Dl8Xl4ln9YjiIqKukOL/eUvfvdXrFGIJq8CfZPfHIqdTOql45JF6D9lW7DN2NX2AYOle/0UH1lfxUKJdLGb+nPQtFVt9tmtXwjCzcElBK9pENCo9WOlzKUtBi6LvJefX+ZaNWXVV2NkFJjH8L/1j+OCQvQp6kTHMJ17/LbQnW/IPbOV0vz54gjVtxnw2aFkeNbYlt9qE7hrGhnXG0MaQyQeS4YhqPdpmMUasJ5JHsq6TiKsOheQTiqas7kLQd7UI8p7IxCzVN2zhSlvkGdkOBVLx1dpY68mnMSibhQZpjTw4/shMydh5TNONq+tJuUTrleX3YgQiSaDxNNDtwhxLdXjZP1k0mTpp5iWIlxHims682Kh6RrossZdfka43La82Uzl38Qw0ER/I2BoE2rmEN+oSBIUnTH0ZBJqTGx3pEnm07faXgQBUBoLgkGQKsgRHVfRbEmjpZ8GPdH4s39ax3EWgBZLJg08/5YveX5zM1iSaFJ0l0tNBn1f/S1qEwftgFiplTUDiRxb/z+q+zG4ryldtLc28EEbVyCZzLnOr3mSM5MWXi+nbaUMau+7+Ly5hNp4UZU4izWQr7Tty1fNezEVJHa5meb9bZxUO0I/rt0f9W6SoohGsUedMVPSAbb+SE58PIWh7iVjpQ7w2qwICsDHIZoLHApnAPjapKirVL0urFsYQmVKDGfxYKySbcPmnfi4EZIpJJbDlkp87j7NrJH6rRcguJuynL/jlhQDM7D/IYoxmh878jm15y67K6V1m870Lo5ZjWggKP2/llW5eqiJM8hl/lUNsbrDYOJUbG5xO0+qtq6ma+jVfzGuysDozNdqUOwlrqEX5LQ1VoHtZpdfYlJ20q2BO//PO1hIs90lrHRRxZc1nUSLjacC1RMvMgnKct6GSTozbv1hB+OUOQR+hZKY1/dzgyruILMyY8dkO4RrDriykSg/OOpFpSS5q5RYfxhZKzR9YTTEAcQoZQFHVOCIJHJv5PBqlu9Hm5FNbZx+ynklMRta3xCC33GlqsX/lPimUMKxKpD+c3FtkminlMwM/+dC8A6VHm+hyQwA2CmqVf+du4KZ2VbxlYMvWrYhYWmVZEEcRRNiRSAgPZjKP1b3eDnupN5v0IZiWYwmubalKDwudIJEy7GOkueywzTomyVWY48dsIhde3Qfbf4sqFDQGIwZ9uUYfjm/LsoRtJbqb+lf50D6HHW+b2GDpm9Whp6sI","merkle-array-index":4147,"proof":{"hash-factory":{"hash-type":1},"path":["ztbupAoGcfxPIL7UHWA5g3OYpmhUr/h7qviVpA3+ICRhkz7x9BgFMdwmI4hqU4yLMRPq5fxlOcCYS4s+xWFjfA==","z+K8x5kRSCA8CwYwjIyLpy8rtmCX+imNVChvzmeAYm2oJMgK6JC/DOd4vhjrLrszgJwhIr8QJnApENWb0tlEcw==","rWoDRojXDfBEz3EOq+ytRKXXiKTwfcppEB6uzW7QnbGvO5RZ6JcmEF1V/uxuaoxco3zFLGVDkzuqZ9DeSFf91g==","z4sJFr74GvB5MLK5pe7yU3buGVhijIi0K1yHayf4Muumqsi3mew68M8yBIVib+QCmnmVbh+SqUixsdMtzYcz/w==","wGcvTxSivf2hVwYn4+L5diM6JlbgcdFelNSGPq29YqU/ckFfluUCPh2W+A5BOMVnPpJ5HPoVO2pMWwlL6s+QKw==","Zagi3rqFONZrW2bUri+U045W1H7Hun8N4g+13NlfiULJD8d0jjM7prLFM91SfocLZznggLD4OSQHdYmJ0j5ppQ==","WP7fAdmSGTMxRPPJJMY2mnyMsb/vDPQXgXGwaZ+qdAFP2HBs/igHUik3YYzptdNAkx/YWljzHm73OIaHOQ63sA==","dQj6z3vB5Fzjl2OIue0ifGdA1ujQ+GKviKGNDWEL/vg0d6YiAHPG4ipEQAhvaZY7phRRPKYd5aTlgom6l4hNWQ==","OSYNVGtX26BfSYXM5qw2PvsJfhiywDVJrjSXp2r3KO3SyBsHSopnE7BDTfuUP0QsZC8iLH8+HZVjdvp7LCyCrQ==","CjZ9FDkv+GHFHmoZTFvOLduE9e24XL045ziO92WKbpUl3PC0UqdAPb7jYuF/FOaEHIw71jBCK00HVp2+251UUw==","fllAv1pSMPmWMjwO7hPhm5MmuY/XLWcTBPDv2gbjO46kG2h8d8ge9jtS3YK8nuY0jQKprF+x1tt8swvPNCO+PQ==","Iq8g8ou1Y0a+FoyiF+VWlGRh3hDF+ZE6LS0r9MiydvueUdyR4dkNVgVmE+HeaUrXObgGtPUET3H+Zh1LoTeN8A==","Rv4BOBcD7Ydmhfv7JBKHIpSpC0GpDYwp32540TzdxRtTl76TCTm/uBV01n8IM4zhAXRbbrvnQ+7FjtBd4OO+NQ==","vxgPeq5KuNKHg2AiAGkf+ODwc8cVEH/g/wYu1qIJUWwF7zkTFM70T42dOasew5YF8i3s68XyHwpzViZMr8GuEw==","H/hqfX2d2n5F0xmnCMqJsqEQ/AuKS4t6EG9xpB8h/wC50dDk24xHP2QESwvh8VKjzSJHMtvi+xZugli0rgmqAA==","cBrVvb7NT0ZcvbuprYwQxkztXd19AW7CgcZ7dXBKzU+j7owSvezzB2mHTAZODJSHGEgEtGGd2JxGvya9gS8hTg=="],"tree-depth":16},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"gXBhWirMNCHEMqYv199mpZ+KJAjxMIwzrYTm62jcVT2fPwk55y+Dn4IOJdmd3eZs5GqsxxL5bKSDy8owA+U3bw==","key-lifetime":256},"weight":506298128548891},"position":1,"sig-slot":{"lower-sig-weight":506298128548891,"signature":{"falcon-signature":"ugDq0+LyuJhiL6RX/VAy3PMij1xlCXiSFiUiMI3UUjrM89Usoj5y0gWCKY5OMSpMX9c73rUeZMm012UZ4zVepcvqc8vY3v2ZicKwXfPJcQW/c/JPugDwSMtZsdcYyZXZl2ph6iItqcgyzH4LBbn656rqe6CTQqIInE+tODiY3vx+7FFRlftMhBHoq/ecvGASPm7zZvzoERrjCNWe3LLHz/t4JfANAszMuqiyWaUmtOwT4JHLT0J3RqX6kaczVLXqFr2b9q0ZETnYo9iWFE1JbGOd28HhOkjTeKwxMwJQubI15yoKVM8LHcfm8fBYcI/iCBTqhPmxjPJHVsS6I9y3m5R5juniGRIWgjBesl1uaazb7TEll7xV3SYg6kC/myi1bWrW0LZwB69n0PdXeDoZvJ2gHDx+ATwh53pYolAlae3ugbyyFxjSJJ2qMGf/BoopJ/rHgbETLz8f7+aPwSJlv4GFiaPQayySq8jURn5ZzYYK9tWlnB9XxkifJzKsXF6HWbXGFphMJS1IhBZH3WHnGyVc6sBMVglt6yOR1t1B0FBINni3TVxKUz+ukM8MSR87Td7fCu46vL0rms5JuVAopEp1JHRUbENff5vRpdN6bR/HGzxQXn0HVEMSCBNJM/Bb0PSHGsNsVPQ5Zp452NxMAV+EWW2I3cqtxlZVw9KfwENzJ7m6p2882PzR088A4SbW5Oc1341KlmiC3ta22KvqcXk344cS8TpcpW6orG1hKiqrbulYsTExYitH2laI7jXUM39F23i+8QmCGvi6qD/trpK7bfZca2LmgyfrWeqoowJaLtw/8PkmHL/2+IDqKGcfiuNd9SmfIghB51QG6fH7955yOJrrUU0E9RBTUY9XxOzn/hjmLl7mmnxgfqW2b0eZjpGkypRREDUSSHoF/tlwNXq5zvmyjN7rUTlubb8frJYZ+cYYswSWZXKxdIE+6TL2hxovrT0XPH1reb5aGROJVshxob14/SHjdXSIQ+p9En77aEtfZnY2hEYTnm1zmdD39jGKMd5PWuO7Wm0yxz07Zbr1FhY/umWjiDKuyiTO+g5oZURMzeEHr4cTTPi1HcTi82OqJHLF21bLnmzNh+9opBBfKkJqDluQyyHCuzJIviwIcrGDQatK45xp4gFZ+BSZyRzotD2Lh4OChr23SpUuJG7eD0F8cSRp21W2YcU518aXOgNRiMakaUGyfFxdY2W2pLd2uj6o2OQq+66F6xGUUs/zLNUnlVdbsqbKiKRXLJslPM8/fKPn1nUAvnFSC7wigzIT3cocrQpCCdXk+xLlmJgvRjbMiJ46H2hsojhn8tM/IsXO0NOuCzKJ65684qqQMRPWbxMrSF+EvVndcqDmes10b1Bo2jFu6youg/sARnBaW4S40cqQS0M1ncc7tBIc0k2i6pZyIZa0rG1Tnb3bpQpJvMTA4LpmPjUM06nOJ1PjufxBoXuopwm/8e03kSac0ruS8nNJl73I+jbmGvS2rMnEcJvbE+vCw8oGBsWiJvo8imPo0xOlJ3hvefflXbBjZLET3LbE64wZm4oVfkV0iCrMswrTs1H84rPfTTap4pBDlE/WrZ9WNnGWVmlezdHtNleX/VrLuuZ27ogxzfkXYzdTLf8WxQyjLM2LuxsyzVQ=","merkle-array-index":4146,"proof":{"hash-factory":{"hash-type":1},"path":["8+y3PnDCR6SbUxNU6qpHh1XYGOY1AFwcmhanO6q7+tEhxH8ppPspYWAMppbv0kg4WrSNJSYMWUCV1Bz3qyTiCg==","v9CZoRUpgztEdDaq9V8s91U5pdQv0xn4L8I+lEmotohdbthhVC8eYIkzEJMXCL5NG81HIMUTNZNZF+o/0gJI0Q==","wUMeV2i10EO4r0mCTdCjlAyBdhWbj+Ui4yzWhArEl2Vgz1QHUwAfRl6qcjxDx8G4i9XXj4Swuo88jxkhLZ8BEA==","ilcwNoNWZ3taqkmw9SHFqDHgcXDDyX8FO8Z+OMP6EQW0d4iZHuiRhQzPLoUcXZqMhMt2eVOE2b9OsOp++Ho5rw==","EoC/ROFvbypcpJRSOaLal8AOwUxSWxhfEOF9TUHvFZAj8F0xetdaGgMwbxtzmvT2ffCJxJaSZekVxGZYGsSwhA==","83ZkniCaRs68iQN1IakDLqpPCp5mVXs2J6gaPA7JxyfSVqtXpyld9S7ugmga19z/Gsf7SioiNKEF6Dp3eLLn/A==","sTLfxVq7VdkSHU0/kEBT/o4jaV3haBU6CDV7No2QENfYWkDBoP3J/isWW1AmkbgAFsWNnIulLIxXYvPUZh+XJA==","oDKmwEIMEBvONx1RgffTysW34XfCSxZ51Ipjf2UbNALkENJbglA48XVDxM9yRPKbuJSZ0oA2DsqCryjNiv8kLQ==","guv60VkxK4Vx4XdN074ILICvGmlKjyAwIkChjtxiaT1CC8XMKJvbGKQH85L/4Pjauh/E4F94YwajTzMRFXn4yQ==","eaYV6b3EKlFCS3fk/sI5VRZq8tzkl6TQMMmhT47K56jxM92srzrxp6vQpZNMp7EyqefDkb9beYDNz1/JTwZcYw==","6DrAG0D6/7KcbvuqMNO4q6gU3sngzFqsNdwOunr5wH5WBWf85Ginsl6jJq6w3qFbuNgfjYaopl2DfsdzlYa/2A==","CIG95YVeE71v+ZbqZUtU8kCzoxMpO0hdUjCx68+RRsDcgQzT9N+6JsqS/FOpEZCq4Bq7Kax6OzTnS/VAo7+S0Q==","82FbEhcImxqWu85Qk0tmu5O6RtEWK0LUHOaj/NN/bnEUe2tLCYOSzOfJFa6mZN3ub4bgwYPe0ZlgYoCsG7KxfQ==","bsCQOMJH2BJH9Eqm04ZDLrw/wcBvr66ekYpMKDOQo+McwhROzuOsvmt63kodnSIjHds9OYe1cP3RsDsVCiU+1w==","5nTILTL5d2rVrv5VYBirpRSlWfvhQRMPmoN/j8HL4yZd8cB2AsY1/jstEGypzWZ4WZ4u/2rrGdXgUaJSNbTzqg==","4JQhclO0lgOlfyvUXJPTXPf7KHRr+D//38R4sl6l/ym/menmGZITiTJch468cpUODYTPhC1c6N8dWpPfIys+3w=="],"tree-depth":16},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"7pd3Rl8V7SB28ws0EOilLRM0i8IijsmP2oAHmOFE0RfJ5jVLeJP93qFIqo0cSkXRzCr1px0ajHWaCxD6d5KUrg==","key-lifetime":256},"weight":506298118547901},"position":2,"sig-slot":{"lower-sig-weight":1012596257097782,"signature":{"falcon-signature":"ugDSR8+2n/kVhdJxXEXLOK1MLupvQ0dz5/gw8cxA8dEbpMBCICRpEcPFds8k9bWfFc+2hJNpScfCPI83zuQ1wmaMimubpk2mrxbJ99OtcOwSFfZVDmvFnoh8Et2ky9jaULVjxHlen0BT3ja1hmMQ532r0FX8jRIQa1rXbVFU4SpbqNeqBCpS2T9SSH1WC+9KWlPK+PwnrVIup88SIkTHsDxKuqxcoBCNu5lE8+RZBhGC91czhyW7/WjmRk5GRha2spDMmhiOLNpHCrJC87rQXHJF+0ReifoQISWuUnjeD4w5HRFxBFljBuqFUXjh6+ddP//FWQxRxJLgb5VUBp8ZdLtE4Zz5NdqaZNkDlZHTEYlz3bhglPINhRMDBhdIGYwT19m6iOq1W4XjJaelGfPfNo41uvg0GRTYSIn2rNUmkZ7Fegbm/dE12seghi3Fdic883wSijNNT/OjrQ4xsmygN8RdWx51/YdkWz3uCdT2S268Ig/bsHgMdMSh+fjLUST3IJPXNiKeRLtxRX5ZLkvILPWb2X/Y9+lZ4CKyrOVYj3pgkn2UkgcmLJAo64+jIGVvCohuU3cf7YZy/T3ifs47PW8yePfp0B87TEW04Y9pJtnmuPOuH0+Gf7KtcigzPSzk6zos5rtZjGtvzn7F1kcY2m1nfqOlbWNNta3SC2btAs0pSNcdVNQSNctxOltLI1O8w2YzP15kdRZU8W4sIgKqJjfptaDl2pgXSfGwyV3dTNcg67GCZoRIW+3yixKT/W7u1QyPX2mJDFSLnk2/dh33MC4k0jDuUHBcTSQV8K70v9B8G7Ounc/6Op8yCk8QpcpPnIFGeE1pUMIi5MOOt2cjM9lxr4kiMAbZ/XAVRgrwsRZGd9snXBq8RdPbF3swjiHfeeTGP8SgTpVu329wyqDo/u4/vBgXE37IkpxnEcuALtpDtDvFYqjJPdA+pPpfFKrsM6xDc0maa5jVYRC8KxFjBwel3tZk21Cu2qOYJ7UuP7Ga3I7Iz3SGDZV2v/0YxW89ioHdNFAb/GqAbXyr7W+20dImsUx6w17enzq8Bg0uwIwcXaC+2FUNEp6qJ+zvZ0ce7vWpBS/zWPaXVuutiZLwYp3Ef2OZWWuTvj/fzRN0YZaK+VRYSpvFwYFyZVT8lq7wkLxunNNu0sqhbiX7YWn93svKmZxVP312gY0qbsQMrzbVnitMtjkZBaSI8tol4gKNFi9vu/N8W2Y16tz/3bakNnF7ajSfufCzkOvmCcNa1UmxfGY8evTkl6ibZhPvSh51iczrNYvCYBEmZOu+SLW6bsHAhDY0YF5EsgTd49jSWuO4JiG2gZ6tQxLkqVBWWdG/4/cptsUm6M4ydGht2gmMW9fI3HN198V/CqOGwMLZvQYPjTd+3X3SVvanzWI8UR2eZpY1Ol9hWtMEkJ/VI0e5jLqU7CYv94lk4fp61sIkTGlYo2Rd/DC0Kb7txKGxrszxU2TiuqQLiwRjDkNUsBtW1aRmjB71picJktFatzIzDGa6EsKmiCq9oV5jCgWJu96JUizix1yMgYegoq1y5lCYyxYfwvHEEEoLr7Iwz4MUSvKM5KaR6EAzaCwtoyX1jgc02W4Z7YOS9cGIm6kVPU0tZjSLCHvq0D702RJjeKxromg=","merkle-array-index":4143,"proof":{"hash-factory":{"hash-type":1},"path":["gPA7g6zyIMmGv9LCOnq8+n7PNToJJzIIzduvDwAvU/JoOGYHp42grEBQ+t8caqaXhDXywrKONiVm2yVR0PVMbg==","LlrpzXHOWzaur28LGY1l9HBtwmDFtnyNk+9IjbaAjNJ3XTFW709Th7M2KOchBGKIVO6tHvUIpBS9g2EF+0dOIQ==","R2wlEgd/Bwi9dXCZo3OU4v8UttiGgL7zBQqEF07aaNalBJ42XTv2RajiLljwpb32AwTq/Bk412Q//74p5BH+vA==","xdJvHcLZuQuNn/L5QO/GvIoh50ovmNvQvblxwYpY5jDD6/ivoO0/Tx7gGtJbD34qNiNDWM+aKORcId3+PyQ/nA==","bdPjZZUmQz7Nn5bf2nBnbIJlJ9r8/JNgt25jwP1zuOMGeCt9QH9FAt87PN7pu/sJyz3Hf9bN2Ft8po7UDbxiow==","AkdT2TEXmL65tzVaOFDv0i/o1co+hukNRnNDnRFl9/Scvq3suuCREXveoqq4MOLcQIBxRQfVgZmXmbzFH+oc6A==","IluB4l1vIgbECwCOZXPUlVUNW85CeFd97KR//wbSwzAvh0PNR51M2eLPvgFnyz0/65kkJrIFCOdqcRhN9/Tz5w==","6fB9eEI2wJyjcJfJfXcVlMjz36K+k4GJNcP9aAFNI9TFLQ0u9FcIPIGZHLkIEDvgPM65CLNRPz40niWIvB7Paw==","93HYUta9ahYUzCzTKQ8ume8ZP2csN2MnAmhrK0QgP69cOboKVvtagMoNPWtEN6h3zYvh5ff028NWBh7Y0j200Q==","886gdc+KcZSWGbgor8CBdevqD36PStyXYsfCiYs5fuiyQKeeYM3Vm+fcEJqd+Vyr6Inoox2pIG7ABWEi5OSkeA==","Q0lZ74Q6BKcOJrygaQseQzlE9K/Ta57+tcEqGjrkUOCxEAoAyKTcfLsLEz8e/0zQyT2WhgWyXAqirvcTKhRmTQ==","1X/VML5Y7W6WsOTuhILUCnYNEI7P935/9pJ4un/WBv/lGCgnw6xy02jkV13aVKxGG4zv4knkj8vSkoSbKjJ9rg==","B3FsDfI4yjW83YQOAvg8Nb/Z+aTUNUDDXV9M26NjrW1O4zDDcnpBB3K8LbGHXwlAw7I9KYGqyBaW6P0i3EPSbA==","tW8IuoFt5DM5iRhEqlNHfr65/QtB3q5omdcboXwpvQBuEoKQU0VdjHxVX4DsTzn7YDnT5WLdIh2J5iZAw8hqCw==","29uIcBTALKG5030QE/xFIr881yJ5eyFZfqc4vsh9GnB5wbmTCjrp5Je6iJm6tkeXy95Ee022EmDhs257ZB/2hQ==","TDzH2J54JRgOCzHFWpK3V83lmRBDumsaxI1RH1UpFxHjaR4teyMVIJf9SYuBEIacDH1/ME+/AJ4L+ElREuLg2g=="],"tree-depth":16},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"CUEyPrHSn50k7CCnxOtjQS2v4msQ4FlpgSIuPs159FwGaBpjGFjYA3ORLi4As5KOpSXPONF5QWBbaEXNR8U8LQ==","key-lifetime":256},"weight":506298118547901},"position":3,"sig-slot":{"lower-sig-weight":1518894375645683,"signature":{"falcon-signature":"ugAOv9TbxTn32ce7Li5v6KJE3ncvsayF6bAsHJqJb8A5bj8rWwtNmHXbZ9U4WGVe1NdgVLSNym8bZOuXKThQKCj+0I4EtUuGqvwNlOL/hqrlHWtDaBvRA3/yeSjjRt0TxLMev+BjrzbDOTdLfts/BA2G67r4XKNzSN7aahV0Zi77E0iB+zRwCjVQ4Whbg+tQhPg/LVIGlyWwT0bWn8l54E9/u2zXE2aoQtp1lPMjMe3jUfVoIthXi1uE7rGTtz0D7rxDHlWSD1Z7TWmiXO15CXRgsiRpQia0EpLPd3kVeNwkpCVtWq8bacmkgqqllWcntaia/nfp3zYR2eWY6dzg70xNs4O2xWgbloCF+wm0veaokKcXkIF27ItaCLJuN8Wzg1KGXRCYuRuoR6hT7NtOj9Fr7pOoscgb+77F5+wxhaIQdWArPZKgszLMFl8r8ZVt1+kwhhaup9ENljPUFBt08aG2Uq6u8RoWPdyYwOFXxMnRmLr++jMFLuCnjwUTEqLHX/yM82KMK67wlfXmWOYIRhINvg0k9FYgnKpclZiE/axJyZFAKyrTubmPw/wWdeaQxEBguQJ9tZBZd4QdschNIDg/aZN/qXWUiRKnvQq0tLW2km1dsoMT3yibZnX0Nj1corzPWKiW2sI3soHpPwvsHIWhLEFCmSrq7lvr2Sn0PdI69vM++0akjBIVaZBHrd2HE4DOweRovaJvdZHJOjM0OsOCrJn4JlPBx4o4dvoENP+z66J2npmOnJcTpM88hYFlaRscCg6NFRXLLcTLKQ3dAz9Bosj/uAMCS2UV2Ex5mGqz9j8LPmANdFlu8CiqCa8xqzQTHJcROwfx6yU5t4kr2rp72MMNYEucdPXQpbZkqibixotcfWxA8vl1tsNn6eawWH/FwI44P/weuIhZETWAaCgr9fI7iof1FKxjwa50fLX8rV+4QWgfj7NaJTxONfG1VuBfSoOTSVxh0ghqwcbn7RYZF+GESLwRNbogrbCxB3p5InWxZU8IjpwdXE8GsW5ybnptBCcayNRdQ8t/6VDUuZN4lI4FC1DRZRFvq7jXiazndEmclFrxM4lDIvZbmhVL/KaGomlTt8bbO44QiyQL+2+ubtgSLZdIuDabBZ6IWCF4b+V1Mt/utS0f0iP8eZeZ18IqgJhtNYFoxmTzKF7CPkHzKCIWeBR3EMGT9Ul+dW3WEm7+s3un92HUtnV2mQ6AtNKqm8md6eCBcGhbE1imdn8wdIz1U3T9FLEGySEJMwOuPASIn+S6KMJdoJc0XyuuOPQ1k6kKxSnSYzqxukJQ0aEaLhPg67BM/V6LsffjiZzuyIW73KO92aMQOzZiEvxvb1SE1cSjxT4H4QM38KGxn+cmKBv9t0s1KdwTNQs8zCIA20Cd1jy9YdwpbqJirW1hFOYXLWWmFgtHuU7xT1LECcTrG7V9oS+d/eMSw5r3kUQjetp9Tpl8jFv1GRN7ybZGWEGNUfgtSeVm9CzBtkyNvC9fcFNU6vksQ/gPe9UnPFDDDGWo2JvL2R+ekSxnQl+69bQjStSoNQOfoXuR6ttIgZIoRVpNw9G7dRqPTUskaBsdC25aTWWRJyLYo+6I8uezXkxN4StMLTYrsY6fvBlbwRSOjR99wPzBGsQZMIA=","merkle-array-index":4144,"proof":{"hash-factory":{"hash-type":1},"path":["YKnJbxxJvFBn5xrT8okgW76DDy6Z9rgpJCXXTlggrSuWl4tHLJjsmdyCEmFj4VcazJVOafyhl8JyuXMeiB0Kdw==","H1pRfniIQUkWuxgIoP25LAsXt3c68ZqPtQlK4CeHKKFn8TA0qOBoGLGZD9DWMPT/Ut7xYSAVXFo2IDoV8Om96w==","48ndzdLsH64jyjk7TV88wIoMmvjFQwKsV0kJZyAYItnFOiURvdWE2vHr7IaOGJLeqRFiycwll+neppF9T3vYpA==","cNFr0vpCZsZM8LW6FBzb/E/pBWNXeLNNUgPsRiHPNroEKP9wBWBnXWtCCLCNQ2GsQcQg0S0NiF4nN3B3dIT9vQ==","rVrZse2pvC3W1445l5h1W935B76UNW760OjEaeZxArYYnmlExkxr+7nYWbHsdftXYCkIzrwgZl5MX4IkBwxI8g==","2GGUfivENbVhET/y9C9EkPBIyrTo9XssasCiuJiWgcKSsjk1Uxd9WPhpDMzC1QjDekkuBfnLVb6K0ZFaexUrQg==","M0/2CP1YEIcSEJpAmJLl4hLDJaJeACkO2wZznuAbSjgMyiL+kUZmqizUZ/IwpuiXBuS1AIFkIYvpoE6GEA5rqw==","3+54gKjTIwEqTMYffMC1jU2sJdxpZNcat7mJHDPWDq2EjevCmVeAdVtXEXnpbiN34693be7rdCtD24MvD9j0MA==","775J0xPWg0QZXUY+1HBppRY9rfNzR59/uRWszYmTf/wE4RDA38fqQVQPng3WWI4pleOQ00UXUqAKZQe3dmH4Fg==","f8MAIx9ainP5yVpSW8eRF0yDd2rnMSbz4qj+xZppxItWI4uO5mwqWusuAcR1e+SDaRgBU4P6Y5yl58b+EZJcCg==","uDLJQKy8eM91cU4zuk9b0aYJNhhuliUHDyiqaq9dMR3Bo/ZE1kG/uq4WeHTv14jrCX9E46Q3fPUKiZQlO9YNkQ==","GzGw+nFdZzhslJDyJezj0tLVMVGx3V7su208KsUY50sRZzdyaa9cW7090pKRZLAEaB+Q1KXfhbjx7Y7zzA4Vig==","chqnxArkaMhxZcIocs02z5pFNZGkb0J3mqLTROqv+qgvQgplvtXdsJeUjYU4xu3pvub3UV63e+b555KoXuacYw==","IODUohO1IFYRHec7L/l8T28vhUUZzlriCXkDdSYgzrYRzmk+0tyhlj4fXPOL42awAKeFARdFZSEdKSRGjjUWuQ==","LNl+1UI5mrasRHoTolDKvJbfDMSnmKnKVXlqzTajJSaV9BwA7KLSc0dw+SeUg/RWXanNvGm5do3+Xggn7U48iQ==","DPqbRnp99MYzTF19TUDuiP0kOoiUutMwVjSXd3faq/pvv3M6cEt3HKUcYOrb6kmVp+Jwjmwj8JXXXiCkOs44/Q=="],"tree-depth":16},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"DSIbLC6pU6JYMKha7vK1Y3T3sn0pAqZV/2hRFT1DCy3VTYuLXdR0P8SiDwkf1jHnnqj6iWXRpqi8f2IDWOMubg==","key-lifetime":256},"weight":506298118547901},"position":4,"sig-slot":{"lower-sig-weight":2025192494193584,"signature":{"falcon-signature":"ugDPj2B5XZ2HCSJMvi/0g+0+8scObAdivvG6BSCVldozi2CeVdicY6mSxcB0EAJXk+kll6SojLt6njTzAMZZbvXsEzLyyPN6SgZF1tTm8nTpcizruhhzJ55xkocdGFtwkpQWCKC6cm2xVlIKzltRZb4RJNflqzA7Aj8FoFltW9rVONATbtbOtIbSIOVXDYZB1fhJvWQOZ8SqHAfatwY8qvLXgqvM2qgtSoaOI6XXY1G0JBaGPgh67jbCI/Vf9ZzY4z/6JAjOxQRkJB/sncCTk2lFC3+V1ecsfN6sV0aZpjDXb5jMYvHP84D0xpQcIo3LVz+NgczgpKMMc5MWDykLiPV2M0SuOmq3Vgxny35UKHJ3WhhiLXpoDDWmfJXXJSBhSTsczrxQqP4pl/WhUwi9tQ5A1DkFUikNYnMWqreMy0bawurC/nRbilNTsLb1IBxkg+nLcKOwx89xhU/YrmbBkNm6cS6TOuNatGmMDbpkenzaOwykdl85G06UaedymOiM5vcRjC19iI2svb0d2JSRmzV6zmGOItlEsaiYw2z8Ms+PP28bJn2irwY3I8JL/nA1l73zqR2YvP0qQO8oK9SbXgdm7e2Mwx5iFJwg+3qku1pab8lUoZdqrzTxGJOJTm8/PkTKkuni29+1sMwbaaycFx1jyZ1mcIR60cio4Ijz9xcp3odmJl7ljrT0odpTCyXy7TDLE2nCtZgjX/9vNRdgVx/ZjqFGjMOFPkOYN2cgIwbL3YtgycmC6roJe8qc+BqXRZSqHMreUUaHIxDYK6ktYRk2CaRHs31Gcj9pgWVXiJdVz/zF13pcAiVgUBSWELDH6h9OVLYp24KuptVhIvIIijCTlppBBmJpFP0DbW1TzpUAXuBf7kpQI/wcRq1JgDb5Q0PFN03l+5NJe9XNgzgsylTyJ16kL9RyjsEqapkD7rNb7T/2G+KpqbB1wgPVmqeQjwLf0IpQ8++nqhrsOdWaJ4k4nnAIy8yeJwhKQ5CLGFarZmIg0l2yOZBDOMPGkmxjuChVqsuivmSRWoZtfqfW5ZJNF28t4LOStDK/x3ZN9ncKuz6ZFrqjALXM70jWTzED02C2HS3m3y8Zmx2m3QVoG8TGDJ718Gh5KWCJGyq3UWRRYlTONv4UonMa4O15L+Qxv4Qgl7T1ckSeKxpU1+fm2SY6kzZQmP6kibh1JR4q0RrE5UzUQeSOCccmpNs0qWaTqi0SjecNb2ySFyG5mspXpKJvzK+SU3ubFylVw9BvulwDRZyhvgrxAxQWYh0tlsmjGvOx1nW3FP53oiNLYS1dJF2Dx8eMw6JVeFEU2bZHGumssJ1H4JINU0axIRmXRTrE4zMsw6e4OOFije12uId3D8VJ/vENKdrEJBvSivwmeLuKIe3YGTjlejSisLWHaQ00rS6ihlplNimhvZV00y5bZ1Fr1UcX90TgLR1lwZxb8CwSYKVd1NMalPANRbuxG3Pm0vUUije/6Sf2WYbstNoC2mGoVX9MD7zy2mHKBpsRBdttId0bwhntsEPw0Wpxaos/7QPDqYbD7ajBuXLccjJkcavXzwRU63iEQFpoVHtFp4bIrHrdu0LBiOIdzeLjEsKv1ZMkElOPO6PpFp9UOpq4p/2XKqrDTDXQ2nrr","merkle-array-index":4140,"proof":{"hash-factory":{"hash-type":1},"path":["5Jg1ExyErJL+hveBUiA/0vZNX7zb+4W0ynUaO7PxAFlLw2IUCT/li4lrQsZhDdYBiqJprP2fOL7yHqmWw/uySw==","su7PpzXMUI/mievrXrDZxUPti14AT+SAq/QyX25aJ/BYyKZDtJeK71JvvIkffkXg7INIcqqENWpq6XWWusug1w==","xlxaIs5AwuN33/acS+KJl0MjlgQki+knhozaDhT/brncRWlKQwzTqt+ARYYgCrz/EX/UaiTLsbWrOuKzau/zOQ==","EzQVR2SdOoi+9SO4k77bBv+J1gQhJy5mtOYrAcAkJVwJSzoLKglAbweX0W4KbxNHVZBceWTPHM4CitYDfdXMTA==","GPyY3R3aQsdMZP5lqksy3UHMcIBDKRVCfM8O+VyG//Rf2B1jKyFCqKoooem2ENYAzUyAFI71TcpPjqwCzMZf3Q==","fvOVNHtR+11Ds6meutoqe4TtkH/xr+VAW+tSM1w4AI28lZJ6oYLXWpJsqwIk8Nke74FlGxH+o2oxNBr/8pj82A==","iEjrBrlSOOZJoVyj/Jpm6TUVPmASEOIKEX2QKuCEgGnFjDgt4TSqU8llDrQ5QA0/28Df2ZPy6Fa+zSOaLRR33Q==","2o9Y1C8Iw/UVAapoCJAOVBdKZ+/QAtiR+zgyQXA+OtfZQa7eW9X5ilypEMnuW5B0U/XzAAsi3BKoPwwFDcFpkw==","yrLWtqKXq43MqpTp83XF1IG/WSwOqIoGEC31mxQ2mXzx1rWc+acHV0wVn10ibn5Mlnpb4no4E6LSXpP45qTDNA==","UylMpHwUobIrgbQYQyRYiK7ETUGFWq/t/KoHdjqSc0VX/q5uFi1bWUF9KEm7n/4N/+5zvWHcG3wAFqapBA0mZw==","WDxc6EoMYc11veWphwgpL61RzfENSoZ/qs0EZwV4/IRzjWYxzxcis8X60T0LuLVt08FRXaESVaLKkg6jCvIfbQ==","IhcMM5Z3zEs8HRvlIHzccfZp8aTs/hj/Ts8az4KS4bPkIvlIbZkQOst7NL8isPdHOoxXkzczbNLFbUK1jv9z0A==","60jG6lgePp5mct0Ndai5ywanZTHwYfg8zP1XjqzouSjpRdBvw8IRwiXFMjmMq2cYTLOjoo1NfGCmJdQ47Ld78g==","4inAl3qCGXugLAgXIb9OfzsCBaGo74pKsA7s09p/bBJjs510dmOtO4NSQPPWFuYfoSo6wdgmkl4T4mT719/pow==","IR4PKvZrkgwGCGbv1hbVV2sGzCi9YTe6LJ0a2ntbb6qXu/o20Xxp0NPPIY32EpcmsOZnr/5ZLfzyXtCS6DwvJQ==","80OhrjpXqku16OTD4gmI0ZX1JvXPjvnrnNNvaHsI1byzRhjjxDH/ePHjSJ2BNj5bPoLTxnd+QG0SrjiVXZoRyA=="],"tree-depth":16},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"QH+bJ0jp/LeqoGNUtLTsz+rqQDP1R9S/wQQXu3B/FxqS/utcGRQnFA6z1ZUhhIdiWUpvEryamTwwUUcP6hjhJg==","key-lifetime":256},"weight":506298118547901},"position":5,"sig-slot":{"lower-sig-weight":2531490612741485,"signature":{"falcon-signature":"ugAIYuyO24Pk8jJpUriLyBY+KYoJDSbERjhEu2j2yOxR+s/K3w64z585xzSbon3pnL28TfSJln4YqeQQr9vW/MnleBuewjzEL8uPgcEjmJhJQFfSlA7XrIPFTQJCUj6PcI5ptZJslI0GLHEIhKyyuvbIURVUyg6ShsuO/847yebjjFainwtB7b0r0RRT0KhS2mVYXjsy4/Qwj2i7OjEehKDNykrlleGGmPy2igzTa3swBCZZsCmWP2kAVZGPLlKvK5Ve02Ysm8R1TcTfuVDpZG7emwMJtMJnsgcz0byqsdrH4dpztGVOWseNqVnWWmZp+hHAjOsaW6M3r9+ZlAr7VcSXskibpExLhkFkqSm5ro7jw1ixlLQl63hWpTn/6XkJQmVC6i3bPTcFCDwH7ZRhMX8LznSlTBkhdmAIPVelBHTXqjZlGrMNaRqGGZ4UH9MKg0JUMjtHrBiLK3POg5oZ1tE96/1jDHTfbbH77/F7zTjPnpijmXyLoNXvDt39TmEcoyJwcYRDS8KrJUxJBI3j1/m+aRF8PLB5dyOEvTrfagxHr1/m50yArPkgJpiiaSId7I55wGtPmU6Qv3kubJI71JFyM0PWWHLJRXmsZdHJ8fjupT1ICx/18K9yQy7I+GD3zHEIrCqT4lNZqRKonrHMl9XNTnumceNylwv5jHvQKytTN5zZ+/DKkM8PrRcO0mlR5NoohiXosbbDzAoCySYwKyKblMC2MzzPm72TyhV3idTj05iIk7zV6DJbZQaXES+MHbP46EJoPidSvs7nTiMm+UXl/Ak9To0IVOLWbH7TWa9DcAopvMJX53Ri3z6QV+3uPJNkz86VY9dYSlsSlY3AiDrv7ENTagIWNHB3EnLMlrZ4sSXPMwbla3zzoiZ3EE16ITRoI3F3RxMeO/iNIIUsmXOM54XTMsjheffuOf73cxgbU06MscyawaiK8dWFVlPELRGng12am644x4OhljdvjJXHjjHpFSEsgZgzLK23XCb6yV1to8bNxtRQuVluK5ui7fO888NBinIpbQ4NXdj41x25rGIwq2xnZeDX5P7pEyykT529bM3F5s1hTG4Vt8nQjpL3toeViYN1z7R8Vn9GRco3iN6ItM2RhvaSqeld9mZzJzOUTIap6MNpenCN/ostoUxgceZl4kB3djnSbdbiQRF4EmZ1FZaZ7bWgO5lxjejn3O+LqTezoEoDWFDRp4/ZNr4ReutRnuFINBSYHDJDFPK+srJlXo5N65LdfCxqVP9W8LP4XOljEc4k0NTXBM/Du3TTOdX9r3oY3P9DnUm57B/aAQd+2DRWb0CXMw5ivmk/T8ySbukkMAn2ghM/yvkR4hC8ZZ1anCQx7D2SBY6tyRdWyTj1vJ79urnvtnxmTWqUl3PbnkI+z8AgApPt+LNrm62n88xSxoTsJyquibHEGixqMucum2L73kyaDXOYWBY0TgOY9ZL2Ob6ycpa7eQV5YCxmHf4iQzakxfvfa2R6SWhBWx4aKSpC5kcVQz7U5HGXW3R+pAcwUmf16Dpo8XY2OwwdM/Hq88gzC4X/ra8yV0m2DbVAI4mdjwpOvdwc2UUKj3KKirv3eD6ZtEF2v5waQvaUNpBF6FCJBgniMVfVUXTgWWqEZblqWlTp0LDpCA==","merkle-array-index":4141,"proof":{"hash-factory":{"hash-type":1},"path":["GH/IaRjeT/Tx51RKTINJQU2Nmxu/2Wv2ne2CdoADrz2+U4P6mKcL1jqaMWthopshUHS4P7BWsYGvISlMg9gCtA==","UkejL7aZd90xJRFsvjWkrfo3vbN3ekXrMqo7n4qHzUQcXurYD1a1VYw9ur7UtSjjk48sKt1zgELQqf7j2ZZjNw==","ELVN9RqbVw5KzTt34hXvMSJ1VnJOo7KsMJamtioZzercWwF3JuDF7tzyF99ForshIaf9QDsBaZDRtGi8i/7Qew==","RfLyYcQI1av/8qvok3R3RUeBckfxiLBgTpJqfJrAfx4H3dFNbAbOqo+4lHpVvxSWG8x4Nr7uEp6EqUBZeeL71Q==","an7LMERQlp5Jd/uQoxjrKOyKBxUuX5TTaiPSzAkvOCJ+VWPbOsQrq/UiXLRYdZKe0ifKJFcOF5I8WxTuKqBeFg==","S2Ft4+8hfimMvg+1HZw6fsRR1nagaOBv88fENbbt0fFHiZrZbB5WZV/doQUV4LY1AGYTXlwTBTK7nkRoZqfPzA==","LZ9swUCEZXpz2WsobNaXmzbqdNq8qUujbmHC2RW7yd7QCzZf0ZYfafo6diDdnsYMkaExwSwlwD1GKGtOIdcHnQ==","Q+P9QUl53NV79C4bHidZQSmVR+bg2sEhJDQ9GgrWdkh3ps49TzaxYennkI8czTAfzxeRvAJ9q8BMzUjvO1GLqA==","nQqqNgl8dbUMHo4Gny/ONd+TeBjzdba/6oUbl+0LbQ2dcWNW3riXDBcqOpjqSorDK17Bgik+mW45eE5hGzoSEg==","WSDr7G9lIM00yohI7LM7+seo2tps+2t23VN7sDQDrCFNWJ0F8TBSpuoA8B4R+3Y2IB0wBvq5SQ9NaT+DWMkxkg==","pOKciTr13FAIqiq0AXlo7M+pkmuwsHnDZAKYl6sy7Q9oYbZ10zfEMPEGl50fyPRqq7I46vENe1pv4bUOU6fH2Q==","5ds4xdiPg/ZNgHZYyh/Yi6ak9pKdEZhkunEHepSaLEgT1yOa3agK2K8TpGJkaEJ9HTLwS5kMy/a9BorgNJdn1Q==","zUHGYjWSldifjLt5LBy2R7FTBm+ABDUirI07SViSQLRL69JlSK5FSO1VkuXP1Fg91loQcSVXO7/Wdx0O86eLPw==","pr6FgOQ/mEFJTIqkNNn41yBihSiQlZD7T6K/2OGXD/5sUxkRBN9bXEK6Vc1OhaVSEe2Mn2n8Y8BvAeJfp9aMNA==","XrV97m5jDyyDAdT0fLPgO38lmdfvesYcnJ4W9vLsCwfqgUao5qmZ8w8WgdSjxuTGTPpOQEI/gJmipkgCN+T5mw==","U/4vtS6Ilem6jZTx0g+UK6aEdO6Sa8jufjzDTN6De+kNoDIHI2Hr65uJFkEJj3iOJI/r7FMKsv6Om/eV1WH28Q=="],"tree-depth":16},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"i6+wAFZOSM6VWRS35WpEfv4PqHhbGGxI9uhTKqfbhQwoFnnrk42D4Z6Wa9eN98zm0MgKWbikM61GyBsfwXwTtg==","key-lifetime":256},"weight":506298118547901},"position":6,"sig-slot":{"lower-sig-weight":3037788731289386,"signature":{"falcon-signature":"ugDZXB5mpOEpXKMSZRUeLk6c8GnYPb0yToRC36irOtzr77ZSJQNMzRngxmUYlcvhVJZNdUTTq6YlrRuVhDF+9p2HIOo002no9yiSbucJOz0WSYohyTovD3KfuD907Yc25vAmTI/2TuLi4dKucQ5fJRikCSuniCV/ZUqNrKaXTuC6kyv6vMqhhU5VGHQ8n99KR+5QM9mbFh3F042eg0LA4yFMa19lYvXTdT6nfYLPZs2KdQfNq63jDIHFJHgj2ysr34liTztPZRrNfY1FGUOVNqbx/mUuvONlEyJxt9EEwRmLeYlalQCd19DXg+u1SbW1aR5XywOYrcjaqNpRx4sLUkJ3bbNjp0ZSCWGS4Uj/3ZHbQnJIKg1l2efTgwLkt5kUR4k99mc6KhGHU3PTOKTfikZU95Pr05JYaPMWBRZAc5/5nRCWoC4HHqShxVlaCma2ciax8nTZ66cXghtOtBE4vRKFM8X2Z6ax6rswvCsJM7yhjBGMG4RijyaBv7h/qgzsUZUUiljIU+PHj8nal8comCbnD877Cg3c4UIrG40D5wGSkuaY37UMQkFuob3pa8vu3Cia63bfYSHDpNd++Uw5qLZZmUbkH+TWM7l7Ubay6qNMsdJs2MAmKoUeb0GrpKn47+sp7EJ4qphsCyYtuyvJKIm5jr4etZt57itN2nZc3MaebnsjawWJkNgsEPtKm4FHDnmx02wiGuS6r3Tc9SIlmTuSsNnm6m5aiSz+UaeedbDEFM7XcgwgneDbk9MZjZb2Uymwp0eQzFbiYLLto40iBu+YJV3R68/ZmPNunCSq97o++rQu6iaZot11Jh/QhaZZ5r5JksD8f4lnVx9x7uzSGxQdoIakKuIohyRomr6HcCpF0bseTbRXJGlQclpXZBNP/5TlUNQoEjzOGdkmjkCRZS5Uf81BfanEb8OeIG6sHuDjJ7Q2e2RSarNpjWH7T5croslgQplUa1XbVMrE0qJIuhHY4t8NtXdnKYP7VOfTtVEzCJEi+63U9W162XWZMUke/F6xLozh6ultaYNZ27/symHXNet8cQ5s0vn6qvRty4WnjpCbiXpV2afimKaxHaobyIb/2IeoLILVI4/ZcVKJZt87mSwQSp+TDv4tl/nGgndh2TXUupNOVYR+i4RkzTeRyOA29Ipucje8k0HRe5vdhWDqtKoHps5FDi5Dr40WsrmLgiOfh5YSe7JzppPO6FrlsfHtnQmppuuguxicFQB0JKzES2CWs0fhylBc2mep7mCqOZvDEVLppdi+nNs6qv18vp+myJ9UPNsXXWXBNSiVUjcxbsxH50xDl26MLzShVtHEJ0anlFJVKINtOXmQ9keyHhlxvvwgcTsSWa/OcuKG5Mvq8vqlOk3fP1COV7rAlRlPnQIytX59NgRFHWEOTg2G/7p0Yp+Pvyp2J7dDy/NZYEOhbn3TahKxIFl1kifc7i32SkP7/KVfNrAO378QluP1HbfE+Wfave6FrZHOkywmHUWhaRT9OybgymtangUTYJUVWjdlpnEznZ9Jx+ERRyfllSVS9mlCj6kExOzmWDqlzP8la/9zYi5Io3RiK93+qgpPubLLf82fzgkrpnARNnDefqR3DBmqrKVs+9yYZMUtDdMqa1o25LFJKQdyMm8E","merkle-array-index":4137,"proof":{"hash-factory":{"hash-type":1},"path":["+b683r2MzIXPdIA+HEHz8Bf320l48v8RPorJbS94maS6c600/MZmv2ZUPoMr2Qg++aCDDIF1g26Xhwa6/IELzA==","Wf1p6uHXu21JICFDWNvY1oHBDyMIGqxavlWriTZKKLAmZ98MQONVbcFrSIrTIpjVC1/Qe6h6nTkJ2/gzUhZVSA==","C/ypysUO1dR4HwfNT2EWzenETeYJ29DvWbhgXI6qsONlvQpGvhx1vzYACp0ntAWJRXb8LeVDlnW0yh7tX8fGRw==","I3JblcSKEzkyyWY8S6kFnMR1kpMdgAsK647tjN79dpfbULZ0os8SQgvaKSRPtvWWXCJPs0d2NwRUUW63HL/bSw==","pZ8+UMOoxXXkvC3Va1ahhpGFmlmrhoA70kSlbUqHrYmCjzcJ8Im/v+BLWM4mJRYLaqotAklR8qYawin99lr86A==","O3DgFKJXQkZJYSIR9IDB3cwkNRaloFLJ22Nf1KEXzrhCoW4/lLnut3+AKTveLk01DDOFyp+kpU3ecHF8WUDiIw==","VuPaK1h/4DfcO1F5l4dr6Lh4o1TzJZoutsmcZWBXYYmGGDtlYulomdQZFSwnObwepVrUGfJu884ZILTfecSItQ==","qfTAMOD06cH0uC/HQhANagObkeiErTRWomwK/TL6It3ch6CWGnD/m/EDarRIyLrYkty03basIm3XUuBkZO0q8Q==","vqZhyLHgwP3F9ZtENQWkBjn+2gvEaKb2L9qxuj/cGHrQ6jcue/yXjP966oDkViTKObHTscinWD77Xk/qbnidZQ==","gihfJccZshNmpb9cbiUMbzxrJx6AimH7gyEWd7cxeDc6NMaqK1k+n2dutdHtbHDG6c3WvUzh8HRmQSaRZet0Vw==","l0U/wgBQvO/oCHdXzFokZqUOOpmi6QQf9F5L6Mrs8ddIaUzbmn3FakW0Cl4zcgXWinn9cNqxmItAkx8hwMTHfw==","A8uiXQKqmrTUc2piwh4YLhAZOkS16cV9Z3XdrctP4sBrKb0YviAxmA5HKWEp6+aJ6qPMWJl4RpZeEC+CMSCCGQ==","VEZ19JVZvhmZFx9Kt4TqXJK6lVmy1BzVKinoBvlIc6ryujN7u577gqmzEFC4mkS6jiVQa8j3yVZlk7x3BZJTyA==","aL8qRRadySDYmIY7BFFQjcuQTthJAA3KIF+xAGzd5nqF9yuWdyKXeiU/U1OJVzS8o54oRyMeUEiQAJAvYsSvNg==","cLrdrPEDZzjYJSxAcNsUhg7y+fiuILPGmsDVc6KsLcYnH5+azH/6m5o0zOyibjOEepFNmsUCjpSzEhEyIuroCw==","wAP2QaORa28iJP3xffwcziG2khEGj25tQKXMsu6J10xkOqKeQF92UwBCAlxMTrTeMqiYzRkpz5TRNpFH/pl/rg=="],"tree-depth":16},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"XjTuRMN15i+mm6nmV5Z8GMAuDiRWunI6cDMJvFxFjF09FztbHrex/bYwx66LKINz4Va4YV1o36xma6M1opOx9A==","key-lifetime":256},"weight":506298118547901},"position":7,"sig-slot":{"lower-sig-weight":3544086849837287,"signature":{"falcon-signature":"ugCGmnIFCTSEN8w0p/cPQ2QzyCNYbSWpfa8Vk7QchOKXvjE1+pRFC7jAJsd6Ao6rsheeMciCsMK5JPy0E2LktuCVrXJFox8lW/iltOwdFjlUoTuvgkNYa3TkUr8Ujp22B0NxQ2LlX2GgWDi+2zE8FqmcWRGimX4ZT+WcilK0vzu5Wla3z8KmURZWryop0RpCNq7KzFqYmdo0+2clY87hpYZBCmojaDHO39P3ZYMExlEa89fL0/HY80k83V1pNGZKE9hTPmyLV8bjrNYKkpic6R7OUoSNua8lG+tUwOBX0pU1T5zcnO3NvDi/yPKNaJxu3y4mjLPw0qa5P1RKxlH356Tezvk/hTixuSwNtDYNXPnCTBcMXDxKMz6cC/6AexttIRRgiRDUoe1sc12cbz0cVF0RRE960os90wjH6/vPkm9/H1t24sjMkvNO1dANwsmH52Ca2WsjBEW/CZw1BVLmtLamQYxQbUTFB//rG9tbb3rcFe7zfkn3EKeyH3dI01jFNYpiMJcYeXSCHSNkuCYPPw5+jWsIeSwrW+k/IdKH+yMwskCYMfe9EqLyW+K5QjiC7O+sbEu+1p8IE1Kx+hBSZZg3bFa67q2zmbQTaRFnrd1OY6bGdCATFDeeWVybZODcI2Rp6+XUoT95HimvE12qJLa8/h6mjVtSFjaVOZVRIhnxvICKN2Efo5rEijNI6BqLPKVXYjYH5zNo3OtI7hkyRhhXS/Z2vDa019ie0ghvV1Xy0J3qM6LsbusXmTrKVGeyxs0oeSp4rbtbDoC1RekX9OxkmJZ223fX5njMym3Xk3Vqqsvo1zUL8ZRAnMp2xRGG+CjUDRWhOXvYPOYOAEf8DFGmZv8LXUWz47SrVapvQqnVkjYB0pPSE+4EBlL4455d3mYie1q+7mWZ7/xObaiel/Xp+oWguelj4eBYUcTlO08umO6UP0xNEzOV9IhVsz8tUfKpXzIUufs70nmXF2mb/Qrsh0Xbk28syX+qdRNrjM26Z4nm8nds4tsc8c667EmfIAY//4RnmpWU8GPy7PNDQoJHlS11BQWs3fW7K0qFgs3LRuZO2ptd4+fdaPlmYTr1T5CiAtt3Y8NBIjhXCmx65bIgMl96muc1uDO/UCdqCV3zFZMg9fqWeGjYbO/fJDC8MOv7gcd1oaZUp2Os9dvTH2xzHKcwhBUmX6rF82q+FsEXnlFOA8f3hZ46i4SIr6h3eSKwpCb5cowx0qXRmYBL9QSkfKk/CU3NnlLWJIGWMEUtuHG4SFlIhL1m/SnNqub7joubbjwCPVH1wBjEXKEkTVQqV3LF+iwcVAHqUXYwmFIOVSawdEqQu8ueGnt7oMg4kWi6+Vpn7Z5kSbFOu/fnwVAqxlnnuetMK0ECMledZAfVrRwzDwxLXqmtW7Bvkq3qQRbAL/50m4+Ha3WKpTbzAYeaX/zN9H76VJt8kQoiacRAOAoJLbrCNq487XXYpJ9FrwPdy/X4FXzbsXY/GtSSlp8V7YE3o/D+WRRXhSarEDo0KqfdjPIrWHNWoJD1neSMtmbLLJbhtbXkNc2NSyUzDJPOiSWUF3Ndj0Tg6MW3QTRHiodF1KJm07mkm5hq5x3cOStK5A6OWTCTWPxF9VN0pQgjgZjO4+jT48KOooQBskSQ","merkle-array-index":4144,"proof":{"hash-factory":{"hash-type":1},"path":["Lr3keTnHvMxjd6KfCPf4OBP/c8kgmoWgVeZudn3wDewHdal1HoiJuEDztj9xxIi7YGg0NUYcbp45SlrMPa2rLw==","yD5WGwnaoSpbExs4P9+wHks2kyElm8lU3bHagq4E/ouyTw8+sP5yfqURqymH+UnNmIlKaUBDylQ9ryRBPKfsYA==","KdGXs6Dk0JTneMUYZeMbV+/hTmdcfvdv6SBOo5JK0LZYe8RsPhaR1RmtfIMbyj6lYtK6bHGa+UUo4xhXd/X9rQ==","Ptcq7ZUCQIwqmqX3sXH1coId7Qf8CyCd5wMKlWzcQgtEAAvnv34xLLg9+zPFmnxX0VSzYsOTz8yH1EjgYxaBgg==","gOYVRaUThRLpJL9kUNC30MyDiJUlhyxS2pB45/iXUE/z7n0CwgNw0H97G0+Me4leoAZz4G9dSJvwuY8YTrnkxQ==","imYpOwauEMnbmQkAJycx98vm4pRMG/DzIq/YWt8JD9sgOUy1lmAj0eB+XO6BJhIGPA/XrFRPg3C80M5+BSyrgw==","gvZly+BAmEcHTbYjB+Fp3rBdMR19+C25q34p6AQ2b5dJlWwMIY/6mwtmyE7G1ZYMEtEJW3ldJxKSed3WvStekg==","Yglh8JFdwiXUx5IWkGNKOz8UbJczLUYv4RMCc2aBt4AX7CCRhDyQU9l778PaUSw9iQ4GG88dVJYz1WQEUrsvzg==","HCNvzyhVKzgZ9hFNjkTFyoB3BtymTt4Ps82/2nsPwkE7Aj4f+uFskzAZQA8gxJmWczMPb/l2kwiklJX+5QcfQA==","gw4fHRLVuVjWjf1O5tPCEbEbv28vBrunsxrLtFj9h/0K53xg1hMegHnYvAKE9sr9zSXpDYUmdXc6EjrB3n1s5w==","5v1ZhP6oY17uG6TtMMUzAVy6hQFWUdvQZRnoyxJMvB6emUomY7uCFnBCIC3GhtHNGuA3EyPvktaMwm4ZJt85Kg==","Ymo4ndooovC+J2ZAHXghA2UlEK+ahHoY2zczywd+GmvjWEXEVS78Aq8ja+lBVyOUAlDZHl9OIAIMJQlBejZx2g==","gOOUvt/CcYB0dQIAKI8DpgwVgmNIsPvSTb0Rv7tJB341WwKOFZniN1n/5K+/Ehs5A0c2tbv1HgIj+70GMyBxSg==","FFLAcqwMKYeMJLiFGbeeItnMNhb8sP6+jNEd5/IryCKqRaaI2ggaBmxPI+WsOE09twIELBaPFaReCijWdT1msg==","BYPldorjCfTbI5abdED7Mqn4IE/6Q/49T1uowKtBxJHzxh+yDETp+Y2AvSPX4AigI2nQJkbEw3qF0baR24QeHw==","IKq6DdCtFZngU4i8Er3pPM8D5XbqvQAXs3kKqxfbLRyhsVqtNu+LOscLYfhyb++aS0Txk/SnDRO8kHT0nL4JQg=="],"tree-depth":16},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"coEjxiB164o9Gpqem1AaLtf+iP65Y07GflBqdN5njG8bfHhnyYeEe8TL0XSQVnk5nCt/rXZtJR6HecZHQM8P4g==","key-lifetime":256},"weight":506298118547901},"position":8,"sig-slot":{"lower-sig-weight":4050384968385188,"signature":{"falcon-signature":"ugDKuCb+pJV5neeYZKKEjV+uKVMRYGQ2MJX6KMdMr5Q4FiV/l6Q9d43FpeulEV+dohCcyBtaJ2+5yEgSDVThP/mSdVlmZVf3pQi7p3gE2byE/m3PLmTyQo7dGOHqJG2autoIulC25TWP9tmZOaIbVnPZAmCzM/5dQtkZgqBJuT/XZTU5TGoElen9DXPJQ8ESZ2WUkE2kknltnJ9jfAwiOuk3kFQqU29RHeJmk7CpQ93OveWPg4LMJ0604SmOuhBplf4w6cnUCG53SdGCk6Gjilz+pWrlO3HSqy4Ihy9bGXjqwjfRNGhDNnjOsl1dQdxS8QGwNyokAWeQ92j+F/e1AqF8DlMfUuMiteSHzmyVXDIq+63Fm6+TOTRUimfe0tkn8QP/yk+6LJTo1DZOAsEZYkivph2gofLPWmr7afQZHemV8HA3dxIr3J00v493+0Hf/8Gol9aPDtpuXq2q1w7ZQRhV5PchhA5OjXdw0LfTUkPifE6tEN5LGj1iN4NUt6cqAW+L5yG3RrqHOvNhUID4aT94mnQNc9vBvKirBZmtQKCom0L/lfrPPceKs5ohXzBHS9LgNreMIkLevGtqbHn2t+t6pQaiwiuKEyKI5DcadIupGbLndLh7Esc+wjSkoasweZI0irjP/07O7bvQN284lmUbOCinenfMSyjxLPNO/EcDSjPZjGG0edm8CQe78ONm2F3QJK6OwLMsVknTWzTRXYJnpfF5rAlVkY01zE5NiPAi41yGw7BMXKm140KOkldTokL+Dj0ue2Sba1mTmNajyWGPEOyyOJW6eZiEfMZ6sMvfyTElm4rZhOkt3jZ3te+CuhBMsuuyWvXuFxYPNIMLiuf+0IiNfuSEaK41DX0PzFK4RT0NhqErqjT0XrgwkgDdRmSWhYEZPRlYBPz0TvCNl2U6mvItDQnFQ7H4iiOAprDxtIHK5LB5dGi3VpKOq6XfaF/7VqactDUWhNIUsaIu/SG3gx4iNbeKJBJEyZffuIbkuO40KhiFIQQ5BIqICwjE6rgwllEOI8Y5HcoY3aRyVEc9/E2PEwiOp0dyOzrTZFKnvyGKNK7uEZpxniha6Nkx6L+JzZvMZEwXuVJ3CsF0rtGTbfsV85FampZ9PkvF9GEfjP0Rptul9cOEXmGZ8IltJXnOmonmlyHPAz0eNGeJKkMMxrHCYe8+sgE4la0b9Ya3FdJHty4exUiTnGwB0L3maVMexJ0icFIXXjORSx1HhgLQXDsK90VMuyevTQu/ZezEbCjBJWYMl1fng2ZZ2a4AiyzaCXM5+oXaxyVRIh6jtLoneNkxNn+o2Spk38CiaiUIhHbsZqMemc25+5HGW2qLZr74jiVGCNL93dydYTpUVNSuW+Kc1Nil5o2wMf2WFkrqLEq09kT2lilvMu2J0XklCG5lEohkG2NyhmsTZdVBZYVA7jb1dpNNDktLgmxDcZanIzMBYMbIn7DcRPN+eJ39A/XNMa0msozCPxrhGc42T/Pl45P1ETNcq7LwJgi9lpZf83mFsfqf1vW6xMI6CrPlCCQX4R/pz7SuhODoID83jTPESIiXRnptJAUWB9eZufM/xOrTbjqCzI/AT7QxCewoT/xTBSXGxO4YvK4K+EIcXtNmsiqT/7ovbsOKPJfttWhl6A==","merkle-array-index":4141,"proof":{"hash-factory":{"hash-type":1},"path":["qCjQX3AnqkXQAWrvfW8j7aA4UpgSj2Yp5PGZDKgjnbWG6QbuUBhr84BHOAj8cmclB3wwwgsLEgZnnZkxlLDxNw==","yUjYHrd88/ZPPMDO/Fb0oT5+EB+sB+cXpreJsm9SZrIbpHtlTQzQXLggmwWntJRvZSRfU34RTrJjwBOsiBMAiQ==","t8GO7PB9TYOx3uXpjGgOdmnpKKJGSiVTowKVZvEqZhaT5ERbRQwFCry5+SfePfKKr5iWp09qkXWj+YGNTbeJAA==","V5Z2bWeG+Xlu0wI05FTfiV/B8dBE7cpYbyEIaa/6pqFFqIoSaAF45+ryIk3e1HE66DH0bc2S8Uxdw+F+ohIvtg==","5OVqC1MKjATr1cH3IweXPOVMO1/uob6jv8jrQqocZJqfekpQgri/ChgjHdcCSGJYBgBsK/d1a+SYH1Hzsu88+A==","OZHKn8//E1eGLYzDAM3fcdWfL5Et+inn2z6tohf6A4YMdTj4moxLcsbgKQPBh2kjsfg/DKtkCbj2obxyVCONOQ==","v2m50fnRo06fpePqTFsnfPj/b6clnK5Bje4IiFxLvUBVrQcb169UFC95MHDt9gHZL/sfkd5UgClH8AxYTC6/dg==","zqshsa8tACMxa5WRWw8B84VLbnnu8rp4rEDTQ2MflO5HJvtDmUp6Bnbw368LU0PjEBseuiR5Xx8MKa5vDe+fTQ==","y+sxfRTlHJvQMn2YkMZWVw6I3r9b6eGBkBMxEnwpMzG2b2uYUc5pBeieKhruNFMjyuOyHc8JPPgjIxITiq7jIA==","xNiPo0rfL+oBwxRSQGbPL/sGnJYvjzEDutRE2aag7F6sHl+FGBYqFYq9xqr1Z+p3lUVPKNj1D88y1BCi/FFfvQ==","XNfd4NEyzRVDsNtkF+33vtRh7es6PQ9sAXmHEcdil22PR4NIzTFzdRZqF2YAto/2IrFKXLjgFAsR/bHsm3Litw==","QxQuppgQS7hmrbcnqx/vtPUGQUZMc7ll8xIHMQ0ubSt29mD+RDWJci9e46WEUga+juhezQm46LXeXgng0SuIfQ==","+j00zdnQUpH8HrQHgH/wJJpUiQ12qKgPntN50TlGEzao4dcDTqirztD/VX6bEr6un5UBJE2D2DFtvqRkgIDBZw==","CtWBNK0RAQnRIQsNbsx9ioqbQmWQ+kCY4FAKgb+gB2wuryfetRJWn2gNWvk+8hnSayFAZs/dgh7zAUQlP2sRwQ==","JJ4qqwSduvFAvvlbxXItVgfZpiQMDKy4v1b7XPoLPZXJVbVa5MVmba3g/n/vRJIoiZf646kV7BKzpraopQi18g==","plukHVw5TvrrxFyE2FIx3XkQgUFJODZFklMuYRfzKpwpX/ZTvOFSN0b63fQ10n+gapHAceYHAOULIXUkAdbzPg=="],"tree-depth":16},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"Hzn+1ZUOxewNLs+xRS/tdgA2r3xCCeKQX8hXiIFqieriJ7+BwXe81mrFNn7JwUTP/HRjI3+Hbf0B4qnq7cz/QQ==","key-lifetime":256},"weight":506298118547901},"position":9,"sig-slot":{"lower-sig-weight":4556683086933089,"signature":{"falcon-signature":"ugCxbxWPkIRaijVpfKaz2Szzq9VgXD+0rMJnklR5V21MR3aXg9KRVn0NatAkBMlKKhQH90cqIu0XRbLpzHdWTU04hhMpXl0PR/HIbRzoRmUTdB9LAFy6qkavI5eOLqfwZ7t7fVxSXdH1xNuK7FWElS8bLd53U4kokS09rGBYP++jjTLZ8xxOiaHRmQZdCUkX/k+5RNnUJYwwnedIQNXXfxnTMe3dI2n8zPuiBm8htDTmPzRR4+jLLOVhGZ0vAnPLhPPhuUGIEFdBLHBzV5z1MRa9SMvfla172pN9AJSqHAz9iy6m3p8nPp+futwxTpvMz6czfGS+cPtLeC/P78iT1FaEGGwbV4mPIzA119x6U1n9HwuVk9lTRtrtjznXerZaBulTo75p0Mjqf9bsHRXzpuqoMAZV46qoE1VKa5dLzLI0gN0ziA3iNxRnmvYkq/HrcP5UZmXIojIZyBe8eXvKZs20jh6ZarniyZgW/LWecwMCukvndtqmOx5KiTRagk7bKCzu2pDJt5BTwt995jvflFJ+1TYHh2eTayANQceIPLEyyK/Kch6jrf7EkR0sRc7mbDJthxn5VqYQh2l+wTEsmYtHd/bKiwOzicJQmZ+7LkRVttma122WXpNtL33m/K7Dptrj9E1rKFTSHezhVmC1j7NizISJKtDpVd++r0Zkd8tsmTXHMtdu8haL7FTPnDlcl7jRLoRcnaRKRUu886yupDXbZ8o3Jj6UJa3H5vuqm4djeqz+PIlifVZ6FMphX99A2arcjmBQiGT1TSUp31DLz3ssOx9GJvL6mSUgmI29ziGwQdvJnOaj/WH9GFppDitqOQbqme4kBiI5x7Lht09Z6T4Vh/PzcIo0Khrv253/tEqpUvUXZCGRePvFLdWf59OIipfDUWRcBnWQznT7zJ4shyLX5MmTPJQRHchlIYvPO8SaS+mPdKBzESg6hrhNGIbfPB6IEZ1ADj8TxxLOoY7ryWvIMTFJ3PzGyaiS+o5aUP6tGHKRVo+QMqujpS1l7JI7lAQZBcZI2mc52P3u//iLTPKlmNr1IqWYxjMNZ5kVjk96WUGQlUVlDY6Cu8HGlR0wqmZ0STMKEfttpldHn0QdNPs3DzFqS5qou3iFdjWN4dx0CQTDAwYRizWObmGex0Ur0XotOrQ+hMKnGUTlEcg172ZaZM1Ntaf2CH21Ay7NmeSGTtHE3HvZN5z1N3qvHnLY4secN4KpMjMwp2ddMtQ0UimLiLOxf4UdK3SE4k5R1glRYZRzN4sxXrTo7hm+i0kcxTaMwzyLaXDxZtqH687AONeqfpMsiqeseYLXWNwp0jXdwZIDKNB0TDExn8LSKenvlBCvQJVokHQQi/Sb/ztnBf6eONBOebEag8WJ0c8qMq+uBUe5553zS+9I8OwStyLCQrpMs1+4TngEhZYzygbQ1bC6ElPyp2+wSl13qtnrELe2GNR8Mpa72wpvBJT34E2bp9ZCZXat7iahx2eqEFQpCIfJsIkTOlH1BjerUJQZ/Xb+n0528151rhyP99Bti02pR88w1lElFCo/W9a/aOs+R4oU1/82MRjyPI9iyM+Hgb2wujFra2M0pyjpfcLfQ2fKRyEBSvI9aYeBIjgUn/4uewo1iTO+hYp7G7aDVPmxBA==","merkle-array-index":4147,"proof":{"hash-factory":{"hash-type":1},"path":["SqJWX+aKVg6RBpWIl1rDsj/VlmpdL9Wh/4sxtSN+97yi+zPvKZSsCmVox4nonwFz/ocIehcCfocYKYEARtAr6A==","SIjnAhlOI6t56iTbUYpZ7itkWXUGnjDWVqPWESAsCB4nT5P/nXFhA6Xa4qznb94odyBBkYR2OBB9wr5wQk87YQ==","UhNBN/mCUrmNYUjuidi6+ujgUkezRlSSzGG+ejbd06AJUfxRNKAqWMhdDAQG0+SdZUw6pn2B2cnXmBzBD277YQ==","UlgbzxTo/P7DO8b8We3xdxrJ7M47VtUv7TQ/ecOxMdMh9AN43V4wcJiykCla17X4MgxVMzEwP+M+2605kLTohQ==","JGkGbsxNUexJj/k00aFQ8oSQkcCtTC4ztlFJgTI2ETyapeJ0UXqhYpXxOi6ZRw9NGArUWxxtoo9GeVQgQ83KWg==","x+PM6rlgGBdxCn2oYbO12ydGJhuTJLEYJNunc1HmzVsMK2GGEfBvls9CFQNGHSDFjOaOv8hL4BUd6TS6omOP/w==","kz6pERmf9Vhog5JCDiKBXvKt4s0/9UKRIdrs6JcI79P8bOMo63PFZnORm462N4enRBYOAT6X7B/Gd/rS75L6gA==","zLROPrjHdhh8gF0UPo9Edt4PkYxZVsZORuVQD0kYrXbfi3Uv5GPyaxRZlzFDqCHr+t1FxQgIyTa5lh2ZIHY77A==","INjbV3Gspdm7HiBBvcJaXDg0eJQpkjrUZ2LXhEsNh+zQdaq2qzBhHpZ/NRjRV5hl8ufFlmHIaF8gDn0Kq3CJ5w==","Fv9mZG66ll7OkKu5TmGOML2Pnolc6mmYN/xsvkO0Gnr4V+CetMNCrqemIB3hNQ+2rTvOCYVv+QQhP04D6RdTpA==","v1eZ0g9S47Y+RImpPjVJfJHU6IhDIuFlzdp+4hVleTvMyLgO6rTWUG8ktO+0ivc1wpKOzyk1/Zn4cAmfVsfY6g==","Y6moI0H7KhYtXgk1baNYOsIetnLw62ilRd7ng/w3kZcARt0Bzq1qn3OUFzrQVOnM8mnVmtPLup/TMBcaBiJ2IQ==","2wS9dmhoJI206LOPBCsObFvi8azrYnK76jyHiKatgF58ylexDDJMb+M+3dXquMndpr8mapekuoOrD7YMo+b3Yw==","smHidc76v6HrLETGrPOCcoD9BboZNze+QrussDa3C8CV/3d76D+l1xSorypi5u6oX9CPg2anKOVpPsgl0bHLQA==","6w4xke2X1EK4HyHrrqa7Gzb9WUJM6KljY2yhMPQFNAVU1QpwrAdc4vm/kSScjE9N+fF9WRnroYGjAYNUasIAuQ==","EtxCFZ/nXSQzQSr4xwJK5gA+aEF7nmvFSz7wulvA1BjOevIY5o5yQrjHmLCRPqTLuKVNWs5FuDpmJoTDkdgUzQ=="],"tree-depth":16},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"uLP0Wh15Oius/ZapZdR4WDmq23cuj23B6CxOtlAIetn0g7wLr4dL/K0uiWLm51V+arIavBSXeEV3UMntEFzacw==","key-lifetime":256},"weight":506298118547901},"position":10,"sig-slot":{"lower-sig-weight":5062981205480990,"signature":{"falcon-signature":"ugAFeGjKYmZwEGaqeMR58g6GfzTMNe6yPH7j6Jead6NnX/p1+Q8tstQGdkHTPn4xxYI1KlY+v5I4rVsyKnp4NuWIkbkoZmhABTpitXJQE+G3cmjYyW5GI5sj0HwCdpy1LKQBQG1OdmnFmHxwmAKzxlijDzsExKCNBCkywPKwUi8R1cEYPQ4I01Y7ekwWGuufhQi/I0r6kEgT07jDk9gaHINhlAVU1eAZ6Glap2QxqHULnyJwCX0tP5Z7cm/rtcuPwh4NKYb+smVOt5z88jWGx3WLsciztwsM/w8fSMtWytP1xbfKVgmGF02U6E+TuGwLKnWMOxopUTlLrjYPXvZwy+/p8p06w1Uyzk2CVn1of86lMkdQXepSWV5qTTqe6x0+9eDLjRonsXZqpv8KMX2EDor9sPROWxv65I0yWFHwsjoPf3GYMI8NP1g+8ac/jsiJR+q44rJJ3l+JZ+BDVFhBL65GsMO9QSX4poUX3zBwFBWwIbv6n9NSTNGWNPtnkFGEQla8GzZcNpXXKoDm8ea5KwosaBEkCNSYj70D7TJqnaUxyBX1ojM4vSf26E+la1CxLnM2ybknhYvhpUgZkePGyR77REPHSX2CIJ7YHnsvYLgarok5VJT6o3aRapA9Uiv1WLn6Fw9pMEe2HcNFryDpkqxuqE+UGg5juCYxqMywx4pQOxKXGMJc+RD1nK9F2ddRu5RyDiQVBmJTun7+ZrTWvwuTB9bushzUvLnns+irtqv20cVzINJi+ckVonbqynESxAoTFEdZxLPGi56KNprwgMAn7pN1P/yo8hZvSKldLDB0Vv6x5AZ1kqpPkb0SuSRHGqwfuTgwZQkYR6r+Pn+WERpdUDnDrrlu+XALwtExSOPqfR1QgCiQZdY4TqDp3iNWaxv/IpCSL3QHwX3dCyzKZxn10Jq7n2KxGohtObCiQtvM2zR6F/zba1++U2EvKf9Z1AqjHXLYEZSYvHXMZmojauEz7K22gI9v4udIdzdaplogzlKQhnUbXeBU1e1vLTr51mc3BSEa6VIhuG9o+3y/mTf78akIt+qqgxza7B8aW/D49MEPaKjO6hSWFQ5f+lVMwtgmMRY+cmq4DImwRC0M3hz1JaoUAq8/xkpfybwErqAv1SK+yLl++jVjrW/gMpySlORCcjEdIzrCaqNHPykVsSPPU1rcS6TwByrTPj5KnMGpwr8Enh9jxNPhmEYVivTpItwU6VxExh/JrohxTpuP14R88EJImCnWS0/5KSguTFt7wo47f2qGcbH1e2rMtQy539GEjQW2fZ5IDO5M2E7wfnVOdJbhmdNa3Eh5FZX9zCXbTrGzUohk8JMz7XOh2fnii11U5LMyhiHlj4p2UctK6NPJpuUFUxt879KdlSdGQhsXos/F4vRoub5YjKUmzdWx+malJCQIZNe5JsF8kexXXZd+USe/Cs3WozEtb+PVAUFxU4Md8slJ/s1bq4MxssTFCcWv/lvErnMYKpjKI4CpJCyqDQRkaZEHizT9e6x2cUGQ5KUrvdzk6qLe7GuQlBx+whsIPBo2Di/FJcncFVRAMoZBnAkaCKJPbfeas4UpIpP59b/QnhMLz09zwCl2D3U6JOXjNFV6REmEr2eU4m9i6ueE2VKDr4xEocZH8bfrEg==","merkle-array-index":4150,"proof":{"hash-factory":{"hash-type":1},"path":["yudCH56Q398CCJ5r0wjK02M8dMEET2IjNnJ8VVDk3OACpGDv79pPAeIf9Fn74NtVnJSnWy/bdACq3DkjrQg/5w==","r/XNgJJhOGU01OJ7QMZ3udwriVZs0gsIQXA6uHxpAwyXg3gCsCeFechOZGujc8ZglzxrpWnPzQ8UbdW3qKSWPw==","L6ByHeDTsdC0j5o+Lb+/miBWsi6XFnjwf2IUgfCUJGWjES6xVqHZYscpt9dXVVp6V7K6JFoY0WaQg4rH+LZH7g==","p2+UhW5jx0DwgIf3PCWrOQG1IYxRteVSoqwWn4BpIT1eAQmx1qHsU04/wrOpMpE1GAfObbu2ij2zDBMex1vajA==","fkcFR52shPfmiAJQdPpcnlLwYvbAtldGaHhst0OdcO+vw0o5ujxMtAd2miCDeRIeCHP3KuxmIuu3cx+ctY7z5g==","lEtyljlqCL1SBEcqGHQoZvuXUX5ScNWwiNNUrN7TJhSJX0cuyWkpHaI0tmndX9VgYwUSnZzHAZ5i7OcRLtfplw==","hEkvySimRMQiEiLvD3q3CwhEmZ+WTafEZUSl0fGZ/pZSVgiIZeXsekFSRiINlnaFSxK2b77n1QUXoAIGcnVg8A==","exuRUZwMDuSyv7XPbKAkkwT60DppXo/BQ13qVl6ui+2zzf7ZTO3POH/MP48oyWok/sAOGaW4Xdz0iXwVWi87yw==","cfTXS/QYuDnv/ZnM48YnZH/b8RwaDhxtenU17jZLX04OqZt3OoSHXJ/wyJMGJeOIMS2/oQnlJyhKtgePGlrsjA==","GvLJTt2r1IKPZK+gaJsGPiQ8Vp/ZiinUGGGGEKpACuGBBt5Uozub3OUmFuR2RhDopq5iumTTRT05GKxdZBK9pA==","cbmMgFTC3PuwLwNI5PHHVvKsMgsWWBqM39/SVFy/hVrr5+QID8aQ7kOirsXhN8arGH4ZiL3lrOyLMJ/JAJNezQ==","E2vZYE6/JoW2kKuLn+xU/yFZiDNLYUe6Ipl7zSgl1Rjb9Nt72nooP1c7DnUc/fq7awKZT+9KACHu4Tycq+XUyQ==","3ZqMC1NbVLLTVWZvY3lEp7eNp6NFbe6EXmURdwoksiamJGgnefjvulp7ZZevuguvHfyVSkemzcoGirj9G7f/sA==","QA7afDWxjzlbPCINFC+F+0SCQcHiFUsriCfRVe0bqQM2S9ZJ9ogTJzc0IUnU7Ks6BK0sXqGn0/aPRZGN/FY/Ig==","2kOtoCeKZzvu/Yq2/bsrGjw+UlYE/62vTbmZUwqgDN0nmij/o2J0k1XTVC4bU4K7fwLOAQQCsnT+RXBxM6X8vw==","r+pHY+ngqfRKNIVRA6yDERkLp6OKzomI8VHGzNWlK0jje9BIXvW9IVTN2jNFnPS2cUU+32s971ViG1WjHIi+dg=="],"tree-depth":16},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"mJAjFahp3+/v+LRynew2CVQyd1KYqM43csK+kPATZg8viMGtfDYs2nef9QF7wltHuQqS9Z933+bgpg8LLgPPtw==","key-lifetime":256},"weight":506298118547901},"position":11,"sig-slot":{"lower-sig-weight":5569279324028891,"signature":{"falcon-signature":"ugDe3h8+16audJMs1PkMxxhs/bpO/0X4GPlCaGVh9H1Y+/g0d+ab+OrjX0hKN83CW6Z4GSZC5bZkIkw/eklM7rN2uHuXHWRKGkzSO6wghaSJLWYbkta1WQSF9rro2d+RFZL4E5lMjED9slr1MMXieKVNoqFZZ+3/NMlr12i9957EWKBmFQRtGki8bxc0d8nKL9mgfGXcpUooj6nKw/P6/cYMR3yiu2Y4g+FayPdUmomjwSFVIeS1mHJnC6vhjzpq3GDQOrA2bYZWqxxfIrbSlab0RdAssM3sjyUA4DRHO7uY9kviUG1PD1uRrhSfwz/Dk7eSLbFF8SeY9KFywirZ85tyjMkQepzVOE0Kb2TDm3w0kE0QXETbMpFRhHUdJk/exnqeU2b9me5O8MRusDvHtQuHJOVqoOEOUbFM7/RdIiUG8DH5EhRRXEy5cGZNslNeeRfblnuKytD3UiQM3e5/qz6PVQt0PBc0pwtjMCjRExuXTGqnBuoEhLo0q1W+CzTkpMNVFNGTSGpThc005V/BqRfoYcFCMUkLwVSKvxiznXNNaKs+4ZpqeRF25G5MQbu5cdQIUfNkWSVsgIzZS3sQur/bZ/8gr5tn3elp2HjHzniopr+5a2aSuv/Fhb1KqTQo+jhMP4y6H+PuMs9rCnYnVSORlkor31XGGX/H5RH2uTNE/1tRPbJ2pTaoX8YWzI576OiRtT1H+ExusiIwy7FlPj7VEBI1QsEd+Wk2xroKRNo42SsayLoOr8NiojpmZEV44CJVZB0Kc30pu3CG7ZTu/DlVMyVH7KlElMyZyhtS0dVU+3OYznMwQEjrKT3W/m1sGdq91u5RPEqPfYuS+VuedC2RhUrxnT7vi1MUvnPFIQQY9np59lZiOvPAW6Wb2TN37eKml6zm5w8lKRPKtO0i6POuSDN2ySUyEQIzh1k4L7/KeifMlKJkHMGPi1cc1e2sC8r7gsy2Jvp3NWSkD3NfFqXS5GgryTpwGYr3PXpk8dTMuVD+c+dUVTN/D8ZLbMTqGypMG7hPWmmHgZ00cyVcS9oug5U/gPEl1N/XQ6sRO6hpmVk7fp5+8dP96maohzcTHIRpCbXOx6FH1WyDajvrv6Hd7mcfGPXKcV+niwTeilQ2KHrRgoTheY//ZZc6PBcptIzyGCUXSrE9lAk2rfUzBa98sCtoXHCTOD/+XsyCMvkmWjSCoE0nWZC5Mf7NHHDxss+mxvGetzUS3U8FOGs1iuKXv4Od8xinvM5aVtYc3ETq7v0pPWUOPCKkWyaw8eNPkoknjE1hTrtktjBqWjzbFWORckIU2ldTEHMLH/k/UFMFJgRqT+PGdaZN5yVAxI1W4SCeqCdXMo9I/FgYz8oAyHrpOGnBSoUy9eUQ2GM78akD9rSnSV2GKH43dnRQ0jOTgt2XSeeDBeLLwCjUpClrbxnmYeyTS11dns4Mn8YWnjkhna3uKspTPyqXagi7prFEgfGtPhDmhq9QOa0iarrvYiQqWYMu9ebQlUDhTIxf3u3881L/ewBvZ3YKBu4DTPkTZ6mlchTZNz2pydduet08nrzG/J0dVn0Sy/PiLXx/2bX7pqmOm6qXzsiukr0Rh6j2LA3KzLeppvuMrvjorKS2MktYc7chv2NgiWEmL3v6TFTz5HUNUg==","merkle-array-index":4146,"proof":{"hash-factory":{"hash-type":1},"path":["++v7WBj+RwQfVPG3GJGup7ev4h7RcbRohz+KXmVZW/sGqh88KXBUScE2xp/1luW4aWQpzEmi95yg/Iaxv0yQKQ==","wDQ2yXdra4dHSxHXnySzlG+AnGbdF2Hf4Zt3NXEu1A/H5T3pX4KvzIguNw7qHfwy60LqG/c8dS3QPma0vPsWug==","frAW1MPv6MoERx1d/X59CWmwtPICXBxKBhHAyYA4UeDH16VmXoHP/mMD0egLGT0MhSHUJCwVQNzaPRmn7gKjmw==","iw7yXjQ3S736g78KTobwt5DLNhUhvWI2p8P2X20lET9a/+dh8LseX0HkcToDijeTV+kMFKVzB75bcq1uGWZOuw==","fc6fzorM+oxr+ZwfQ67vlsy/N4R7TqANKQ8zbkpBwpa/dhKA8XLayqmiGgwCEZQR9zPvOnGwZLKqMPsvfxQVog==","VWrrGQl2O123pNc8RBqA8On6LzSg0KIdZS8N8Kp8UPBAVO0CJcpOyM1YQD7k/TieUPzZtANvjVNawYIY5ZoUtQ==","gObVBehTtrFSZxhGGHz1x2YfuWmweYb6f4u7pr6yuvDTZe6o0u9XSidC/UF/TOo+VmvHP/ZDM4JHdxMyL3dAJw==","so9JSQU9gVvMSDTRSxsRFQpUwteTFDb6Q4nboi8MNQpzwNAhL8/GQTO2UXHig7K1AtS4B9nv0f0HP6DDrsg70Q==","QoXfsiuf+lxANLZuM5Ft9g+bl11Uzy3/DwU19BbWdrlI+4nyBTx+WM+h+p7Z/PGRS/fmfTy63DMi/cxABVGCdw==","UBV2v+edNICK6MloOHLup4lSzJw2N2yQzR1UviBz1bJsySgp1jLs1YE9w/zeZs0V8Klr2YT3n1gRdAF6bg6hhg==","GUQ47XPBii3Q29Sl9w9pKfK8+qrB6WXRXdBHVSnjbFVN6bQKqVwMQBSjuL/+4pZPJ9aPIIzlPgXJ5g33/qelUg==","nAAsPwKVZrxk7vpeMB4U7PI6opvXPj2R3YOPyvTOwzLo4WiomvCDEiFH/3g3nS3H5TDh7zXz+cXtXzNMOu+mfQ==","PAcqu4mEmYCGrQgNzO0LlbiffCOPX/QAR/NHxhWb/4zaPuMjpzPFAuIAIrEaQeus3AMLl4eo1hck8uQktDYliQ==","LhpxY7SeNQVEn1MHWEyLTFEUsE5j34pqQ/OnVeHxFiSjcBAXNn8pVw/9KZxfbrGfCNoe4FlNVxwWLksOvsfDIw==","UrOtI4rpfn03DOA/FHtm4+/HgzDfEwcmR3wOU55ZXVyRAhSIE/AfAve0yIxo39y25FsS6JBewGEWbmi1j9YTWA==","YvzfNxusruMhVlUId1kv9a1feyj0SplZSFNodCmG8lLp1X4yvRFKok2Yh70w0LzmEaBRMi3dRpKE0MAqQ1GaKw=="],"tree-depth":16},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"0lYnrGG1CcPObHxE2VmIn9CDbZB02i4DzVIhyJAT6LpNmiuutXJQbqJDRNFMBa0LBSJLe1rYM7lWqh/W2uU5KA==","key-lifetime":256},"weight":506298118547901},"position":12,"sig-slot":{"lower-sig-weight":6075577442576792,"signature":{"falcon-signature":"ugDv4/oSVgWnPEn/2hWXZnVhmCs/PBm3haN59eui3k6qdg5ka50IXBhVn3yPS+eujL8FTWGcTDsMuzuqfFOYwO3OrUMI+CpJUi+MwV6WmgfCHFS1dh+m5TxQL/J1T+06azqbrvr8yrBZOxqS4kYGy4MrNixKtZJ8VThqH4xdP4Uv0QbQkrN5okGII6s5mzJNttSjtYyVW0LpyfhjJKuhqYTBLcmsTxf7KIypl90jOqv1zAqUy2YdhrFAfSin819x7PDunOh7VvqYbmOGnJyONH+AgpGoXM0y6uPh/+aKcVoyBC6flYHD2CxEtalyMha+dRMOXpzbg2Dydj5I0hvKvKGShVibzvx5YRBolkpJnTeeOs0NhY1JIAZrV4IeBv0Vd5eqi2CGfVT6y/LfoFb9okrQY99HSyDJN+6KzXXuxbd8ZDjEzrkk1mtykVsNTz0HbuucKXbHOOrXJ1JXAa5X0A+OcJbYedJeagzxuLvoh8ZfV+3jVgWOOTzc/rCohpcez8BxqDSypShHa9W14EHfCk0zQOzC+pnxlW+UJB7XH4syIoG5sOuWmEE8gDK0KTIMhErY5jGC5KNZxVyGJTGkFs2ntDPl5d24VuKKLtp5FUi0qsQKQNc/cGRNWOPEkzrmatraofRr36Gd0ZZ1V+ChvZV5UhqBhEEH0mYQo6CaJW2LRYbqMY6OfgVD+sTkrbcNeXBTbPfKaJGzyOx5g9/S27IMZBCU9R2GM8QRjPjzkIKf5fd3F5cRmPlYTjbrjKh79PFIlS7NsVD4kTgLKxb8VdXsEfTGcjic2wVzeZ/gpj8tonObkeyolkQjsGcl0UIp/kaIJEdFcOxDXjlLqF3n6TKBBUabZEIkkSiuWmUcIEtau5cwiDggRjnQUjxJYR2NLHamTyMLrfP5876LxGFKlJJ/yPXk8ElSMOXb+yZZoXJURhc8k5z+tQK2i0L5rvwrdm622MRfgatztVoYLDGQ3Zg0MUN7bfcMLAsdElnZvgzOkek2c+4z4xRBVMIFRM28qNZ2CGR+UVjZf9VBEHMYPirzH4Ed/1F0scscuFRRe/V9TEFjjNwZvodyZpMr1xwo/CWIIxtE1y+7Vk32wh7mw1ab6Az2IwBpsjfX83XEkCCv6npSGrPZFGE8sQnrF1RDdvY2i78GY1lzbpPlCTYrJ0dvtVlPktmBuB6bw7mcnVIyff5sXY6+4mcWaJE+s1HTNaYqHWeFty9ltifxxG4gjst53mllaMUmIMj0zVGRNzVDk/7JsIpC+QVWYO/ri+aaVLAsfy5fNF/yvBQ2/x/jfD8zKjRBWmUcTVxvJzlVrT3ErhF6U6hRNXViNTQWVns6IbEsAPzMWi+vgUBEfLW8Q7GBYuyvw+avNZQeaQwgInfoaKLmQYi/N/FsjOOT58uf6HuSaE+tlxN+3qtcZtsJR3okaVyN9SWoMSdz5Iv+EozTwX1zhJjncJyoZdMtqH+o1vjdffWf6Ms+J43OY3XmePZ9dhG3ubZqurYbB7IQVTZblVLbL7GhiVnpmueusJW/IW/yutU2hIdm8nMm4aikPDEq7mGyZQ/UhoBYKIaGhkhe+XLuhygTBk5JNkKy6YpbH1iZLGsja31nxQJNyHVtj86GE/yzN7GGK1CVk1Q=","merkle-array-index":4137,"proof":{"hash-factory":{"hash-type":1},"path":["Sd0OASS9jfQw5pAnjPUEytX1cMrj62plGzintIrQepMWeBM+WusQIzYA910tteEyeb/oEJCBMxqvRZEZvg456g==","51LspreUTYzfDdDoHeAyGZOkTUVk6iM3pMzzO0SAibHt6WC71kXwMjeAI3gqe1OmBCLjVaA2DHVhw/BM9JstIw==","8ppktw+zH0V3kRUPa0V75wSW95kT4JqqZUaloiropPfqiKRVIss9uQ2nh9uZG1EMfL/OccoV2zP4K/LclZV+UA==","Xi/jJwKL28D/9I4TXNSeAPEaMXd6zbOVTgparI2b8hhbcnbwnxEAFnNiZck5PELilzuFEA0NB8hW7RfjSltJNQ==","azeyMz2eHf5Kj6vqh7eVvPCILJif/SPz0ZKXmVx6q80M6RsZNrJfLc09KKfZ6I9uzZ2UQa0xGppiAbIxQIQ31Q==","mtUAk+QN850sFY0oIRzrPP4DI68vWoG9k9bTUE97OpaKHFOjC3VEHwzd5viscDeGoCXKDKPWzYY+xGXtvwy3Nw==","ozdNBunxETSdDlJUrvPStjHiAb9AKuewkhbzblmExUSfQQTiiwvGV5p8UQfxRZuwDxF/5mkLVnGu4oBW9yBVDg==","XBKazfMNAwuTNFN1rMyiSUpT0EWu4EjUgLU7KawyQsyXSrO3PYMIXMmsc7Dr5fAyBKPeBj4rm+r0JWh/UEA5kQ==","GUxgZx2mbmvfjQ7+ep8thfG3ecTXENpYjMuknxRpz96aWeyTbl/9tF5K/cqrv/79e320rQJtPxcsOKgBufdctQ==","PYFVpECLluim8jJgapGq2wl4diIKGf9WLuxS+4u+iLOicIqYRShclrOsFZmaiPQaUX5HUp4Lm2NWz7XJGHBRwQ==","NUi4rR0KGeDNTOq6GBng5Wp1p+E4jgD3L+Z9w/rWqjZLBppK9K+vai1Du0Zd6HyLlW3ltdIw14EoPBmIozDaAQ==","1mr6tYhq6oLLCIwQy9mvtKAsdfur66qZ7H0ixwe19NVaC0FVxMg4C9fz0uzVjwBojoJ1EAJabAZ+JnD9gi8l6g==","0/kdzXye/dqDMBAmlcqLJljxdMe2QWy+wEKkGfOKjKzbWvRN2aXYlKB7subfFftxXENLwR58kbWvmQKfC7tjRA==","aOF5xivO1WsFwLKRlqqoOE3R+aqV9bm8SOHGl4jy/URRBFGxsKkepGw/BzLJbDckoeljyRT+CFZppSYTY9BhEw==","RSKgRuBn3tLqpGEyTx6Pv5xgkiEQXR4YhJYtMr5JUUimnIKb5XVoa+84VCN5bWIh7BbS9WGqs1oZksbnTjor0w==","k99Srfsc2RkOr4bOb3gLoZoAqlQubO7F+nlORm9RdRBoXLL7TeOA0l5ulMHsNOSaQQTUq+qiJ/yy8Av0TlbwFg=="],"tree-depth":16},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"C1FZB6qdSaglx6ld8H6buapmU5e7yCiXW436csw8643fLlqPdifbt1ECEHoB9JehNRcPdVPea1KhU+6FoqspTg==","key-lifetime":256},"weight":506298118547901},"position":13,"sig-slot":{"lower-sig-weight":6581875561124693,"signature":{"falcon-signature":"ugCeDJ5ucd9E5+hSG1bNoLP05hxqFghniwjNJiTli66QpRlYDn5i642qxtyUymGPgjsQJlrHy5yTRMjQXh6Mu9kK28ZvDHcsh2qalSM/BvPMvLvTOzfCh8K7nCQasjjnXfd1R7easHAkewOor+ytGi3U5OrioQulV1BiEsQ0iERMn+it5Hv8H5UVMYk2NuwxUPe6eZafIkCiEPNGumSQeLTj9qNE5VYuCXCT0ohKZm1U5qEeN7P0viFSmEcR8nJlkKdaAmvRlGNK307QksK5fzVI9pfMIo0O9ZEySfPF/lQf2YI1M3Kjx1SL6e9maNwShMVcjVEPBQKExraRWgTmTIkltdIZW23eKANkk8pM2zCGxy6NFOSgRxLWHglMhTKNXcsPDXjqMt6mCkTg1HKYXD+v4bPVtkl/V53We7EbOS1VIb4rPu6qXqFRGWSK1L90elCmBYiioOUOwWEZdIYzCSU0V0izy8pr/oJR8AkeoLxjvrtMViOmgRBFWxZaEKJ0k6TaPTCyK1kzVKRyWFisSaRQyPONLrLvqPxj3WuEDcuVOrP04BFt13+wxbk6heqIvAsnzXNH+y2m1NS6kLq0kgwlD4YAtkK9mT/8Tr1Cm6nVuz91AUG0zg4VZ1xiVotj3tLs7RxfrNsoiB6Zxm1sU1Wq/0eVEG6dG9IfakYxLSEf5rtFI0bf6Q8jGPTaWAdxkelOMO1bricGk0vHQY1eUj6mIbWs75qRIIBGNXfpjF5sbm06Tn9yZoowZwYLPTBSm592Hsl6k42O9wKAIrwXra/3atU0eVl609QMnvkbKDvNoGKVKh//QJvCkIYppkg/WPIwLGYm0+O1RyIZfgtY08ZJ0dSeNzwUk4LrNPo2zcKVNVijXwNnmQQLf5D46KKHLm/rNBlmDqxf+7e1FiDxomxLQMqq9bIk8qN2KeXI2SJNuJH68wv5nIepdmXKrIZv2ZxrKwJzZLFnCZBf7FDdAuCFX6Flg/GLn7rQR545o2+c5r5rVfA0c+erGxM5Wvb5pIMePQbbJ28RCovDjM0qMkRycuN5Jk5ya06hxERU4Sf3bWlnSzEpbS99lsG8HYS9COsqi1+pHXV9Y/OJO2R1i5k6JkMWtBPqVcG/K22TBjpfBgyTIgg5PWt8kEWFY7HYjcl18kL07Q77Z298sOoqNyKKolkjez1t5eYOQIcQF7eMp2NHTr/SSGdy/5vLDtu5yMMaWmuaRl8C2kT+UF7kVzxsmau61kdb7OovwrKRcoyRyJGaGfOmsDK1KttgzQvMpd1KjJI4qPX9HO0EkxV7p0/hsC4l7xt1iZSFzg3ReHrR5G+ZQL23x4onapP0Mm0hKY2wqBMgg0o11jl8RTzmpQYgoS+4EhyJKXpkydPZIAV8ono6Wmb4/HB9Md6Viz0vMgkFW1dIvOMk9blsWwTjU1w7vS4AZGkZXoEwWtOnZtp0MVQGWaLG5OT+mGpFrzUKla/TaWiJiys8SBBx4NoivWy2TRpWZjviQQFBBbufcWpO2S6FsVI4vOmZxK0EFiioEkk+058wy19qEBG02b/Y0K51ctvcDx/kj3Np+HZXh1ISKo5DQuq9HM1Xsi4+DrQeo0edZqqqBndi9PCS1BjJ4+45TKsGUh6eR0IWR9CfbhFCgA==","merkle-array-index":4150,"proof":{"hash-factory":{"hash-type":1},"path":["c1aQAOSdHgfUXduoaMLsibWjtaWysz+2nT/Ej4zIE79qlwSDfKgMqA46O/vEmuaspnYjdDG0sJhyTrmUtfuDWg==","Rps9Ulr5xGU3exvPIzMwNv2hvh7LOu9SITOiGcc4E0w9nGVQ6TsZ2os1fprE6qu9/NyliLog6Oc3KwNbto8MNQ==","yY3T19n7b5OADRbIf4N+z8rWe4kEGKxH56iTP/bcvjTu/fmZ+OHyWc1+K77zH6JbvbCgiA9fmgNOe9WFnVoIWg==","khSniuyWwiED0ZSAm/IUFOiJEdAaNcVwwhKJz927JtP7RkIcGvzRBcfHSGWu4LEouT1LIDPVA5vVRfEaxYmrfg==","qWCZEtE8cJ83ZHBZ2GeK1yG837KRX+G/gdLxLm+W89l6PVQYj5aNeYPd/Vn7YQNWHpnYLrs3x/FjQAxg8x4RZQ==","rD2SZaHcKno2efJRXIO5X3LHTS5mVMvI/yxcZNLCvJrPxQ1wY5Hi/W/xu+/coJiBI3G/+AOce2i5/P0IMLhMmA==","X1mHgkng/Dv42gE4LdbB9OSWgpw+x5F/EYfPJP49UezkOjqMoeLoNyv8c+s5yxr71o/+KwLNcjSrnzE3+SH0Lw==","kJMujAxwXuaW9+dHvz0rCsA8W7wdNr8EKr9eoRab4Pm7WRBrWUv8G1eAW6ozGyo5mstqIDT/wAM+LmHAgSZGyQ==","MQGdzrlw81lNgNswdBmOF7fGENCVbKbprUQOZA3QssRduqcesqrUNXSUf8EUcD7Fm2/0WCMSiONxUN00i8tLlw==","HCoSfMGWEOKqKj0ycIMKc5n9lJLsuSc+6RTowGNqVHl1wtjEweKQfy8btIMnPgTWeJTTKIpwKVDFqg8gmeW05g==","Dy8yMuP32rKaVbgwy+gjP7LiCGk20i1h7cIX42Jqm95ZGI2HOY/8DJQFAl/BMEucnkK1U2mkWcFJXcmwidRR2g==","KIdUsn2CVc7mpTGZ0+3ENkfBHmwrytcYqHljXZ/VQhv8j0gwtgMmTzztypRKGWut5LyWxxwJOfb3KVYmDfgFgQ==","itY6KYZ8lPTKvWcxHXuPJpoAHeReM0ujiSacebJo9hH5KIRI1o+ffbRXvwekzXUZx4M11+o8mQ12h/DPCQ38dg==","cUTpd58CkXNvGhkhuKepe18QslZrp2caUAWxCrzjhn6sgbS1nsFfxmPASPUSY5G10vOKDjlBKQo702Tw2GMlpw==","yDMDnaPenCFk0IenGgY8MimTp5c6N+Ow7PXhzAFAC0b008Q0pSjvl2Z4sxACbR3MPgIuxZxoyqq80kpSpe9ApA==","qSqWICchLSk1srDsIr2tFgCZ6Ro5msVtiDYGeH3WIaEIUieHAL9sCNwKGDsqBWXbG0KrSuW3snsRID4AGVWezA=="],"tree-depth":16},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"vwnhWrZlzaPtnlMic+HCwJal0UdYSpngWZ26un/cXmRHYk9STnT8evkbrBQP1PPYiXtMM9nANY1jyNT7zp23ww==","key-lifetime":256},"weight":506298118547901},"position":14,"sig-slot":{"lower-sig-weight":7088173679672594,"signature":{"falcon-signature":"ugBimpbvBLj5TG9+jX95Gcm82Ze/7aRc11ZS+SCGCZYlkK8YHYo5jSz+r9Y2CP3TIJMW/Qlmo1ZdBsFL3N7n6O8Ev/blnAEa56kI5HSDVmL23OzPoWeLr/ARZr5pE9Zf9a9PFhWGYjRDI85Za+Wvoch43ixW4x8xruGP7nEDS9D7sqevY/HERbZY6ilkRJfkSYosKrgrJn7Yw9TgMoQKTZTSFGVzHQV6IYjGNR7hotAG6YuT3Ed/xjiwlFrzPC1wUu2qIjQYmsriOFHYpFiLyHF41I/tPyCDqwZmtN3V280ciVOUHJi3LiiPRfB0G8t7EPX66/ZR+m6gDasLDVHgM7TZ9GD9kF0HatMM0GiiruFynKYX/kk8frIo5DlcsDq5agn5EBzLu6CmZbMRciwgBDTE4LOMRG0/wBjIkNLosJkSEOdv9/1n6yiGI6ThhEAgzgQ0WmTUv+6ZNxB3ih0G7c5n5AvrW++XaC5c5xDoARLRcZMI/AUSRbhfAkDztbD24RIxU6aN9GoPVW4PnUA5XZa/Ss8un10yySBcmqvuRo1+iXqeKJEsM2J/Aqd2d7w/MYZDJM0e7i2hJNMsegu+suKw1CW+XZNN+u2WZyzzf/j0KhtE1G/zpOE029J4MLf1S/3X2U/9eg9e5TaoVeqspj30qA1GDV3tEh0QjnSis1wM+aLIXCPS1CUby9kS331vRe6P9/YmQPdp8o3DttiVW5nHXZWegoMjUamb8/WnIl4dXK8I7fyRZtfnqmKc3uKZhxoCIu0sfhS/Z8i98/9p8l7sYhiZfN3WfuOc6tZ/DuBDsCS/HuWkWereOfNVUIoTIdZbNXyMqxJ3tEiK/sgnijHwSZRGPgycwVkRqzXwX5c27EHWtBYCR2JYiJU1AVddXPMe5zbV6IP/nYU+Sy63Z3btclxYm8leoDGrP+23UyTsYkwtqLt50VBV235lnjps89XW+slcYaxaGvzyCMeaVWYAWG1ePUYH/IgwbT7nNwZ1nC9q2MRhdK3i688z8WxTa3iGvNqU+4G+ryCz37fvNo4gBqEmmTPZs4dM1iX9KO2yEl2J0olCICxtv7X4hDKd15zi8/LeT3wLgPrZYRnXhnTuf+pmSPjRKMVDIKOyF7nq7mg3/OzfOyitbvejsb+4mYbKlbz8QHwkedOwpbXOxGcMibTPIY2vFhXHfIrLEJnDRwpv5StpyImdd1mIfbtN9kDeZ41puSyYOUQJBsIn81rF5bZgSCRl5Pbqd/OkRl6EUNseNyMQg8zNK9NGxThMqgvpx+l7MC9HQndyjslTB/oTgprkEx/yzVx7x0fUhqLLDIQ36FlBT+aWKOJtg2m9Y3BLm7TbN8YhBEYjw8XAtNOfbJfbTv/zNJVE8wj7V1oUU9mBDXp9ybFhZFaefLrZ7cnNa2qrVFLUbLHXRSvUP65CV6y5S3Dk4d7Wyfb41GndkWDbr+t7MqErkulLK+EhuIg2wTKbVGBTCkY7KG1syWdlZEjYiVV5bKT3LHRnpetW8fRYrDZjxu8TtNMOo0zkk5gkC7XuodhT23fOIQ8yjESRVMpE4ovvKxasfZXM3tCp2mP9Yw556W9HeZB7aK9nTk84lamnYLeo1vRV4GxQNQ/HFrneec2XmzeGIA==","merkle-array-index":4143,"proof":{"hash-factory":{"hash-type":1},"path":["iavmGyn0Zbbdcx5RVqCdBwOhzdYiGVjF6x48XPlvyckxw4h+LRa+4ya8X7+FioI4/m5wkt1OYoDrWaBpIKs3cw==","3GKdqpjpXrdSXX6AUs8UnnYl2EIA/4ouvjinBOrutU9N97tSII9p8Z+sTIadORNzdvygQQSOpQIgdXz4PGM+JQ==","jUCU5/H6S0YRUsxBe9O0tlMvPTVg2eJv7lmkLkU9TjnjeWBVxXBjC767WbileKEnAJaYSHHviwu/DzqXwC3N1Q==","v7WervewD2VCnuWbYjUEmcJ+9J0fre8Vg5ZRFpYVxwiDKd2ag+2N765rErcejWYR+oPTFuu7skO5cC1jWPE/1g==","l2Co/ZmzCuEhHbtNyPK/MW3Dk53FxlGYoc7q7jKMxN9jI76CfFCpHVSL2eBnI/Idl2nXEnDHQvwv9CWHPAyHAw==","bRL3Y2EhH85ZWav6uukLOUNTsH5JfTFLJIBZDv2spj0JqNAoUmU8AGj1kQY9bK6CSUyYTLqT1U23FhVnLaDcTw==","94tyzLP3NNlenmbob7zrFVwmflBaDH8qYqI1EK8SeEM4l8AOwhhlM6lrUerAOUt+pZkvqWeQJnDe2pMNVLdYCw==","an/1DnbvJKhOKz+/XthnTc6NpcMkGubF//n1P153n1CBg3ayrl1+Ez7174UJgF11cHQYZ6HZSkehKmJNc8x88Q==","qA6M62nqmJdWfYGcNrdRfi+Ux49ihbK4gSObIiewQsn/4m1FQ4imY4A97gm6O12iBEbHFD1t1ap0gW0Zf7ZnIA==","e0jC1XnLyA+8dtPF4bpc6M7jqoxWwRuDDSm7IRwtZrsvLCS/Ai1mipuYOMK7YMDPxZYjZoClHnWULJsF0Ioa1Q==","Kfgz1Ri4ogyaZhzn2/FOYFZHeC1Z9RN/rcdIfeyzo2IAayERyRU45ngfEq3xwdEqqXGji+t7JGs7LS17/H9K7Q==","leU3zVur1S8pBLmqMKr+8eEbT+PHAJVGzbMlOS6y/E0LBXYPDm3kvWMrq9GNEdWX7D5ZCTredOzHzFVNzdJkFA==","tfBIzk9fqkKXKDCq6FYup5yxwy7GQoIUrEY58ZwDVvsJhiu+S2NSmBdwN7dHI03SIiBkBUUpuO5c+BvtKXOn5g==","7WSiegFyuQNJVr6QevZQ2Q1VGx2m2+gxd6JS41lbe8FMIPm/qEpb8WHVw1I7tallbHi4/5XNw7jUcO26OGBP/w==","R8TkG3A174Tksgm6U79QGIqGfk1v28nQ1dZdLe2cPAOWWNXtEVCV1NFQKRbRWSy097QD4Bv4OA2Y1nJvPXrSjw==","wVj8HwaZzXLCsyyEHKv1G3u72LtRv2Iux/4rT10p1Ern+YzsaZCLC5g9E5zzpW9m+2GKUdHOUuR8H1g12k57ug=="],"tree-depth":16},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"mrnirHO9w2HRkbH12cVU1FHPKbEQqbRxhlsTBvC+giyNd350xsUqqsSVdhzB4l9taSiTUtn7+PZtDhuBlZT7kQ==","key-lifetime":256},"weight":506298118546901},"position":15,"sig-slot":{"lower-sig-weight":7594471798220495,"signature":{"falcon-signature":"ugCidZIWaxtv/mkxU7f3LFno44d5blptwbJCPVoGGkCSOM+XC0bltmyUXoUbXSgbia7cZ99TrtHv+DhmYYtOokTt/ktattV/YellS2/eu7Yz5is7IuXyp0iV6rk74Dt55mjFUwxNmzxgFJ2eYl6C1nBJ0mGmwZ6NVjJrAKxe7FrzxVNZREqAVj0mWKpF04IhFM7vejAnXlncYu1S17sRTXCjcr8W1NFbHTo7QJlu/m28pjOGY9/I0zdClRQRrmHd6pe7IpbI6pS0FYNDldMiiJAeDlcFj8hw8SNfm6ny6VwFf18JtTFvDoiyej7eBRL1l9Cm1tmXBRdHm6NLBFZIB4WNLC9Dw7RAIUc+hKdDU+VL1XJmG5MqQljVZ2x2qEtbIUxw5ZL2Tdre/tOea77b4td7Z/NkyXEsda6DZKLzEPtwnWKonlzKHw11qHHpV08yPX6/xb5N5/zTHj0Nqva8Lv4H4ibPlWhFXVeDE+iSxMlZqW/070Bqp3GVr/mkihB5In3Ek3kyjU4B+MQqlT6HBZLFV/Hq85/KeOWaLNUh0u3TIbaY80Ra6owfqeFB3niT0Nwpk5MI/iuRGTuu0LfN2jhpmactuE9DjIjG6IWJHYfBCWCpQHkQeMmMu8bZog0Vqae6EjcYhaJuvkq9ayebMaaA0tq6TEfuaYQW+QNAp9UaG0bZHMhTA5Cy93vw5sZwRYXBki/4R81hLQVrM0tjmfJ4rVEJatPKivR01uN6h7oiwyNuSVyrNT9DjktnG0n1aOorXmq9ybYJQP58Q7I7Gnw65Okmym/aFmECFOZNfJHBxnjSGFp3Q+jeCQWeLbP5PpE376yr9ewz0yeyK2fZRNG1KCqfKDiqfqazKlN8tUib6VluKbqKbS/R8sRFSPLw3iYGtsijIJh5x7IWtPybL+qTq3+2ySDsbkxMs0UnFRlFlTfWGXz2/YARbgylHnjjKKqLPGWd2JMWRxRuCiV11So+pysYgzFtDCWOZHus0lWDbo7LsyLekjYJW5BFpx8Pm53PXREXAO5NrSX+dTrKsfKzhork2tPqwPKyPtVVjXuRcndDknKyTQn9qQ33r4MJVfemcpJT3RjtWQvMYhFV3gZMDfNdeMW5vBcbkpvcSWK/uPzB0G7xQVIxiBuG6krNROaHMbl8974WOncbQ1vHF/ItHB6EMMP81iPAclHyveDL67MPe6aQGc+NgElK6sVMzGTTbcsxh3Fk7COfaVqRWm4H8Y45/CnyepVzXGWk6PxjDcNruhppzMH8kLC+tlNgxfWVfX1NkHRUjooMog67eNNgY1gFtlSsKCpmw0pGe7DFjYsR5ITLlcgiWM80+v9sZaRrW9r+v5ZHW6alG0KFJEdfaMveUdv9km6jow7iyiPPzV9Vnpmj+sRi9y+UdyTuhCrNo4Olh2CsEf6mauyvebaofBy21KhZqSM5AHfsSCne/T48ZU91RefR1mhTH9GiNMp2Gfii4ZerXP8jsMvq7lnGcSxNizZOhK2fOcs/+Z3kcdYbf/KUNIJRkqBjeFEN7FFHgq+Sl32c0Bb2WyEvyaINmYTL0i3eQuPPZml3T76iPkTTnZUvZKCjOGjNGjbgySgeWbsSefsYdW61Uh+kNg0mvciSg+sDG1UcXjqVOuwXn7dA","merkle-array-index":4141,"proof":{"hash-factory":{"hash-type":1},"path":["ABAWN6GE5ithJTKGQJNGM70YkSTr9/ifWDURH2SXRCaJ9T+TUUHc/jF6tMhpYn2uUs8PGqbaW86TveLg4+Fwmw==","0/VfGLcY3kdDOjF2dnJiUNsojkwwhV3f5HXX3CjtxjrOwD1EMLTdF0nJVqpMEg7nm0QpIKpDlUGnH1DhkgwTDA==","i/o1gTb5qRKb0sT262jgxVV01EBCvBE6awzct0tw0szZsYbPSKz7351AuWS/ej7KoYAfBmBmjcLbKMXLmHnamg==","UWmOeQJyVfYWXLj3xmpoNWpI7qBnYAJ6BQjB6p166JRfbAUlmZyC5qfYCaJEAnz1iVfPD9SmN0aexCRPB5IdDA==","xArcjVE7R+iN2OV5Q8cDQERt0EWt2jf/xGWCPCEgF3PLu6C9qdFZu5ZpCVydkZGVrOlTym1boZrfKzdF260F1g==","q4HI/YCzG6aDmjwEYY3Z8yLcfgekvSP44O2NvV/+2ah0Wd0dZF2+12rzTPqS4N2dp4aP5VgK9XEaAeejStkpcg==","M1g80gapAapEYBlIqXD0IjatWgGCLt4SACPxxsHatbz3nN5Agi7Hg6bYH/V6CYKp+YW+nnVCep2FtoeFdYMezg==","0rBoWIiIluunPgG0eZI8GP1OM8mlFXVg3YUBhoaKiWgeQxQ/++gxMmWOG0wy5Sbf6nU13QX4j1H2lYz2AtLkXA==","c/UqbtVNmu9Og38tWwSUFewdbEqBTCnU7tasWWemu8N8Wm7DOT+7jULVycpshWy8ITP7bDMwi9PB90Z9tAi12w==","za9cPy1WppJKkTzI5WwSTnPVzYY6MOgDIrIKNy2fW93l0ZLXsT3Qn5vzo4wR/ln1km6w9J3t7jXND2PHBifjXg==","PqqkFAjUQdviRLViiO9KrKGN6vGvZzGSfK5cXhUHqU6Y92vUoYllk2Xm0W0MebQGoH/fUpUH6TR4k9uAY6nFag==","DhAHAePeR+i9XKxX5o8abbB9WY9jcLVUQ21V1XlG3dP1/RvZyId0lWPHgYxVTJ9PkzWX1EZJm2d7FmFreD0Jdg==","V3kDmI3lRBfsMg4CDWBeD3WDPfyvgMbBCilkWOk+hU92VPsQWzAXBFUwotHUNqQOmsK/HpgoMVPrdBrVsB7JBg==","bp1yT3p3J6HgDwKvIKD3Pd/sqZf7W1MRCqzEktuHlZ+cRZja9RgbHXBBmkSFdI5z264X9/iRW2keS2HJ1XxFoQ==","pMJ47VkvRndWYKrAMb6wzVOZMB7ucf9wxDrVJjbwoLk8DT+zVBJkxItDY3Mj2MoKEHNNwWNau6pZHNAzkTnP/w==","8G24gNvspA1Dkt+8o+lSr8mtjP/BOJQXaCyCL+FR261MTMYw3pt2SJScfzP38CFLDCISst/TiZRoWsosdjOU0Q=="],"tree-depth":16},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"Vcez5YSL8U1uF3VNhFve9cVNTmAsQ1B7feSXiq+DaC7aSnziNr7l/HY7DLYNczPWtD685Luh3K8YGxhfuz3EOw==","key-lifetime":256},"weight":505298169561751},"position":16,"sig-slot":{"lower-sig-weight":8100769916767396,"signature":{"falcon-signature":"ugA0ldlXqZ0eK2FikBFr9L4UWix4qMH/eBKrDlw8enJhhoUVyhIy+n/is49tKqUoMET4gSAd6dTRn7hzu5gtbD0Xgi89l5++XM5dUDU+B/Kpws81S1e7CG9sDZtPcdBz1ZldPf1kNrUTa2Bo9rfaZZUuyPtkvDfU4CdtFtdDuMHhSjRYl/P9LlwJACibiVINP5jUpoHJ7DdqoYnO5L35/pq0/+nYMZXQpXja+k+pRUyVKTKz9WS4NJ6snd84cku8FnqVhzTlLaQQ1COsFusbhfRa4PujQyiNq355PAmaed9/z/YwM5Aka3zKHFNXR5Cjz7w0ujkKGa5zu/U5Qh9GKXgbIVkscSkJUXqkb8QFB3kIrW+qh92+5dEIOnZ54123dPX4rzIa46ORzUde/jdvlYzRmFuThdNhWXmdncfrFcYI8meZeOlNjJPkkeuLEnY+5TIWQ3KlzqPM40sXyXkMH2a/rd1XXY5fPlfDWh4LPcxkWYWmG/ZpmJrnF9mIy0mcrb2etaB247koFxmpwChpzL0FPlD3JM74ZJVe6khT1koUS/uPVbhdDr5WD/5zYQuuE6uDpjXyTPpw1iCdTm3eKMXxdV7EDY3SU2FYGSkHxUfFQ92rx7nxvOYz+wUjKCNbtXYN3kMTnkJ8C/tiyyCnuxipuC8u2YBIJo3WeQuC2n5YjA/hVsaZffJjis0SZ/Y+uEPZHe8FlXK5a+SCTKLGooY/YRFQzj2BLLD1IT+sTKcUUfRFvwqx0obvEwNUImfJarvvuVLUKdxuiwdPNEeilvmIlc3xMeMCaWpqSltl25hU1ZVngidlhSey6ANamqWKF4YTq1skbFk0257/H4CNSsNS1Hp+Oq+Od1eO66szNiZLbFPM2o0lPhBJSizFwqkPai60EY0cD7f083sxJvzO4z8y3rwss+GmIrdtQy255mvJfmMMobCBFAKhikZbhWllbGRO680MbtvPmfY98paB1kdMEauVE1Tdsiy/7ORchqcbObf5ToDu3xrgjZNUtkZTr59Pvn2fhK3UqkO+w7LXGx8B7EmKjjeByK9QEEm+c17eyBnT1cg80p5rStszKqYUhnI0rTNkjHgpFg2csIPmu1As9Dn+laweY1Qc6eYpwt6S7bmU7nOIERn7fziRlBzJL7AMppVZgytwm/Y1bJFNSt02Zq1zmU2PQ9aFN3vrJEk807yq7S14sKJYloSxNw32/PYIp5mk+mTMRlYNVEnYiBnBNE3spWZOrck1A9TISTFn8n/HpKGT3ZBEXUd7CHGgzQQLPojCYG1Dn3vd5lz0PdPjSawbqJJnE7QnyIYhNdEXjSqzB7Ck2M2ZCbXyGQbGqc3DqgdBtnZzL3pBWHTc9gtNIePw8c4mBL9K3djqcIr6L2fb5SNu1gY5qaI0Bn7I0knj1BhECdB56+6a7z3bY2MkTapU6lukL/GslS4tRGgo3okWDtfddrEsrq4BVHD3OYPVYnHayWGgim1hMoJ8udw3KDdpa3P0cycSatx51I8VpyhIMJ39Vkku570HpqhrkXPOnEWSJtzwvHN5Vlzm5fGe6noXBfiirdb3c0WubnaRyONgq7GTeaNS7PRv8pM6k0HfKgJ8nzGEnkrsmaIDIpB//JvYhwLA5fBTFTXS10A=","merkle-array-index":4138,"proof":{"hash-factory":{"hash-type":1},"path":["Zuqm/wh4TgdUja9WBnOeM7Xp/ZVa0DwqRJUnb6ABpk247379Si5YQmTlyPaBe76jBUqIpSDnyasa1V4WpHKpoQ==","NqjqskjZmhXCAjP94obEJHSIdhEBXxbX8J+Nwo1q6bLdiPoc8WWdLXyIYkOp5yVKFgfEBdErBPirbpPUCAZF5A==","TaDY4DP1mdHfkIJitlUq3ur8PoxdGmCyi5K07h8alQtTFNSI4wUFWPSkHMU1E29Y8yzhUQezXCdgRlGYKvX2+g==","vWE7OhY60N1JwuXJuLEDhZCL1v+3HOg1T+4MwLjuJ5LZ0watkXzvk89nqDFKGYZb4SGb40isnjIcCROuc4c7hw==","aABIlYIDDQYmAiQmKsX3/Lqn1kDiOJZ8WflbVX++p3WIUGOaVpAkoMNS8GFr/rvxGEaeqCk20S/A2JoENNGb+Q==","ALIoP7fwcTvIecECNOHT1J3Eyz44ComXoNKJCrqh4v0xUWjFxz6Xa1uyZLzCbGa1gUmp6AjJsI80qIbiz8KMqg==","uAdVFLQPiqu+U2JE4Pxk5HhyfWEyyj6h3b1zLkIUpObYme4W8OvPWZ9eRoymJQPghDDAsQGCneoRLwtkyKQHmw==","jHeQ2IXfbhOOoREk4raTahHDlRHPtmVbFJoR9BRTK5GcApZ1gT3ooraQ1tU7vrXkqjKYafLx+8ZUtvPq5ZfxBw==","cje+Xdo2eLryK426Xib0Kk9m99a3dJaUxQdzckgy0e8FCU6VcpSYaZbJMyoFmh+om2Agqz7cV6yHfWkQREM4rw==","rcOO7blwOUNshzVw2Ii7WTZrCZZ/OShej1DeB3xjRWq6YSRvaqGBZv8gTzQOD11r83ej7jNB1ZUW1XnN1fl4fw==","BGHoHGzpaIIuP/SkPHMAUW0cJN1AxsBbWTPa0kOL4HcrAW+4pGjgkmvzXDplxblpL7nHwqlbO/+mWFlAoquCQg==","XpRBTkPMGHo+iFHjDZmj7PcuIqf1YX994aKHSbWhsfXTbsH48cEkOO9jVTv2niy4aD5EGYmlBNRj4jpFEcdC/w==","+TulBOEZhaczdZyY/y4FMib4pDBu0qcr2LsIdOkdpD7QAXfK/jwsD23JaOgu4dl436mkhbqXjCLhIPkWhkmrOQ==","sZKm9eGgGxE0pNtsoJyEi21DCzFjT7O5IhI37YoGYxUdEg9G6yrQ7B+JMI1J1seIAIo10qwIG0AqTGUWr27d9w==","VOaXbXmUxS+q4ILdLvRBCDQoC82GjMV6L3ztsOrpbdu28NYDmBSiUaU1vXB6DpIvuRFEMDCkjZ6WbZ9QXfxGmw==","wAj4nwCAdw1Nn/fhqtpDGTw8kU5luHCvRdRHdDEpkCeYnEaxOui+D84vHYR+7ezbzdWe0xyMDf8Zk05qDWHDww=="],"tree-depth":16},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"qIQQZx7YLbQ20GILGC3DM7VPOX5F3qvfVnwpi0wuDIoMpo02STyKNC8Zurlchnt6zGtbjdQwpTDxCkn1vxvCSg==","key-lifetime":256},"weight":493966017269345},"position":17,"sig-slot":{"lower-sig-weight":8606068086329147,"signature":{"falcon-signature":"ugA7olEUOqalgsfpEYxcVSmq9BqnB9TuJSGT0Mf0kggWBbyGY8hfw13ZyiLICwK5M24WdKY5OQgWaZVEZYjfpdJA3KdZQamvZqWEQ5SEEvKFsQRsuBbzWuXtvhjW+LK/qn4EzrKahucvL/2xmdW2XTVGWSJrcyEoKnzKtnLkgQdvVSnTsFCoJ6S0v0ae74FYNSxg3DAvFLk9PLzCNwEYlqjDvsk7IRpn+43T7Xp2ptuuDR2W1ucZnPW+X2tviydiFso5Bd1hnLRUCd3XNwHEN7AJ0qWkqhhDG8vxrswW8yxiB11yp/x/GS4Pui5aDtSH4TSeoedFQp4Nu5jeEtaFFTbVlLJNaGVn2ZHPEMOPUG1phj8v4eU5CGU+bwy4zImJbJ47GC8H/hUUISQjNi3zqLMaVjvxNvJksF1abTs10dQ/lXhyiSfbtE1kDPe2e6sPHRIic7cSJG93TBNkcpPe7h3raFLLRHf07J4myaBSdRwf9Zv2yZVdFJ2RubUnQUSCZ408eSzvU9cK59saVeBoR6lh6R8WaNLCiCmROsmCEQMw7hs5nCL4XyTIncp0VBNlrXtqBVGkyVU8brs6OZUzTuRDKWQ5L/TepeMaj6eJYzOKabNqa3OcI/e95BYc/Pz6fmUpxFRR0yVNTDDzYwKlSdl4gSpTofgmf8UQMVOqVl59r7zqEBsi1oEvVYkDFON1YkTDUX2DlJOatm92U3/TLnbcjmIWMbOrPEmFHMypXdyrkWkdAxOpMM1RiCpRvP1kjDo510v830S+vusngdvXpB/U5wfd491SBCMZC2AMljvPAGTdW+zM0DPMI8cgy6LwE2Ge0EpO3Qc0lHcc/ezr/J1hIS4WqtHNmjOkQ0xz4Ct2+N0vqrKdBSvs4MKobWZSbUHZyeo2DEOvBxbkhb5CVPWTn4nEm6WiRxx44lJV0ZLMox0U73uGZKEBGFY9yDwcvnwSaH4GLD1ycmKDelxHb/iVLljr/Otc8NF+Hzs2talLIDq2aMay3KYdfMpMMfSJO0dlqmcMQSmVnViLgLm5bR0DUZV0YllyU9lvBGp+yDeVOUktrch65E4d1aaIo3NNaBd/Px0tQgV6iZQwrKK85cvlEdyUv9155lh/DcP3om46LGxiNz+oN9bclPEoJpf18jc39FOWGkbtjNt3KFi0ePHrxwL/ETNRXyMYhbOVeAwRh06IS7ZiLQlrruhh02T30uQy5oNUkKsPPto4hSTEo6PKZ7U27BZTLj3Gs1USc1fIASYYGPiF/eRr9C04VF5Gjeq2ycsqJpRLZSsU3pfH43wvWBoC2ULKUlgFSltNQZWWCNe0dGgNH6rWtAlSs0Ad/CQdEjJ5QlPfduPaRL4fEpjRDGJfgVoohMbJrph7dEhLBTlg0nS9v8SmvfwtWsR1WljTs5FsILptfowjVRww5SaT+9whbsZlTDPpYHyVK0Q3b053vxrCZ7b+IBNSy5htcgYjnLJNkNID7ICMWrNFyprcnOh9enXikMypvGmI+PX7X7Y1SmG0kWZDg02CE1IebrMddyPIy8AMkTxYtIknjU2c9DsIUbqasmgd6nqaokoCLojlDBL5CPv8htP9G6AnOo4iAq+mpjHOVedZlH5mrnW7Mbx37ts+10AJ7t5cXX5nPmSLOmUZ","merkle-array-index":4138,"proof":{"hash-factory":{"hash-type":1},"path":["Anet3UJxXUSYZw+MvgKOpwQNZSLUwLG9gZtmoEJdkQ8YyhFUELOMTc6hQLd8oDAHwblPQTJyRGji20BkP3qRJA==","CC5NzlU34Cm9aYZOlBdSvhEBPLOgWox3eoZXH3JPZUTa6BT8jvGHWVn4X8xjF3MyRxRKxCGg2pPUf+fSvrqSrg==","ldqTgbtRhwq7wkbX3nY/lk36EDsoP6UZTW0GLIGBxOLsSB2mktL/t97XSnrutSiC7dA9vaDBRm5AcVy1KFKUUg==","b+YgECfxJf31AmUPsyTZCTMLbLgGImig45vLh4Iix0ojVSAG8/Vjo9Wm3anPbfrXq5lQTTu2DDufwQ8dEQuy7A==","FnobaIQ9wE8Cs0BLdTUxDaC3Ud6YgowWUUdVX3vGN6RhbFAkwo9yP9iWaxsD/svFCZlwxasTriVE3oHnLYdF6Q==","OnTpNGBrihDEJjb575CL1CO5GlQp+q1yUzcaWI4bXC2CVxf3laJAgQpWZ94LXCrcQC+Opi+MECfc0vuFk3Tl2Q==","woAZPZISt53ZKDB7q17GKkrUfJyumexg0/MplU0NWR5nKkVxYhwlIY8xGwD8DeQTvd0tf1+9b/ypO5lteGci0A==","ExXehk2U8dUrq+Ndelyw2o45UpPwS4D9GrKbfGBImMdsA9cets6mAqLZpqsuuhRbHBLJkXhTvCUWUcdvk+Ks7A==","wSPUMTLsI9XcJXFOj4OuhzEG5ExG09zvTHZHTM3x4Jdpd0NHePQxTJVUqJED7kuOmWlG58AOHdRqgKJANPq5Cw==","Uj0e1mRZ41f1Nu7Expuru1td9Zpy3T6fhFvXOd9YRu42iSX9Idhagc9vDQv6Bn1NynomZrGaP6moRgTuJQrMtA==","IMgvK94rVqQyIMe1qXZBpBl9QX0tHQ1+R8U/CQlHj8v61WjJ8gc77FtVqs/pqWK9/hz3L4+4NX/0ToIb3LDrSw==","TivIPUNYdVD8p8HnG04/1n0TcKMuDApNW4uwpiz2YxQ84C09CCmrB2kW0QBSQmlG9+XwLs4p1DaZvKAfUEYtcQ==","dhjlQT49pJEjAg8bozC2+CWqhQK5UIqBlKiGilW+e6qZO/5xlhC025R26tcPOG5x/puajh+5M+IaMM55wPh1EQ==","yxQE3QEPJ6ESyn4i+DCPbatLFxAT+V8/ppRLZ6r70POmSqVel9Uk6uTI8DFElsgEK8wgdLeUoSHiqsXdOUCrOA==","EalSHa9xchgYnRGAeIy2feZg9xe6De6p0H+j+v7p7UvEvLtbvr+o2yqxjJj3o0/mSAd7z4BaL1t2YkNwJmR24g==","kwd0NaDyAw1ohiXkLO3uCHS8Koeg9z5QS6q5Srk+manM8lnJw3HD8cLlKIaG5oE1Z+DhamDYIxyl115wUV/HTw=="],"tree-depth":16},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"PSsVMk3P2dzv0TfmNYClAU3zw+S3Znukfr93Pz67Sce0fpeHZrOg4HqS7QLpPZzojOWbfDk9jIkmn5CoIiskag==","key-lifetime":256},"weight":405038494837501},"position":19,"sig-slot":{"lower-sig-weight":9505072598435993,"signature":{"falcon-signature":"ugBnwyLTxP1BhWXIIXD02h8q46c6b828sf/qOfTyfddX9MR7FE8ZpwTArtXJfkCyxlmNvNWMhmS3aWwdNCD28/3jxaW/9qirMy6byryymM/q4SmvNQhHQ52jeZxbXnog6ETYwxLCMWr+cqrZfFMldVvwajPowQr6jloNZuRkZNI+mUOXaWKJ1yiDFBsL/tdVLo+McKeneDe+HS+FYz3RGLupHHYOjScQe6GPKeG00JpJvBbf45w5WXHJs7G0vXbq8xU22VxPLk069750i22uHYLaIY05KMGHonzMUL1b50NfwmbvfPW2dpFKWSY/6IoOWVhaGxfNY2fcBUmqNE9G42igHpF/Y/utg4kag73trcsNr+2y2fwaATjB4ZXreZNFXV6VdxiXqPpplu2FnzgyFufMmXVn2nK99r8zRsny1+3f5gky8r0YTwQFjnl/s17WHQ8OUta//+hZ7zcuZaRmTs3177hxpDmi1X6t6e1eWqqC/1DfiSKLVGuSJEKHFWaZ/FYNh77f4ckKNqa8yOtxfsxG6+yUYeYTJEY1I/L2+4r7MSWTuhqM/nDOFSXXXNyxjTEb4ioYlM3pPq6E+uC8vBjos/8Pnkop0LZFmdewMvyfKj+v2SuoHGSUQ5ckNnuw/uoNk7xRzaJ/1zKuoQ1idHmXNMbq/rU3os/enXC1N+KT71HfDV5xWGzbkqsAbuD3E1kdmCrbpGWYdDmy1NdhT2YqbGNYceG5Bg93Lcb5c63NOWPUXrcKQguqfOX46o7SLxbqL8m2QjdRcF3E0nRGcJPeQS+SxLKYekrBmJcjjlPJWk+oLe+5sXFr53sTJkRrlR3c825YO34KImcEEkU2Ntg/qF43XawkCUxFh8SnHUec1dgjK1dTMmDMr9ZWojm4lAtrcKk08SQvq9KhnolXIpCAIWWugowlDK090CilatsvKHv35x5Ocy8WZs9TukFFgUo6rTIH86LKMJeEcivUrmDJQNUH33fR9a33KQ8stJhiy4dtGK2Un+fJ/bsNdzpiZKObiRYXLc/0YufNxvoowxG7KqOvqHQnDX/LWvvbtHnTkV1iJFRFkbaJOPO/Hi0jynf1yBVvF8VCM8uHaGIN0z+MbDKU1u7YU71zufYBqmqHq0O0EV4xs30jVo/zMFMd2TweFIDZEMi3WrE/i2m72v9Crr4zci8evW7rUOuc6Cs9w0FRe0/XefOs5xbZktSx8i1TnBshM4N7pLLEstf8os182nh2IPnuoXiCyoSOkz+L3Smtbv9po3qwWfXjOD5kLWv0eBGO4bFUsRTjhwRjUdltvyBLn4shFSg9Voci06GFskSiUzvRRT9kh80xP2xyh1ooVXRi15BN8eWorCKWZOP8jmSuuGSWgFFxufS5gERY2hzrH/Pi70ySOWursEuduyN/0saq68d+oOuiZPONuDEk7P9b8l7ontK94kJJSpko47M2uEK/VWGnqY6W3wMzi+vMtpNjl6XUpQZw5arc3IOVrKksqJqzV9pAJGPERQTCuxCuddiyrH+lvTcbRF7cZai35ZSc7/IObYqbFJHB423cYwlQQ6IOqueE7m1frp0doZ9tkTdqfs/L5tLW1tNmPwwMvUuWFTvcdIO1p6X/5+BIG2re+bA45cJXwUA=","merkle-array-index":4149,"proof":{"hash-factory":{"hash-type":1},"path":["QpOu9yy/up8UyEYqEWaRlBlnSlNE0NjIVme01F8kgTulpag4x8nhUXLk/b2bmNwEtl680CxqcikfODmSA3T7ZQ==","vU+ZIJY9sYNm80pUD0OMOI4vYgIpYGWwJ24fuWpC1geK0avipa8buanKu8ReigpA6Ihx6lMQtq99oxMQ4B0BmA==","7q28n4qwp27N/v67vIyvsc+wSa2XP0uNdL6edQcouRekWWPRCa2XcY1I/GNP3TWE0NZTu/QXU3tO7tcV5ehiUg==","KzaBfdNPGccTUE0ZdOwru9pMyRrMvTpyMTYXjvhs0QOCREFoWy5g2ScZ7I1s+pKPaZo/+UAMI1QWW8EJ3yaPJQ==","rNkxD0+Jcy7+kuWBcdc3zQNTWsw5B+herkex81qnXQfh191uE4rt1gQS88cfVqyx17rVOBvtotSdzNIXJErHVw==","bxwr4DmV1pXNEF3zntZBXG4vq1j9BQBVCYUzMnMtbSaQN1TUrzrjDXPUKQ07T9ag+NwyYoAg4XAa4SSpYqORIw==","H2AFRE0A7IY1HIfoFDWz29b8BeKHB21gQNYTReceYhB50YFMjCdzlctK1g04Me/HQY5ZAeuK+s1SAyXuFNRonQ==","lIcV/PfpmZMr2oZ0F5R9nH0Eh8KubqFq2lPkkU+fhTmygY1eb7U3v9EJLUY56dd2siHXnFbY8I0IcHfsJh+71A==","ruAp6KPgfkbd+KJkoc4qLMHfDxdCpbQofiWOzbVyw8B1eh0ia6WbY0PXmYWpbKZLadkcRXT5aW6WpK2rUbc6Zg==","8mUgNicD8OgtQvjnBxvR9n1aQvcX29EysbSRkB8YBB1iGPmLgjSjxXWlkkQUvt1mvWh5ggwtHckP1MljKNLLfw==","EIzYz6vlt3OjVZUTbZz7wbNWQSV3Mr2CZDsb99U+3eGEbAyso7IssXHZuk067021WH7K6XJryF7AJIFuP/4X/g==","l5Hjr4R4/iemMgbcZIk1yr7na/6J5RKHsDaDWszCPg3jpwRqe2NZp2QKFicoVldcsESQC77XnE8Vt25JZ6TbLQ==","CZyT4zslearYud4Bm509FrJKKeCo0ZtlDLgI1qIfbe2pIgoeFu3p5xP1SHCTOZ9tU3SvktoEBquaunZ/EAXAVg==","g1U2sUVmGKGes73HdOot16nbWqKL/vT5/Nah2XDd4PCVdfnOVUNfLwl3ZMY8/7LDJjjO5IM5iuPi+iNdg7BJsA==","ah2hVLNa6bx+aP/LAoNt2/DcElqU9QUsugT2rLh/lZzrtJUJJGsm4rHjj2jSOmIoz1R1tGwp5z1Stwxde4qLRg==","XbxLixhUpWhqjhnOkeKxlP6yHHaQcQ2uKk45m+8ljqmgXogBRKNVeCZkSMRLks28LfrxxyYaLCju1AwD/vcgaw=="],"tree-depth":16},"verifying-key":"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"}}}],"salt-version":0,"sig-commit":"np2e/PJtsO1m4qOzzZxZDGjqKaijJoMYKjgvmAKfDDPtcvckgY7XDEgueM03AijKG8ixQRRnl9DSPN/eXS+t4A==","sig-proofs":{"hash-factory":{"hash-type":1},"path":["waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","Pa0RvWKeDEuFBOZEUXswMCR6vwY8vssMD4L1YWxaKztu0qsSHI+OG/JxJfCVS+ZHMpy9oBd6mFBRLFb4su6G8w==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","mfQjaoIWp3yF7D/UUrPGP1968ye8/2seEHIq4Xh4j5A/I8E13Y1aA2HNvhvbJ5h89PAyixNPXCjsaxzjgBDftw==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag=="],"tree-depth":5},"signed-weight":9910111093273494},"state-proof-type":0},"tx-type":"stpf"} \ No newline at end of file diff --git a/api/test_resources/state_proof_with_index.txn b/api/test_resources/state_proof_with_index.txn new file mode 100755 index 0000000000000000000000000000000000000000..31cb6212d0bf0973a98dbfa9a2f20b66b5764cc6 GIT binary patch literal 82786 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
    =BO<349H={$W%=A6bH+>ZjW~z zob)shkzI);sK8{w84c%sF(>r6j$!IiV_RhPpGCsd{y>8yqA*+fYQd$lmsx_#9WCfD zyoR^R6C{zD!37xnDs5qbaqCT?y6MKMD5DXvXAUu2W6_(UE2|f%m@hXHo3b6G!X5Zk zrM%@F=!v>=JV|w9>VY}T(N3oWu&VRi;~R5ZN?N5p)!9g)N-9?SnZ%n zMVgTg=?5W-E!3RFj1bYo6Ih)pJ(WHGux!cW4)r^UmDWDi60|%xbLEpxNHZvtTjQpNxXMLitNT%TXqDV$NlSC@nGT zEWCGYLY?JUFHSoaaF713$NlaaM6MFE^y2<}hyb z6zwO=G!{bWD6U~0D}4E8OLvL30--cS+{I4XG4hoRB41OY!G6~MOqb=;U@4}OvOwoM znPN;4@h|qlaUvhPGRMOT*{-k^3|oLP`EzKAvtn*<)C8OBpiWAq5l(eQNs24jFF9=U zj>vi{#{)SE=7q-C5pez9eGIg8lyVquszk_Ion@WnA*58OrNHy|(*sUq7RseCmWUgd zQGoS_@LL3cD}mM$D-ern-vk?KhBh$O&V~F1x6LXHO@4g!2c!@+TTRy=Qbis`>Wz!Y zc!;YN)jtdG2G;V+9B89bN0)Q+7A}Jrzr)fMOzpS3e)f>K7kGQksu9uY@{YR2Fgl-H>_Gs%9)3d8#R+V%@}h zCF9T1=|Z`;S6*AuhTEF|)qH?F+Dq03ukhpGv^@Zu}^3W6=bT&GRqh5{`C z(w-PSeqzbek5Y5;?;)utSDk0^@5MX{shhtHw{}emx-R1PDz+sFkiv6k!-l% zUqY=AIds2~ymgrbIwy9fzC&+@Zwm#Pt2@y=xvJ@kfgz&}@F>V@{pvLa53s=Z@emV3 zG6IhSrY%vDCim#YmgTOh!iMO=(DeUqH^&Zan6_05aU{R1S<}C<5%W@F%=Ei@-oGlg zp=%!vqGXCi>Eb~ogN*Ow0QJzOLOM?^9@#g9H_xTVWQNJ!YDvH6Cq|^%@E1(~taVG3 z0#mAj{1=gc7hxA_T*%L*ydo_JU7Ct8)gRcR?P*&Fk~0fUdp_#HSmB%EYOO)KBr-FD z{Yr`}rJCiL_Y^VGwUU^Y8Wv#s{}Tylb32+=wuk>E60HBVNElU)I}plrD_fr8FWyIz z>h=czQ-(gb(@|2bDr%9|GNh$POEG3#Wo`vw7@O{E;!mY2T7ML#4?1_a5JwOpxc}2! zuA}1T5g{Uj-GvKR@Y%tLh|}iIcb6640x!Eq6HZ%bdB@6Gv1f(bn29>K!ut4Eb?45Q z6iZKso0Jdh_Ppm31Uwwyo?f^jsiTZS~vz;7BC~}_yA*ws>lG04rLR@C2x;FmIrBq z{3}t?qKa|J@}9NqEFI>k1uW2vEc(1aF$@jGwi*Q7z3~XBSfl`_mmeYV>2HZusG-`j zHe1DS>xd-eSV5@`iM<@m)C_Rb)kOC^x2JGFtarD&xpZX^+YDwwU3+8&0e|<(ECN=7 z#qsndg_azxOR)uOA6%sJ{X4K~rX!R6KcM!}`gcb!M82cuA+Kn~(WM?HEK1<079g0z zw*54I#RdWWhrlREbfR3|#&uM6M-y@6gWYXT*{B~5D!zuZtU=Kl6wz@fKj?KXnZZGB z-bcaKxZrBR@1{AWrz2nJNqYZu-L$ih18cfHX5E|=IXabe=gZ)^aqZKnU{PtSZ0hyd zhz5$E#aBf7I_t1KTz{`dT*CW{AC`Rcc|wRxq2gabP6Po7*c#rQ^euUQq$J!^T^%kg zEVHRJZW~;6*$L1O(-3@KOyN-L9Lcxjx0iE&7 zK?p}yV@~FSw9eDqvsn^ci6suA?pZ~P;urPr6)d6%=Do|?4e2Sdp*$nk=e;K{Dh6%d zCvT@o6$U3c|8#ng?kyDoT1Yj}iB9=h-h7lCSVAT6W^@kVJt5twNoQKoXRL)5whGgP zNc0|}4=ozN%0t0%B+SW(=qM%QxUf4wK*n{yWl`R&)*5jyK#}r9ciJuzs63-`LfzA5 zn!A{aI`xqd?5b$NMauDwCMEb$L%(vm+q&at?3V!?&9$OHBnXJ~o-OI+`#8cOukWh> zyovavrbC~yKeYA_2+2O26e8-)ou_pAqfsrsP(xIQ%UYJ1_Q6a-^({h*=0H%k1{Ro*IXP_i(FXM2l7AW7*=&mWGiMxFc0Z}?@4+%%{U+zPDGY@icG>x=SL`CavtfhfYQg*mARYLJ(-DD7dEZJm_)?TZ~ve301>e!MaHA z+7sT@sEN{Al)4!sY1Z8n%VUeOgvw5*p1^v%B&e!1)sm*ABJ0cje3u)2{W#-%Ywx$b z!mr@gVJm{PfY3ki%{?a-3FSBmfj_UJb>N!pzYYHiRt?if%jh7ekg8C-+Ek36x4lWO zXdEN>(>r{6#THtG=4Qkom{jnKeG1!<;V#u~^_(>fyRLj5IgMiplfd<^uvN9L?hYSY za4VyKUlTMwpV9gC&H>H5R~`=yz$h9u{D^rliD9U_O?^7iI)RhKK<-7ReAFP#snSc$ z2>Gm$8BYW<&@Xm$#1DO7yPYI}fJPk zBuip2u&fiLYPZ7y0W$+fRy{=yZi(Z39GrYZK{c7L)M^8xQ9M82p*a8kx-9ycml>Cn z4k(!w2n{s1CLlyWiN(U2WCBgnA#XzpixiFhZHI)AGsjw!_sp>Q^(>4iWQ6RhZGTH! z1z*or%?Th(N9TvVyQJc6i)7g7^j;f6Hj>M6eVQw6HLIdN7>U;N{QME0yqI1U)DMtRRn}sF!Q5IHYt=2ZO$sdOn zO^Nu&q0W8{gDG9QojV&kFG7pV!{OMCefOq?iDZG|!!tc|b&x(F!;UM^YQ*e;)?iRb z^|hT+rq~DQ)*g*&o((Ox-9?~ zqQDe6*d{P{MWDxci_X5tq}I+D^8|;xqqHI*LbTUWFi)f* zUn{FEX0TLu%2RQH65-u2M%S^ChToN;9pp?L#7PDGqROJH6pm{$FaBh+HV> z8M$$^GCgA!6*&U$LlTUrzeokXtS%XUbn1rmbkt!PVOaAtxQm6INa`)C5M|_ zL~DM7P!;0?H3>&!5~;A0dMVmg3>|yMT;1W*+OCRYrI$>LVNW!z^{98|o+Vxlj*EG^u3TFL3ZL(;ywqvG-8ckD&iORVfL>uNK1cO!fSxb4^K4 z>ssBGG!#k=1@{fn^d4c`Xako_G?Nvh0$a5h?8fCKRK*Y-*U?qXAb>Yd_xKXY8Ezh# zTbWQ4u0nKF3Nny3jZ_Bi6358{upBh*95FcOGEZnwgXsWBafm@yPr?&J>!`ApR&FBM z>Xwm{I^TQI?8Zs@&^%{)3TNGv$PSRW)ajtaqkOJ#4%-b940-Z!WFgFKofZ$VL1BEV z<$T#|O-P+hdtTY5tQZPX&7%(5S&Y`kEzMpy>@X02$cURdBgywEF?ynu3Lh!sTzewE z0KnAR$+eSm<}@+{oUQ+J-e#=oEDAC7{6i#oT zXf)e_@oKzJA%9izH_x5vqp!$#B>jst(={%kaj60ZlM(h?gm-*+47Dwz^i}*r>0C0m zlbXPAziam?b4|OFpuJt=9(3n>GPLnxc2A#n?Z#~S=F{H$8RLEa!5nkmALe!3=XqSE3{-xg zu18F45k}{XB&dBR80MT(-k)k1kCMmf2oJ6@?jrockMu28_1dSn8biewX+*O6t2Y24 z?XYr*Tlznk%VwsE9_2DLJ?cIk0aw+$85fOqR?E1qn`Otg0cd_no-!vi;Lg!>t>Qow zP$z^5nXxki6e|?^k{Xw)^Y-;lQQ^35|7JJ^SUd>uT?qFLvLk43BE0pffk`yTL;kbS z5sk#4$BWuSN{eDyrX$%5I-5HFke)t`cycw0QJy58qaKfy<^~Wi@bZ~N7Go%r30$E} z06>?*niy5;E4stLc`yw-?!!*e8C9aJb=i8zu>}*F;Tv`mB*2MWSO^=mdZlBfI1fKo zV60`vGfTGNR*H3|hGl!rZQC;O4+Rhs>*6Wgz7I&CNJDe&T<_HG5-QvOlqCzIll4JJ^KY#TgaAyQWN=@u$tBg zYX(Agb9dW+-;a3-oz-tMwGm3_gU7QE<%FL_27DEM@sre4yyH zQ*!KXZ2Bei0Pyi=E+{}J;$PAr@J!Bmk4P@Kd9P0&8^&u6R3cqjxAF;LQ^5&+s%3vS zy*5_3et0>k=ORcWhu4JBy>ZhRq*l#V5z_9Y__N@v`rHQM3x@B1(Jlilt_%EebMK5D zAQ*bRuQ}dn*OE4cBM<^ZV3Ww*^DYQH3%%rORxDxpCv)j0ugq;lSX0|7}egUvJ1W z@@hu{PY(@qKgM0rjEtC2ZQk`-_}ezsghgh>tqo&H@@_Y}zqaox4KA2oXfH7rFM2z+~7=YxOQJMa1*vhIa{8GBmN}Wln3qR>Gg~mpr z(7JmAIsFs9&qVbg;8tY>It-Wr<cq69P9} z5(CwkS_-ZB!UblE6A@AttD>Z^A~A#8dFADgT2@V4@%~Wg&v)j<7zVpT-H>YD^0726 z47#}#CIPb1eO)Y-=8YDJTd4oQ5y%vTOy4S1i?moObgu7OOkAHE{pcae)c;v3V+)8P zGB3%;#ON=&3W17H;YpWSPx30>qRi&XD!KxUA+-*^+5a~j0n2*4!@W`eKRANv|BoXM zGdMAcLTiAZ;m<)TWJ2>#@;|#a-ou*5-3a)bZo#x=2aU1dzxugRHX_4D$jji-MOHO` z^LcviNGj6?-y3B?fX3^Ya?VMmgyX1-3xoQ#AFdO8%-fPn*#ou?ex{it+N$}}jdm^0e& z*mV@FfA;O0;#M-ENDEavf#Tt02wnfs0~W2RCK_6*`SzQvZ|-?P089>SNz+`u$eu^a z-^o22F#n>Kp~z{!nKvIZg7;BT>%q(NAu_-N9AMMu>=7I=CDjx4yi8|^rXix2A^nyn z;6lE4OmdDpKtS4wKeuo=; z#0IajgiAzG!+XB=U>40AB)=S&403<~s`PRtzF38gj6uzKqEuRuzd-WBVLEkJA62mKd_Wg* z&Cg%Zn0bFSJp4YP%jz>q7)mLe z(>x|+e-INMk@;>qJz3qBTz=yHQ;SKIQOEi z)&p!YOqz0C-A!uwLsS6w%Q(lRg$#WCt296Z%ze}Mm7TM%$PGCOD#Mcv5D5m({AL+v zNz(>qlCIl`yMrm0VBJU8p(?%ejcd-=YIb3UJnji2ou>ZSqV7|h`Qy%D7I^yOJM~vs zMYQl2pJtV8%jx0ZK78a{>LbnLO#JIb&Vqxb58P5$lLX!Yi1nZ6?blyR5SO5?VDQ4Q zhd;m$;}=h=eir)Z|Kf;=4zQU7LofZ@2zUy)p6?GKSAusVD7LW1J+~duWT~m^>@kLU z>Z>^>mB67sS2PICvrsuwiZc$4gAMyU}}Z85r^9#p65IGiRoY4m=my zJSSiTF`lj?Fa-y$pu^d&K|=*$T36Yu2c2r=sG5ZzLI}D*+fH|ViDwqmetEh%e4gw` z6FFRX=|#HR6vYBmMFhLv2J@rpZY8*Sa=n6CCOn?9bj3uunF=Rd5YGFWYk>0c=VQ+5 zfzTTj-1HEXDHZ8uZeMb;l{jKR>e305?{FO14;?&XW^YR*&NAQB6>2ggX?~*VE~Sc3 z`t-*_Rk-dJ6u=@cvkzXs%m}fBN>rt$k~Kras9}QQ<&oF zFZ2GywGO9m$$SSo%~r9<9j4yC>- zbE6fzk@wHI^xF~UGzLfU%@2j^s)*EgS1c2lRs$^=lt2GDaN-(jlCH%UO2iI^35sTL zTaZ!0Ol-v%j*SJMcfk9M=e!W4i>Fi(jc+SUL{OrwGFCDh;d8;4NH+ONI15?rJ>c2oRcc3wbE|{|0-KDqPT;LW=T%V5{5Ch!uktoXQw)y3TCkT z^IArU@`FgCRyvUDRaA6{TmI-hS=wi5Dujn=TlkSz!6XAYk zWxd+~fzTOmN?@?AC_$=}|-} zYs9Qir5`df5<6I=?x~Em)+$MGR#TrVxeG*Am1rQxPZ#F{9k4SEmjCA2Gmg7*{~h6h zIwbvhi%h=`q9UA+{-E*fj3&QY#pgNl<|wLfiLgTEsQp$Hu4BeUU)Y`My6{ccLfK|X z68BkbmzmhCKS%cu6NX`_{^9~b${%F$&IUr4+m~3?D4LkBJ!U6oNdeJ{~)=t(jLRXN3mEnU|75(kbo6c;ePSqdaFaZSfL}*|y z)?`(%^f-TMxNO||vW36@{aseKMb6_%c?Xz& z>^atR_cbYpwgu2i+qTsg#5-z5DckLy5iX?bT6tR2sE1x=K~xuS1qNkr{eILA%h4ZL ze3tkMWby{48R;52?8fNG;REEF=Z&@{H%wuavujeP1X~`(?W^QbIklc6lNjtgB}+ZF zVT1p&PtY3uNYvIr+?5@Pq=5C|#m}`nYC@w4kB2@5i^hapSMdVpa=skMovhv6T26$p zMkO>(09HEJ0!PLmk<~3rxYJm)wn>~fsSB}{Zi9Y@+tNre!}b`M*`Dgds99qteqFRo zz&_ZpQKeYefLmxVy~QuuSgNBhX3{dyhb#9EnCR5lIC z1|#$*d3$ZVMAWts*=t&_6}Dj=y(2%pQv*N}rim~p%Vo}QtbO>2v;$bMsIYeJ+)GA* zNn{puWYT&BJZjKZLlDwl-%6k7Sov3(-i{^ZT+n_x;_od$C@am;ol9$_L{w~Hlw^g2 z-}?n?<=e^Zy?{2#^_8K<0a_7dHiO1E+ga;@t6(C>iciqM>KI4Qr6XdA5^A>4_hG=~eqW92m{S zA}xgEDfQ-Yah-5s)Fhaw7}V&skHnG!_N|iicF_?SdW6rUWY@5Uyw(tC@dz3WFxH@t zf>#O64V&S?ty1{l|0LD9gC(l(A{4c!sQb~`hPUD3WJpfckp41C5r)S?;Tg80t&H*F zCOM)KH(Xa*eX}@BA2JqLw7y=x5O;EEC;;{!XInaHHSrKMcN?}oA-n8s)hBS1nE3FmhlU~7#(&QlnMf=z`)MX;J4Y6`kID~^RyaVn;=yZHw(jnxrGaT1T1jpt4#3>viT9Fg@%ffKK zntDnuI=( zhCOG1x0JZU12(S1UzAizVR1kHizjB2woxGzQVT_cPBkT;QSVWWttb;hzxcQ;@2)Gb zyxnE}qy-KJ4_3B4JI_F(cLTMs;neGA=7aNYjPi2DU*5<)KHKD*hAQo~JBDI7@Z0sU zAtTrL6{tMOAWir?od)E4YDRRhz2c({mj>SD zbe%5(`dKd1SoyGtRIt&Id#>|=#M}~f1_p&(h^kwzX>?0&nDy454$a9!PLcD2pTuEE zku;dBv`2zKka>S5y@g)S+sE=+JK9&gi}^Y5S0x2I-A9jY54N{tOPc$yd#xkfsq#rnFx;JmQADvWpGbzwiJFXDh_tYLTsC3vn$1)0Rj_*?WSv0I*S&Q{IpQ*37ORa> zQ8u}f>u;fYjfS8)a(cOtRfuK~Kt;0nduyi07ArNnZ4YNj?HhM@lZUtX1zQz=essi? z7?HvGDyl|{daOW4&tePRL2?2U!v^;5#_rzkn3%bi_SnO{c#=O^L6^HBJ!n{4ob7^@#C z^qRHYfO+$@<5Zd`xWFH}Sl0{%249%~StGlH8*+d8*dEjt;v7DIkn*y7f#t5l{RoJ& z^=j@`GAe7$mPEts=T;#!_HHXDm^r3_9wszfXP%g)dHKvF2*8|g+Ybme^LAOYp|f31 z&*nOJUGJ)tEw(orSi|ld+nz<_`Zj_oBP#s zIQT0p?X|h&^YD$3gjQRaK2`E~cfFsSibH?^VcA{EqikA0k*mSz>?ARPXo`h&1~;h- z!mqkdZc6HgUpb}%1jt3G;)3^eYe6E3hspmw&AF58iFfbT+It>Gn0|$5hn(wVqOtuu z9SN6#FXLP$dXUkeKbT%H)1KE;!HAF#0|NxmCcC(FFe97d7>|^?Y~p_#saRjPeYbJn zQuV3lfUF^x*UE*yWlU{_f62M$7{9)-H`IZzU9>HO2}A0ZR6BqWB&+mEfuv zn!&v+FJ~%&Hud#hgQgG}>D6pksFp^pZVTKXmRp$gT+-18>*_|H^IK#e9f!RZ6xH&P zH4xxvgJ)>Iu&|PbsbTy`|HzDdI=W z_D41oY2v9HCVH16-Qw#!ObHJga{^OW^J6=`n21^>8&qK&0--o5YU22%wSa(T*^7BI zsbAt!SL(o{nMEyuWgRppYEAy$We;MM`|=ne5TL9lEbve$Ls(iax`boxWrfT*j4m-X z@m;Z~cXclv_0v`rA028(S5KrveM%v$R0aJiHs9*Qq|X6-|7ZDf>=)KCXz{zYH$i0z z0bhLZZQA7zpw3*m@g641$-{ZNyF`RN50a=juFSkg#R*z09zGnFds6_22nA*ql}SNx zAHHUPfuYauE#D$j&pP5#Zs$=`7|TLkuYoqB*Zw~S<+ek7&X5b(U@46*F0!L=gy9oB z#g4KjX8XQo?`EE-|i=envI)<^c%U7F1lbVlMTwU>3w zt=`c4VlN1Ei@ED|GE)%V)j{cvQrRVPvf;v}mGteu;tvM38d936FFZ9$dH3C`cF|=m=P_}w8nd~v+n4K70Vzb%$3Jz>qTfbe44)^R;A$9>_f@qkF)H#JCexRu z6nx5@4xG~wUt@h{85vc%bJpJfj3>^Z*5abfTPYu|(}h!?Hna{-B0!AMurN|&r}VY5 z|Cq_{P9Dehh*~^Y$cRktS~_LZHG@e<{~k-+^l~aq+))nr9WMi(PBt}l}B=2BGE8UlyI(F4PI zGOg9KfqI4==E%nPzKF&HP2QWF!;;d;LlTpO|0Rwrj49J4_9Se9ZFJA;`I`6h*#(bK zRUx)vGONEL`gSQyLlwk~ULK;KmHmrnB&0Bn+aWe}B%bvQo17^qgPp0iO^@bnOy90} zcxrf2sa@NiF}vvMzUzKaINF)s4h30%^<{;)y~dcO+SbBscjfT&43nuuF}K@xYUp^% zNX{O+ZEQ9k_}m(i8WrL;)9kAeAR#`^9l0IZJe3sw1gt#Me=>KWWlxa{uRI;J@^*~- zjA1U6GjuvO+Xr~K^Um8X?+c@QVwk&Or)6HX6!2#{#hspP-o#XLHx{rqhf)73dR%~e?{L%>oUvL$)RGs z6aYfU*N)+8jPX2n<^AnwziIU~m$yzyciG4j5uE8GgGj!5X|l<#Ex(^s84kUqW%w1< z03u+rW;^+oZT!A1mxb(-p@qYt0GaU!eB$kCbWZE^g7z|GGAI6|5alWvdf%}z^_I32 z)+HgJXAn7-#1<7?JakIeb@eZSWl^zsJms^zb?4$oB4)omzaM2s4EtAG$EGRWirfOA zjLJ zJDaUP`wyWdVr;^MOlfR98wCT2+B648i_PH}zFMgx09sx@^fFuKS3F<&xQZlKoGg;OWK~aiGMx~vd6&hb zY-KWfewef+QdzKomD$=Jxa|_HSBXmQhYI8Ms0Td{g|pr4akByzr(t}0_2yNx{gr6( zrB^hHtbeJw;_AYpU1f0Ji$b7#Opra#F+CG~Qu2eIp#kmaRiUL^hP-lQ>JQ_^bXJQo z`B@wGTYbmIYh&8bg|>2(5!P@si^ghH%u{3^=IniAr1`Ig1Y>N~B3bbWzo_7m*v1J3 z>BF?Oa)evc0MICcin2tohx@5?oA$Glj(sre0wSV7A6C>}+dQQZ|3QP)E9L8#PJ=`V& zQMiT-w7>5hqZ8quZR?fEUE9;1taaFZGG_H#<|KG3fNu2tnQ(Zl%u%c%Iou=p7&H(Uch+V21`7u2RZcU;L_w&^@7g&h)NYQ7E|Ad zs#U<4`_Cl?$N^?5hP->W-wg#{x=Sy)v#eS*5!8`QcQ`CmljVHz5Qu~?!w(&^7K*X+ zO18mvE24D$;LlJuveO*PG^XZI*lE(hKV-K&yB=m2`X_$xOVI`aHAv)t6vbicX9M*r zL^eK+F~Tb_SAr{ASd_-`wOrr)LLx96;d{V25DgRo-8gTfxWP$rcnFCM_>@W6UN~_v zCa3pH#B&tCjJaA`)2a$`QqQ2*`wPeI8+_F{$_W0!{J=9RQIXdu)cdRcjfan(W)}Td z^lCGMo|O#W91+=XhZ=G<#0l5()rpZ`bE=of3jUo@r`6 zBq8e#JKPyeiqL~Z;Mrf5`P%UL0c!@tU zDqbU};rDP8En@kN6!1pyX6~C&0IBzYm3n(dOvokw0!N>%oQ~x#GWW1;;YHpUTr;rb z0C-KCVroeoc2K{!b+Z}U39~iLmOfKG(^_1U9RNzAhc2K!3Z$J>kp)=~L*VLfaigmQ zN5r*sTGw~jBy{x{u23s}_%v90tlHPw_gvNyvUygexh2Ho9_^1SDv0N9)v z!jIe3#2J?%$${%rlTVD6R(nOVV zqsY4iuMhF}G7fUf=lsoJ74hez-~q}#g12Wz`d=b{orw^F#OfQ9k5-G#snm+FH((qq z<5xy>n&VL-0#aOv8N=uVPbv)UyMEy5QkGhRFvH4yYNFuz54+Ho zH%f3e2eCBs2iyJgj8=Rf^KkDWf}WppfU|G z^37nkQ@puguxe*q@s*;X6r=OHz4kW??0*-p;nN=tr!|szx10Uu_7g<5vrrToT+FkY zxDl#;s6EpncJa3gXu_h_n;_ForwRPAeDqv1@sAliNaS(G>j{)1eDH@by)L7;xe$5N z+mhk1r=84sgr^3>5@0qzmRCauHk2|w@o(~N7v7xt!p7~tPI>8X(AxRA@&__l276!t z0{95{7-ug^wwY~FBx*r-q8JQsJFCoX8gsVQcg!?ISYbmX?&~uG2XLk}%5-O?0nU?% zI9zWjU#bREQH*6aHv-dH@RyJI1_I^W{ZvX!vT_di+y>DBaC;R38DHx6a`ozPPkcOd z9)X2kWwcnVh2J~rD&#mXF@qOM-C@0q@(P6lABq{PfN*>w+;@?(oKQ5F!5dw3m2-yv zfGAf#wjV};gPrtQeZoJe3QaEcA22pRm1e&d(iBX{V?7ahn0ErQIA89utpYE3V@zaw zDq@veF3X>TVQgq>1_KHtv|7hvE)vnBHvA`-_0+VVC{^Of7k3W6pNt8rQ*yCIqCrZT zl~M$fN9XbH5?1;!*d=E{Gp|y9GVQ%Dm{W)~$j~UQ!u$u2h^eaw(@>C_PSwV0JF*t@ z|3t0u)Wx%vdOB5QDBlP}qQmjJNRA8H%S*FaiF=+ro*hNd{$0XeD=|t)+V6|m`rm*A z!uYxZ|96J}0TT58e<1PN)3x0lI~g|P8YoC4eE$dcc|+Rs?jO2f^qAdu&&-kzms*aG zVe?*dHNg_uz{=s}Cn&#F#PIC2g zWLOdepmf$v1w~`>vW=PlkgbHy0l5K_i31T4F5<6ZxBt4QZz#387R_LYAgDYibQ z=}{;)NxE}GsVUpH5%q3-Wjspr1(gOXhTIOjn3rrc3d57avb3wi1NrC0O6_DKYNLV^ zxZ(dq_4e+{YE9En;~-jBF+)fz-<1&z(EokX`S_AQ@H_5e6={k{NE=b0KLqw~O;T~< zloqIrZJ7LAEX1AuEmCMNl+u3P77$3!zx_>~6Nx=+Jinw=e%sN>R~xWT2?A&wtTSo_ z>~e4ND|@9!*qr|MELOXx&id9mmSbk9X%rQX$8TnQW|_H&kIh8O+eK2Uvxt9Ze?N^+ z*1Y2difjP^Dj)h-b|23AAAWxy5kW(?hRjYn4Xx$SD6&QP%l1aGwHZ;6M&S4_`xer= zS!%Rn6}Z{F)mlSgx1zFZYI?E`j0wTt@_1mOXu6Z|D%( z#Pgm#=l5| z;fD<^Nno_mdk8s>M;ogrHy_7v6{EIbzJ-0u+?B24@Y&RIx7^+zS94*SB(n=wO%Nbm zTxbAHsq5wx&O>ujhswMZg)g({42tx@K=yR}@^(eaN^T>|Z^&A_8Nq#yT_ zLq^Qk(h>4L&`1CX069^l4^frXyy#+WJV1i?4Go`9tmSOT&%$l1c0zH#&xXDmuZN5^ z14WYFi2mX@>b!VTE7MaV%>eCtFe_OwJ_w*D;r5WK-GiTrODfYAdaeiTNY!p!BwAvi zKZSXfa;duOVE5_Fdk?N`LR0#kCDsv7tzlm+~olcR2>BYEPENmadOAVRx`r+ zp_G;4CK44^rNNNL$$mC~*=`+shdncHwM*l zeN~V;wrXx6EqGR`nE;L(Sm7vluP?vInufFbmRyQzn1^Xe^Rp%c-m`P*DB7_4^>2CT|6z!z9?-0ZJzuucKDvO!*(x%o@abn#=D3n1KQjY<{V$N1?f_fUBQY=8qt`3OFvBMKrjYZ; zYE__{O(9fdr=pr~^Wvseg&I$JPc2Q}O>CjMjJlREHI&u=DK~=boMXZ2 z^qCH5e*(`hfFm7EKF0SQ)j9vSkn2?h*YO`3xr8T${r$c9Urs1LsqsqS8OtN71I%RN zYRb|Tb~}<8-@3*N!xYr`pZm9!z^EX9Cq zwsx`*0&&=ui6t2&@MOWqfF7ahvcOZa6D^_koP4nW)Uv$CfyM#2Bb0SA9}JVYdG&@>0*Ru?<$N%k0lH>PM`_u{T)z+ zbg7(*6|FU@dN7hOww^vhmqBxaI{l7-ytyaBNEios0uBToXY8~fi3r;lcAwcyTyN54 zUAXTUkq?%v_`k~WRzT8~UUy68E zW!NIpFn2PJ(M7e#_mH$?dtEciueOol3E6zw{xw{+53;1zqPpb6w<&ue$8vBNgSH*D@ zFgF?0`g0dEYZ>?UIaF289fEJo-_B_=i?-ZoNN2;!w2ynFfqfqVQ5Kq{PS=<7gjmD{ z;Ux_FbP-gRSv?Vs4B~U0B=XIgR8~sPI+~`KivLoMloshQeoW)9(ZmCi%)Y4wObPo{ zf*c0($n0xKb`NNqxqM7jtedRjjNTQ~8H>gYMKaZF)Hl?|L0<;I4)oRi9pn}d3;K|E zwUdPwWp=nEiuc;ZM?3E|w@g-Pk`IH1Z?SvlXLeR0+8e!><3=l-7rss?w)3xVRS$L( zVde3O*-_r=YvubHWevntgrnjARwF8yf|n>0)|^zL%y;-Rnb2hNlTkjI(_e>!J&e{k z7dw&_)I_Vw zHu$Rk`u60PjpnQU*ud2{>*u6PRpDl}pOie26HT{|{mxOSF$bcRC{IyQrwg&;^-6q_ zY$U;V>iHmZ;>Xagn|9t0Kb$zfdn@IW-w{%Z*X-y^#aGOQU~BRBZ zz7DHRnoee-Ar>$E3cm2u?2g;$C+ zkG1$pC;w5~{Btq>CROZe%((Sgg`n8pI1wIZnPK{+ zOR_+w)>sGm}PJ$z3eiC>@#|0@MD@IsT z;hY3hJ+6~Jy{RuTUxLh@py&2p-L3~zOZ4JCyoK}|i>{eTZ-M`qggG#gLuc*irr(yX zQS9O^DwekY<4J4~$7KH0rF{L!?_+Msg80dH?KGV9XN{l%EvPSn-)&nw`!Vr6q$rn8 z4lILJqWJAZUbd)mRjaBByYV4n0UwKi3qc8sMCnp&GC=1@B?nH*F*G$QjY1$j5=jjz zX4!@slWYRR8S2SX`i*~b!fLvbvRG=fA#q{|qGzW_MGKC177qgfhSi7njx_iRZFMi;)%ii1`KQB^dTlXZ%{|DBnx^_e>CSsz*e`*O@>|1ujOmL!g zW^<30@#p%cqs~Sp6><<})sTr;j3bqn!`w~&SiRX(-De% z{C}}J$B^xellV0JD-}1NOqO$VCP@aci5wf$swNUBLP@(AZ>{yxsb1%47LoqX?dWH8 zc^{_yHmbe#Zg{y^d{Ms{`hRUOCBoM~d&sQ|H7tW63!9gge%UA*Ql4LUGvM-uIP`;~+?KDOHA`Ug=xe^yHAO zup_T>I&J!F@Z^`r16vs~bj*KqX`E9$O3ew8DgcKH9Li)rsaKm_HO!2u6CApfT?Msm zIP|=4CGuq(1o)@DmU6<&Aq#CmA{Q<(9mb^x+TFemT*~!9RTIJJyLl>POgyrl) z2ypWfx^_nOsLflSef>nloVt$l)Lbp$SN5{&>*gP+6MrV*$msd|b?F{#c9*3&7#x^g z1uY#G9W&R0S!Wjmc)TCq#?Aw&_~Mp^ma5~eC2X-|^1i5Ee33_NZXjc){R@bw$uvQX!NkD3H{GFo>W` z@2t=aZ}iR6esMpLIAZ(PL=HiCBcN+?r)2f8+Lg~wmIN8{eIq2&9Fr|zu0Fs1bmH~4 zt|b@hh<*Sgw|U04+P$yZIPS{ZZSjosC>(p)_X)I>CTee=PyNnav~@TMw!_$1oxzMx z&hJMwIz7*jw%BF!T8-4xmsn&(RUAZ>jjKI@5-=T_UTJ~J;YPLhfS=^wGCg)!(*o;N z8s>FS$c3c9_EK_W1&qZa*f|TE`jd#RZvewQI(IVs(1|QN2xrVzgC3GDk4f4Z2buJ_ z=$HZHHv*=}4#6ud**7QV1f-#&!%mk*{%*B6s{sXe*(xo1kpmIZQFYl{H7CODmxt>K zpVp?>C&XsSm&8~}5-D>o+|7)d^*gNdVCw@7J_4?MTRdE&r(}KFn>Tam(1O}VUT!Q{ z>|EakIxUS12ifdzo2BFUgt)nxvH%4ueu@E^vSONm<#YLt7ln<|@0Yw|Aqi2!nQO;bVv&28;Cie9;vEJdfXJT#?;Fldw`A(J+%5(NR#;CsYJ zmR2I$`gTw%oWBOZ6*Z17)}b(bN`HCiNk9E!@EWZdJ@l7eBBP@@02`L!X)^)V69v4?D){KlRt$`;bDrI+i~TAnItc1P#&lhmoPDSy57zGE=& zh?Org>4M>!g*)>mPK&Z(dnr=x0GyD1aDmsw0aEC1$)12dcG?88Q#rR0vvEAV_Iufh z1dYmv&IsD1f3LHZr5ddYno z?5Uk8;``?ie2m5#PyxP3Y*~G8nusW_aOlW<+*lmO(eXSdnLbxLscvZp_CI)p0mrr2 zpxg2Hvh2!Z%`{)UzHca08XeAjj_mMVdg8JA0=WFTByA0UTUkba#n6Sg>}mWq(zo2H zF}Eq^EJ|*8_-{M{DP0Y^YxU%Rc*K8^M||r(^x_@qnl$k!%7=S?;lcdpGDemaR-k@t z@9y^p`4ZNx(v2iC>NnuNRmcex*=cC`wJn6mK95&MXHuZH`a1|PDyTsSzh20oi%G~M zv{O$a%au${ojsi1E zRMrzcPhQfM6z{M7AO;{EX9Ii)6=Qv(3<_Xeb{+Jkvj4Ov;3>2p4t*{8FsJ8-`Gq#N zkqHk*OUwE^alD@*NBHNSqHa}Z2Of2Uj90ED&5&|#*I(~Chz0}Z2kJ_Vnqr7!*X*=E zG*flR*ChXBHn9uHkc5?QrG(wH+OGc+CHTECw^#eqpF(jtq)VsTB9SM&Wh0u8Dhw~B zAz{qH>w4+aVgS9imb)1ZzM=)j@J4@<^arRHM}RnqCNlg&Shnfx%o5-CFdYyD>Dg1p}-K%5UZuJFPTEAbbg-(0f;CaX6V!zdGMdm<>SSM#sfWI zHp>*YQJbcE*L_e2g!v%^N#FKtlUeWqsAQnbG#7SMhgbJxxRR9A&m&k;00u-D-`OlNr$!9=sx--y2mC%%Tum?VK-t6dPGPvd{5sLznYXxu#b zF!=hn{cOLaoX3B)Lq97_46X@Fu2_cH!Sy=Az%`UNX3g+VCotr?Nb)jeXiPeTaU4a+ zn1{pXrU-VqF)43=%drFY_%u7b3}5fTnkRRiuINt>tvP_$lN{2F8m%rX)EjSun|%V- zpTOooOB|&B?E|8Y(&kK9lQIQDX^rHk0vQAnHN3Dlm(%*!c{oVv*%@#ObajIOqf3A+ zL&6R=k*a^6m+waJ?UaV~=hTIW$Ijg6*8X=`*NZ{O3n|If()maNLHXVd!%pTT0|H>F z^f}ic(MQBm{SL!#%cEGE8K3DBT-*j#JUMkopCm%yT`19`R4BrT%(TlUgO_r?KZSq4oGGz95NUgUpy#MjQx@GNI&c#cr+ zNsjVoR8dp*QA#a4>Po*l?Br&m(EaotR?fE+am3$!G$Y;+@zssEd90(s^#koxAI+G? zhpoG*wa((jq|~}ErOlVbIJ|0w{B^;iS~jkSD!o|oxvj9GPNK#~KaC2sczQNif8bQ+ zXrmWp`r|7eq7v88XtVJ?HYsw!w3qd9y~vy1@D$T=gKRtb%3ucIcs zQ0v>(oKNLc%-PJjn(E@|9leXQ%(373MiblgXTGdmNKIx~`T3+|d-_!$KL2HOJ+L$FB&&xHKn9}q&4XO}|f1C}R7ZaoInGpGW#5*NRBOrtIxf`SC zPWMZW&J%ojQ)4UJvz!lysnYOLhKa?Ur>&Q5 zy1PkfYISk6SSaL0LSKieUq#j0^+{3|r>la)mCBo{Oo4yf6&THJL|U8$ie{HOC5ZV^ zs%gvxd%|wHc_DR;&nAJVDf{H!#nrsBnl}&Ups9X0n|sb)bZLKqo5?q>X3;o2Md!uf zS=*_L64)YshWl`7nvv$d;jwb;IXP~(lI&((HF3JaiFlg=$QgGZLJxnTTSUe#wo zaf|{c`GKTdX8sRRU%cs{xmvx-L8NjC$OS&1Jdb$|1*7tEkf*_7+yqerB?_tECJ&;#d5Zah)P0Cy&XV`Vgt!B*d(ISNW3-tNopS-YXr~D*G?O zWrX-fvIEmtK$RP&P3%;MMbz<~hwc6b(d~4{rF1?SjL^SOi>%a?KPGpV_o5=flBvvY z(9ktokDZJ%VZl=q62}Vb+4=`3Tb8fpMtqNoiA4|_9wvjr6g-*;w%$jLWNbgZvragF zv-c{|TEpw#V<(e6zNL9uuG-%0P_cBeT)YR3xD}SEm7CN&ZY+@6x)7DKgksbDtQxwv z?!oED%~Mu@9C;4QItx8u+=gJ4=QNiaJfb z>(?T)i97-ypMp`IB+HIh9gC|xQ|ShU&gYYUC5B<`llBWaMqvmx&0JI1rCK6(R3ur0 z%39re2Vm{FFizk1PuJ{(2phNPQm%XOh^(IzO4VdSgMs*>Q1C{v#Q%#VP%otikF$jed|~z!7*$n8*ubZu z=NZA&UcOgsD^Xh| zZfqWdTmm!OTn{}y;A`BA_rhFa5kB3PSThtSc!SfQ$=DWE6uDL{E{2`ow;zmK(EgP8 zNa~umO6$X0!e1${!@xui7My5t(XOl^IMk!k4zAi8xwY&q|IacFbul$EK<^t`0ZqD7 z4NF zt}QxHB+kRLu@?}wkx=-E@bBIY2^$v?Zxk#pI!@>qID3`#A=#V`PE6uXM|(WYXyaG_ z3JkjNLY`6~ls;knPZQ{_NWqfdH;asm4V=pg<~gbI6|)ij#^QPhW2YNobS<>s!WdKG!sdY8+O7`-0>R);V9Ky z6soGoNo2dXny^se#7WO+%d`v~t=vfQ{!6~2FyG7EWC(DY<}WGMtV;vM_>Jaq`B~094W_4WatDGIJF{`^=LxI>Q`X ztj}U;Nr^!8u8Hb&Q<0&v6~hjE$aaV+maM8!{KQZ@#aI0f5wql!!Vs$GMYrOQiuw=D zYD}bVCt(}*q#=CemDPRaKQ;JDV&xvx@Wq@GFy_{Kkk{DL-%{Y=d_+?6eK*Mt$i8N| z5}mPxKp?z;Cm1d{PK0-;d1+!iUL*TuxprWLny|S)i5Tq0A&uips3fjh!x_7oERH9w)X+t^-mOG- zLqPo24#Vh$VyQvOPnj@0AsGc2rNXO1#y9#hZt_7Ma_kY|^2M#pVVANhgMP{Vx;o6s_a6Tg>?tjG9v z0CfHco#9+$xq8K#Wq*@g0AF{)@*{z%VLZ*Gj3kGsO)K zreQ9kbdB-oe-W*1k+*=Qd@k-QvemvPHN+{a3oLVRL_qnKE{!-TQASvWGrK`dFQX@% zc)5@X(n;ocielEofU*VRVG{Ld^NOk?_z`OIuJatL>at2H=NavBI&LU7Qju#y&`QSI zJqzPs${!`9s>x26>X){$jy9*$Eu2B=C~?FpmGJ7~5TwPsMvN*ISqHe8r^*bq)Q}Lo zT0!6)`#5uJq@*ilV#h!zcz_~(KzQjR0d9sF>Lzi=3@T=J8(r*r4 zh^av!rm5!F6|2pVvbD>n;p-%x3YT`ee`Y1@7RO2@tYzfJQ}DFJpO+35Qvo^71&y(E zV)#v7Aq9stTT(ff9Y@x?Eggh%SkUAVzTb=l+lD?A?nGGXUlurGfAE;#=yxY_beC)= zYKHnt)hcs9f+XRO%vd|v-#(n-yLez=|TxM3x(baH;-dRCAi6b7q zG&mIC4#SCN?TBlo26DStsEfiSM7JNS5afS#!v9ouLz?CvzR)v+5tl{M%AgFP^~aRd zpvF)zV6?a3W2*FhB;K|&AJ+s^y8*OvQ8Xt6wd;8EdqEu4BD%T5zltqP`AO`kUXrQC1>3h8Zy6dQyD$7N^Ztx~nVfpRd1w z$uAB5A4tM6fM^uoA3LJ! ze0Ifj#5hxmqx%f#a-y7;&~vaGd338se=&COPe(J7Ki>3%P*8|qW;q!Q$@TZYiHiyG zHQYAu#}_&7{+UnJrvhGIc)aRAr)Z^Z5sh|=rj1y|UM4cobK33rS)gUj$#y2hdP=?s zvW-UlNY&v;0Ke9~wt?8IJ0F>#hMnW{XmeOsi*xcqQArY|BA^u0drDK(q$6Q15ol1z z?v6LI9iE5Cy7bgCIm-l>qPKt;nYIXkVScq#R~xg?HxJuIAm$_G-3Yyb`#It3Np(8{ zaErS4(gKn4NJMi$_tT39LYbW<2hKBwC!6WSdug4aecwVvy4GR-qhm`bCCF%y%jJQ8 zM1Rt_kEOZvZVGyf`o=E>E3u6;^E@Tx1Kax`(TQ+Yfy52f!2qnO{<&BkrQ<0)Hr{f- z4)b#)Oy?>a2!(IwElQ=D${))fBgazde9*k3cFr5s21D1ZmTEQlIj z`Jk(eA=+OGx*e5?VtzFkeHI<_Z}Ua6c_oJz(pqHRuRnHWB-ynBF*o4h+EP9IDm8zw zR_m0J={)G|uU`Py=|1ohc9i`o#O|QgrD^+Ihxuo!2pZ~W0Eif@QWCV_03So7Y&~us zI^C=J7ln-Ql5fOFKZG(QJ;7Y>cI%*&gbv}ca65@T^zfi5YVBZd^M1Q2{$4WpARl9A z%`y6<$B(M2!G`bjX`Sx}#3L~vdQ&hlwAxvvE6iAcp5;O&&Jl%tCO#5)mOH zMb;kT5AzSN#T7~J(p>-!AuIBm&eDB=Wv9}`F#vZi39pytU+Grk>V=@AQldomj8;CI zUAU!)$dRu-!_6`-!54li=>57ywO6m=vhSC}+QDmz z4BH;?0Rj^2tRjg@v<7I8l-U$|FG}6Ndza|@_7ls3U%q8Rzr)ENfMX~E7h=GbN8bNN z5(}LGlkKG6#VH;+r|HIp!7+NZ6iNvC#;o)y@8o0Bb;<0gBz|edJZ>=~C6^@#dO3yg z+2dH6WOg0n;)pQH`+RSSE*hpLYX3^WyUN@_*1LnhZDwhW9|U8!(f2QiZ8AGIz&qtz zk6Geg)-yN?u~ePbf%Kc0zI6oGF#_`?I`~#iSU99DK~m1YV4Nm|1`y3mlH+BH6FqFQ z^NhTq2|3T%;*}|t>=bYgOq1#>gtljTj^ly?r^sZR_bFmK;Vn|W>CY#Yz-`?m<^z)o ziXyeYODvDM92Tl*!NcgZFx)Q&+2)zeg;?EZ8g+C8wiNFH>)9xY0nOt7nSZ1GYXK_o zhE>8-JS1#63Y)P`(PpIls2RzsOX6Twjx^g@SSPy&{+X2Pq)t9tVwD9Nz%UfAE5*q# zc$n3+{IGb!z&TI3vuATdq}s}1?u&E#5ZL`0C{J67gWa&zt*KmvT^B%CIr>Ks3@aPs zW&cEn5S>BZbLh$QGpBRz?YE7j;U|CfXUs`Dh^T|7yYKp6LwZv^mgSUIm&_ z!=GQCCHRx_KFc!}*_273M=vI|u*cdKO(?k2ZDncg@zQqbSprr#NEL}h7=FZt=^Ryo z(Rk|I?u9tUJIGvIP(|;N$Q;=|`y)GZ-8IK%$DV3}#ZF%4`72=|zo&kb{S*V1WLl3l zX!cm|hWOKUcWAn%Ge=w-+uua3DzT`=Jg*aIR&wuA4WW_{!!ji+6Mjc{s2w^~FRfkC zawr&^sHRjX_zlZL>t&o}rID1rQZ!)@2Y=Pbp3>=&9_&5pS^sx;f`KF}ay|H*W{1_S z|Wz{f3zmJ%j*+10*sW3VisYojz3omS~g% zXA*t8*il)G=TjyQ2|Tt;%#n+8(O9vpk06q{_68x-A(ve9Y@Ok(FJd}t%2*n$L(vU# zz`1rl$>sy)F+npk)rVJVp8RyWkIZs7I#EEDcc%wuII!;33oV$&|VQumnlICM=TU*PMZtz zpNMo9S)B}2pUKs*HTeLEDRi3JX^^SLdM!W{^#+6!$9u@e7>NQQZc%e5nfp2et6%v# zrSWcmp(P1;u)@JlL%9piPxyax%mtqEedF_w{Is1=gQ?~rr|{|)Q2YmyAClvJR#kV9%2 z5fh;P=y+cJmhhvmd(Ic|^E5*ZX=C&tALc&B46EGZ@nO<40+V)C;~gn@Pim^(qen=? zd)~@(=kOpWWYaM?G1@-f`D}A-@ZK3dA6pF5uy}ZysHY7vDC(cpjE+aX;fqCE&cLa- zez|4_h%0irPbE;2(cv5P?pnxKLG0haRwHH7PbZ!2P$YNSb&I*l+5cn`PV;=IEL5(F zmHS@zo8t)@d|}dX+wg-iASOGv+|i!*9$NtZuf^whf=piNs_Fs*N`eK?is6gC34zeX zt!n>5gC);^a+exBT*2z6%c3q)ENFJl&|yAFR8NQmYP#+qG*xMI^Vmpn85+Yg!T;0+ zHRl7>pN6~^_{cXy(DJG^%L#y>Tsn^wdVt4#CRfM1VIC6$qB~WdRm70I1v1+f1j@M| z!W$^DG5`SY`x}Z9KC98k+{~a}C4^?cR>YdbwO5j0ds6%qtHNf>H(Wk9uDvnO1BPaZ zQQ`|aBPT~1t9iVWK|*y(2*v_Th`AfOZrwR8W5%A3E@@I81!F7%z^Y~FdkVQzQ6W-J z4E%!;K7>0_I*r51t{&$k;lhzgdcbDgDZ4jPT+#f@qi&a`z|^@WQnc2}3+j!|F_G_{3aCd2}bDTLDC_YQ1z> zXv9~XJ z)B?1vxm1l{3@KU8P{7e-EkR{_wV_l^I;eCfp zRH_2LInQ#_JKA?0C-<%1S^rINL!-x&6jG0+G{*`e{W1g-k*bp@CY!Xewouf{FG&;Gqv0Za7Z+eG zc;Q6C-{R@NHi3atZwZPPGR_xF!$gs|CX`edI(7uyID8%sUWq2>@0j5 z{ujkLviz5RGZ+Hq=o$qI^5dL9Zu6{A8J@&?Em!edKI|3@&=fm2@HI%5zj@3i8ZVO< zA_(FkZ}M!hS2!?V%hSLEIG$kdp~wrm(dhDOGj*JSWJYS^ei6g5|BNM^nC~Po8bkR7 zyxlnKYk(O542Oy5J(ObhDo_5x+D=F|hb*Kbh+i?<3WsF612>GJ(ljM1Y)r&#NY12jo5iikIg=KdOI1wmAnes7%^0 z%VnscC4tww<^Xq7URaRL;@K!lISKYmG!EiM74KvuIRRFM=3GYzbjK4`KrBKON6G2( z##1?tMbi+ZFjork1@VyaZ;+wJpsJq6VudC|fzhgziQeHJ9K6kEOJDTJ++ zO$j^PpugE&T#yJqV_CS?PbLbog!Tm*_zjT&`>yGkYzS&)nCv+~lo3fv#4c{98;s$B zf(~detTW?MIDC(7@3Xi?R);Q$k}jPEfEJM8Nug0v>WZfop$36L`nsA?{wk-+C+ad6 zRvK|R4^B8&E(vFZX;esrqhNNv?$Sf+lBJ0wk z3YIF&;kc*U@HyV6g>vC~33{V?;z1dv(AfnjSOOpPl=h&utVhM-x-2HnWTIO(N@)lw zr|Q#T>Y$&CMX+v00ZMgVtte$_GJRIS0fkacf<*jsB4L|$s9#P2oG!fI|W%1xR-u7WQgu*ry;KR@%O& zR9XoT8@Rba5oMGaLTSdo3q7WwS+dx&fF zQ{(#H4RhjZhD&vs?wXm;W2k{)k>Cl~eOs5_KD{xXLUXm{l@VHniGiN)kax3&Bfj}8 zjhH$mWW~0!g_Q}T!UFQ9UEz(oy)WD*zWWdJPc_T(wvV}@ zd;9Ak^Tr9g?!YBPYp9OOiXO|uNubxb?nb%L9T`1XA#0>D2$d6DzHf_+fP+u4cBJBD z;Jb2N{a&oEZK^p`m#lZ;;tTW)YHG7HyC+j5axR$}t_DlNgk8Qvwd3k3N>ST zzN+ozHV+BbmX+e;?6bhN)^N>0gxI}-5b((YpQ9=LHm3BcWh}rc9=7rdM^x~#NO&hK zorMb#?wd?+_#U8`cyLXPx5HjEugKdGH{Ui#{$m+TjGd)m`O0{;hsaYMTe}$MH>xNn z68NA*rO}08u_;pL9K>yPyt_0n5!pEn`eaK;0}$N?oT;(Qb4o_zoKrrZdazi|T>RUa zw@8nM2}bDp+eEtw(&K7wP8`#G))WUq1#7K!a9@3C=-73^9Tr|%x{2t6}h~Q((vS_TyHKe$h3_7*n)SQWWM3=@4(3=EJMO|+LB;99>Ha8 zX%`mjmxiG9S%s02bpiboC^M+?GNgU=AMJy;z69dzXgQg;dmjyq%YuL+z#wJIL4b~7 ze#9+7l)O_NVkQB~*D)Z;698Uw0k2%E5h>ogPObhW^cl|w^pjXe!S=EA`UKwMzwIS5 znlmEpoTj9~LkVlh)BnvRemxQmb|`W2!J3gQ7T%>z>(q}`%lg`U&DDcuiOL>oHqv6Q zX+aAKsy;B5bHpGMl9b4Q{)tf%UZaULo=>@{%E+*XB2nn-z=_?D+hCuGnjksjNdahg zR*KdUrNz>g-I;ZH`DiQZ%s&rrMqa4|r_f>1?6@gKkSEaaRO_qr-4?|#u0LYSMik6v zfayR;pnc1A2(K@ZMAPS-it{h8`e7_GTyGOud`^87g4q!?GoSD=D;%Evr9L*m$e{yr z`WyVX-yskVuO>ik@1&Of%z)Y>{&zQ}#%m+V2jJJY2>lgBTe_1+#+#Sdxy2xxH8oqt z%@huEz=mv=`9fTEe`)`%Y-%!I$cQnH z*6ranX*%5;i<@EDaWIjN`q`4}1Ps(Eb?UlN%7rT#!K@i5yGc%cvk^bh7Oyn8>vO`j zo2=-&%=#zHEXfKVMqn(QyMb}MZqgCAsOEb(0f$;-=ER!OCJf_EwG=+g!gqjyIwMNV z?PW3wxG7>#J|nM-R#>HVJ#*D2RX53o&gbN_cBpjY@JYssTzLWKYF|~qC9cVEDma32 z?p$TJw@%d9?XPtP%NXOT?E`AmmGW#hhjv=~JZ-RcPO+qjRQF?bZ86KH*(4h&Z!$^E z*vUs_R+y1z^*48fp^vI3@}z;@F8_MvR;<2!xbd?L3B|7b-&rqeE<91vhxZH;{PdWf z8G?F&&57)jqA!ClbWICbDoYNqi;Np$FhY*8#{D)qjdNaM+99qlqN$WCWaX6N0E&uHj6n^El^x zCj@fN&~_R0&|PlaaD*IwSU#jN#F>KF%L%J-1_p_(&(VqU#P?WD`R^KZ#{|{5c*d%t z5*m}MM6P5I4A4>W4Kt3lubZFODCvii^o?i2lJrp~7_$tNSUFD(f%p^=6PVb*u7S}M z9QsOAX9*@qgb$liHL*Nl9Oe%;I0j3p%q|? zGtlo`_BmOP2F#$5i1}Gc#=2Tiv5wQ6N2y!!yDP*t!a>1K=_b8)S$B|-RHjL=x#jv! zM5Tu^yLw3-x61WP__kK`C2z*mu1!cgkmP@RGFfFSf+nstH>3q)W|i>D6yRYK^$|#% z3eR9{Rr1LgU#{Q3#fFc%F16Tk|K@C>WGcjF=~om;kSY1JR{G2@dBq};SASR;&>y(t z4991~0($B@8LX^~n9In|eFk@h%qGPM03{!IEW!c^*^%?UX}us>BA9wZBE7I$gOuMI z{v)>$NctHzw%e+dn11j;lSTPee}0zv&ue@o7#f_H)$xVC65ktaq+DHZ%Yse4S8 zjoqy{%NvZqZ)71W-*o;Dy(Y*=BLt&YX+#HqCI840X;G%)fkta#XzUKNIP;N*P;U47 z5E?z_#1|)mVsr%vRf@0XVsoz5rR$P{so{b;wAHv??hdfGnlETC{^*|?Z_n?vs^271 zZR=yyUc@+8Lslf+d^`t?b@UZ)hvn6yZPj7?j5+s;j(G0z2+Uk%d+VgbzOa(TsA6 z1oz`0UMU3KGSa$`6wDEBFS#S=GCfFdKs+JJ;w=R{r0uFvRBaNr`)Q;El@LD$>qg!R z5D-VLf$k42F~3uxPcn(JPQw!a_ttN1_xr%9QgB|OU~;PHI=EyfFtbdpV`!>6nEIc7 zG3>=PM>u(FNde>I;9?D&@{xid7hLW-4`RVsG?Wz(JzTA36PrSZGpCGYNgyxO%iulC;iw6O)F;ma!}KG66xie% zpkPC>P8SN&<;8-n2!37$F+C?F4ohJan~4eqwXgG6&>iqatru?fL-p|R!O1PjSp`0*_ov1 z#zLo2k%QiQGcKW}(v0CFm);rEq4c%Qfe>mXhW#S8qa!LZD#ABHi_A4)wX+sT@M0UVw4YIRMHqwzWHCqA|@^2!PkC(QQ zS~ZuXP3);{sedU*tKc!OqI^eQLUcel%!&bWtQ-Yh@;ZbdjJ+;BwrEKHf))zbKnrS1 zhq`*?i{J&-rUxZcUaWEN=SpMpdSDZIjS(Amg!hn^~o4u28; z+LEG=me6TnQbka$WgQbkQ1WaqaAqFN?s{!w%OF!iRX=V0>s)!3_FI^1#w-X7j7eY=?F-M9}9WSp#_{wh( zd$pA+;bOIRhCc$Fq9@Drx3$%i|By72z4aUj$AveEx_H*Yb!E+q7mk`|jX9WN?wXgZ zg9W>xx?U+(agmGf=705RA>KwxbSPzsxCf$Bk(~&ZujKvD3d@ugVJRqa=(`>+1H-cK zDWU0#At0ac%1OGjWYE#Y4XB-@Kxz^Z(9~+O6(WlRR9%SNqkoPTnU;hm!D>2xwdWXP zNd80!di4y(vC1^>n#4`K96R8uI4b%6)qnqHW(C@U)kkUQh2B@XmSMiQ z-~vTn(5kZq2Y9G2xA!7Edv>QgmH3tw?XSDhGhcEdSH(mA{?ZfUcHz(Cx)|vqpg6QM zRS2sWB@#k0!(*avSRUc$D>+dB+&fdU2e4{(R7As-#(o%>YT(O71clpKRr?zcF?`fo zn*wDktgr0Fu16$oMqWUar%GtR^jS(D0(I43LH-AjXm5Jb#PQ&ys{Tr?Fj;a}=cwFt zqm8o}IHQ(rl?V4+e+ue`stc3)tf7rCJULbIwQR)fMox1Vag(38hS%P3`oDk#!sh_B zzzXhv0SVUs9Y{=`3gYF)@9qMD=UOd-Pc9m9I}d=!84|HNdaKAEZS4US>)+mP$N?VU zJ!yRGZK`A^mub;$Is;U0aS+vj^Zgz`>z=3m6Ajo+n3oQ`_($D3wx}Xhtrwuc1?)N7 zy)A&D(}LWA>d8Vp#$}DIikwFE)3~ilEM}+SkZqRR%8OI^emi&a9dY&+8|IqhGI?qG z`ZDoV8)?%}-S7Mikpu3MiA{meF@BG95ag$VW0JaeP3P6q(3#(D{{4EH0bO9k6Rtm0^Wcdc0Di{-3(ErTX zbhSqEG(jWbj%jT~|8``Efr{l+2md<>2a4vA?YwlH};* zmTvyznu#Cefrtz4^pEn&l<>062`{@P_VHwxKUvB#mBSLeM-fDf65W~H^dn8dSJ8gC zK73KRdS{UoIYLj2cEW-Jr;xeTVq0%n-v|^jCwmMq*YN5Tfp+ygZJ0k;f^LGmRCt&W zk?K-EWF7j(ozB z_`4q#qoiGD>nXw;MU#%}?=Zi^)2h@HdOOGMSH{%gD4DU}<~=qhEVhlO3(F0wl%6bX zMV1?9aF}-9-FOlh$zeDHOz_DG&8y!piTN-gyIr*u7-w9UZ=MClOU$jB zw;oBcgl-TDU&#--9{{$aT*Q^NbxewS zu)p5Btbj7)ZY2Q-ZuYsetB#i@hWWQMqoI_vlp7aSOzn(3gv;7u%8Ep6Zi0195ZoY% z8%axv&B;7oZ#y-;Ow#H)q3UoxQzXSorzgQ8+rO~de(Hz$`C&J_SsLOvw73ajkm*7` zgaZWz4p5}1!pY`UuCXeBS*2DaUc!;c*q8|;zSZ+K2`Y$e>+oz zYVye<&A4v9B3r+@s4%&C6;(lgt!^?M8A_1((A#90{1FEbjawa1DUSV`Sn=L4v4EO2f3*^KPabRi=#Z! zew(BD+JvnrQ5MmhH;`*~3w1Fdzm2S`#YnoheL7InsCp3`7szma3q>4IMQPKP|_MEc922xFQM7PIJ3|!GiE4vfyyJahw!1{ zOZ9TJyKMOzH;4=Kt2k~nk!{QVd|(M3bBSsgZ)$^r{(-|2|EoH=_&m}!sR|K_CX;+7 zm(*?zMd=dFg-M~nAyvx?r~6|6_xAiDhjU1UaYiOk)yLd#ri4*UUgttlL)TJdY~)w{ldKlj`%w&|y24!}C!C){I(-}rpE~b-8DH#pgxE#< zL8HWuUWD16(C=s^U9D*SP>%q~YiS7DF1d)}g=^nB`XG9_LiSWvYai&dL7 zWtGzZd6aIqX+XPCX>&2u4;xHru);e`*5ygzxo$qKt{{`n4(suk7`VSFN;^Pd5qZ7AwVGmPiC%&t7c2F!39j`~8u z&8bahPqfcXE4^MN13HQyjU~t;9LF_;zE z3*=N3SiN@@>A^Kp22@^0%Xa99dSM#q9qeb4N@SoqzEMfNiEfbEe7a@A-ti9KcNU`> zyFJG2#N;DEM+O`s&Oyr}F+K{E2BKLd%`K_oyFZkRyu6ax0~LdPAh~!(!;Aarq9~D1 z=Y(6x=i0)fcoVhZ4zgKstHIuPg5v2ED^hZA6y&thT3&;(Tz;0J4h_#5|CS35`t zyc4d}bkckk$oe3sSBe;D><*U!1ss%ua2_TkzNfXSf*2ZyM<7P(zO{yHozN-MCyD$k zh^Z@KK#VOC{zNfzIS;Z$~`wn7(b7Qi?(v6TzY@sOgGlmLe zLtugz%GvzOYzmCvJP$gfawCJBQ~icni4aa?4+H=f$|rT z=p^7{Q&05T*&E(Q$>}+!{R*425t*FJ&2v{$I1hJJ)fE&^8d8pCdu|jBlO6yC5i=3y zCUW6P(K8>|)Zp$NCI{#l(W8P7d81m&cVLX^b^4yHN&g&{qw3AOz>@Rx zdai!jbC$EK=_`kcpez&SZ8(a46&**k<2TsN(3$l1Tp~%v9zRb7SdyIvNSLwGmF?S8 z5p$W#x%+nXgENrP#*@OW;_lM>W#GA)EB?oG%Lj2bl(==3LhHMX;sO{WxK-|xZyd5) z4xNpHK+jl@0w6mI=LTd@A)#0SY%H$sV4=AeO0i56kh5(Ph{-hLP29?|^a&5FC_bO+Ah-%UsM z=xWHUKKgaSlL*1W7-^8el2b&b1MqHdxYj1($U2xoe;vFMaw*?OYYv zZh|`jdFF+jVoET?V=WM``Jf9BTa{7@A?Z&>+F)og?c*vp3~*^9>s@M0;%M4!yZ~;E z8Zh&v2E;kSRrM&?E!^b!DT)6QUx0UusML`AwD0vdecIJmC}WkyP7c#i!NN$aBmw25K#t3^M-D8*(&Vi{o{|m{k zDcZDW&zfX1?(pvX2x3f%Faa~Poym;>-LpRyXX|&d?HXSYRqM*RE=%oif0F_wq-4=6 z?|y%6m5X`BRsk467Z)fK#HG9^N=pUrh+BzzFrZbf)D9fe_xc(wgLEYh$UEhe3|R`{ z2w+*XZ;$vrxt<<~5RpaxH%h-%Vr0GrDNT*iqHemstnENkFO@FN@nvxX-H5omJ z(ad6laJo3w@?QqLMwZv@lMShYPfbuAtpbo1CMBbPXoI2!dkAKKU=<+t3Zm}+01;vl)m#LZYZvIf5{1v0Ud+D|kJ@#rrhbvj;Df|6Dz zz8G3**TNkVXqv&6VtGn0wqa#h4gTg+U3g6+DD2uD#}CGU=H%oA>*br5Um&FIm%LSJ zQ*ix`=2Yh6G(Dt_Z(M_b__*9)0(+}FmbL~0kVGgNcf>W(KgUALHXdB2ftep>ke!c3 zhPKR>I1`{$RY#GnAcVzcMLBR~51G7xp;50w=e@wLQNPYme$O1S;qEA31(uG%WXNDg zeW>BlO-|8?rE4h}cWG*hwa;ycQjACn+5!Ex<;oOJ7l7t>;TTT)u+~>a*GXypm7~y0 zJrX)7=rGjugE6q!p2+u{q`MAudje}H0^rELQu?uCz7+I?8!?9<9w6Exvn7LJq{2)y zhc`-wF_sRLCUDPm=H7OpoCnhzn+A6}Dh>P>c0ZsinF)M(TRMefWv#0pRvhS zl|^boYWAAxH9`IYkvZB#{ZQJOjNyHNL81ffJ7H(3n>THgtsc{c7Z%%;3%{BHz6Q@? z4gzE^NQV6oDra$sDg**Sa{1(ZP+;vIz<~C3*9j!w!UsbfsdXL*(s+msabnG>`OI^fmWhjdRSc`>ZnNU9tIiB(aN^@R-VEg< zvrW4Wj>L~h zUci9d6uesp71WXEN!=z!6vhhIcrWC+!;}g_!K!4uJ7GkmxD`)GF&&C{NP#NuL$At8 zUIKK|oveY=v78`cHvPWw^XNH}mfrfRtmrcAp9Afi`99X!qnbo+PsX(@bP6GXw_345 z)%sjsKt_lXX=;uS`yK&%2L8X|gUd=WQ*wVRYRv-glR&?b9-#gMNTkOTp_E(f-rl}8 zJLX)mLMSu3DW;dtusII)#@`{C!qJ5f)OfQ}Z@A?>19}Z=iFH6GKIggZp6r#vLD2%w zw*6l~0%?NtaL8}-zkmee{|+QREJD({9h%L<_#$;pG_*dz zD)G1}?3E=3SV!}oQ;*v%j47rh3jby2e}*>nNyk$R^Y=5ePPkcFg^5WatmY9nCENLD zn{J~S?Cxi|u{h8!!HpgBoa+VFO@-64!Cv5eGF}Q^VEyBEp_$_~ZSMX+?fiuS^{7ij zw`Y?eVmLZqzCI8Z_011J+Srm{2>lcO>zgQz%kiM z3Jj+9xgz@CJ8n!?6kD zzdL`YW6qx|#4(|RxvTV+zvEZF1|pf19iLX`=RNvj&z1jNZw9uDQPLa;L_f|%{?$_Y zpDcr(DYZ5znxTuLdq0nv;&oWmdxXCGMRk?-Hg?`En%tBx+^R{E34RIqNnh})T8;6& z2r&hUxgjyqx$%?z-pa>GNPzMLXibST&r4w;pg<}Qt|lR~z6(Wc7SchpKsxo$5zx(! z3j7X!I2;5uwg4@)|5?AC|N6t1KU6!;H9yQR7_!?)mG`dA&)jOulwk7$mzAcYJWKNf z2g>qC=%8lED|lIgHdxX z3#f3O(jRr{C}{=cdRe30NK2u|GL`*%RN^9gcr;c&3N^SdifldGhCJ{M+&v8$HEdK` zDcIhzpmF-E)ne7x|N9hK9J3xidxR zgW~zJFJljaWT8xYSP%VN_ir3mfstlgG% z^ccGJSEuZc$SeArpt*^`laKnxE3?~4*6VKtlDH(>^q^L$I|ixXajP+*G@qx0^i7j% zyH^^Hu_UJS0#`MDNO1&>DOTc2iv~!@OXu18ZURc;D^iAZH2>G{q(1$~fqRKeVS$F( z^$+ue)v9^VzuaNJ z&GCQAnGr<;1S$kaE$NPCP*wYJoR(YqbDZ_8HleCj*m{Jm3n`^fB6HOB(^qjM0DH`0 zTwUoeQU~%ja&TG+wa9rxd_zfXi8Ku&_hji$1&)K1>yKHE(G&2V*~{!QkaosHS>DX? zGVt2Mn~Vtx!7ezYayz4*xk{#A88@+ZP(zj1Kgd|{h3~z|Y z3fj^g_NFq8O1d6so2g!rlXL$RiJ`Y|{Hl24RG^%>(U{AijOfYdk+9OFEz7_zK!Q7& zt5kZSn2(BwRFLPB#4VLVrkRiR1}f0b3@3U9ElQ(=yG!qyEL7IK;zi@5I*su<%yI{8p^ z*@s>y-+XeYFp-E|RR||fWlUlz&Mzx}IHk`x(esO6Qt+&N+gM|4^sL+{a7)JdL?ymy z7kY^9GO#1 zaN1);{^Rj9zF(T^kpFf%RaRm0gBz8y9=^b$l*Ve8)BL@1&tY~V(U#hv4NBqjzb9GR zT@|WA;3~Js(BSgT^}S#Gx-cydWBcvWwt#4v87mN5whpr7y6h|1zA?i?f1Y&ED~kfz ziBx7K_nZ$5-uH<6F-ha(Mx$tsen2NdlWgEghG4CEW&*AAuBS5BwohW``_`QbWPBsl zWDd-iA=8NOVECTKw!d$jEgikjZDT>)mIGzCVu?IR>kG_lUD*I1+kPn9Cay` zIsNsg$Efb(=a!SHF~*61s-w?N0*rf}vs(;EhA=)K!><`}-B$p=G?z)}gp&KRxjM@) zFeL?Ur%9X!fgb$rCtoV2u(HEAF}O;S($UGCfzBI6&E+7-skxz?RN|vdvjp!dZ4eH) zui=G139Xaos3ElMyfq}I)Ci(|KAB75-=C~-ty zXXB}uShe-s=FaUN{mj8p^+EjmctGRrx8CwmS`nL7nKmG z`+8Pg+{!4W?$k!mXQUrtKuYKJF0K4{tb3I$cq~PvwUp6_IcKXL zRER=KGg?U|eua92X+Z&>kW&|fMOB4QR?##>#53iB@C_SN7SBky%7X}M11P6#jgs#b zA*Yqf@?%7hl!Fen(D^dk^*u4huwynvuP_b4fUVF&Fjh?Slq)J}_HYTsP&>oz&V=+! zTe@T#^>jfS&RqCYyuV*{(`rS+(DZT0Y-I(+-T4(l!Z1sPUN=F+9rFb2&F}R$C=5;C zNQ4NuOSb0Zh?xF0DLe+J%0iE9G+*IR#pzY?-ewcTm|VE0puwBSmGy)VPIFfl3}x@m zHcIs?Ie_LQf(qbX_fR_PdHv$;&cACOqCCqmJr2C~VRCNjj`WPMs}(e~W2sMn2TLVn zkVdJTz`x{p-htVsAY}^6xq%1{z1F?k%^cB?-)O=tO+O`zO_vi1OY%zt?Dt;8G$7w6`r|aw-m;xvRCEb zylAq36fqp=q1aJu^0%m8jwQmIT(P+Zb+2xt3cVD9`#cNTEEcxRXDp$Y&0Q5NJU?bZ zI_c2_SQ5|bT%in;W1H!1TDhDXxy|o@Hz@EFp%--v zP2^qie6{`GEC{t*@Ralc`7owZuyDc@l%{fOW=L-!AIy|8L@%pibrJ^`to{N20_)S& ztr=*DCc#JpcANbb1IrAzkY27-yI>FhK&6NrauF_kGmNS*Y_-_q^VA_f=GM}HPE2`UidF*0yeikB)U{zn@Qgr|A4sh#RJR|5?=HEe2}HMi zrf8`pXy|YrzSB$}MTg*}hTcZ9{PaV)5!H_|`WJ{mTitQy9O19n!w~JZkGHrbC|TIp zFj$U3;OqUgV^$WKw1QrQg;|I__5jX`xm(Pdmt>0!EWT}83&PBDde%AXHBs|Q$0J+E)L+IGZgEx`;rX+MQXyPsOVfn>?B@bF$gm#baZ+77V#sQ%%4J@mhnsjk=PoXHyEAYwdQ?4S*2oXu* zcjFBXXImM6DP{TBLPUHQiVW$Bvk#RykTS?v9k=F-COgU1Kunj>Na)F``1wjhXpyq$ zZ#QVdDHY+f=k1tCzJu-Xw9kul+%inB@R3KVvq=5rY{@G2*>6F8f5QG9385@-=@VLcJ8hYRg= zY7ZYp)L%x822x$2ka%eYWb<&SZTRkG9pj*=hx?#e#g@Rz9ULv4H)r{kaRVkR0txVmWgiTic4mY~Hj02-iLx$@4gY#4Vips;IgpqdM8ZPQ>OezZeB88 z(kUfNqZ}19@irU+Ie3yxnkI4kZ|3PmetH;R%{T}10*KPmbWOH!PQsBE%yFgkSsz_F zd;sy&k?&2L#|G}cXYG1&)GS7llzz45{)wmxo*w4o1`vr>b5E3VGCEFQxYHW;&jh8X z!BBBQChx`tSMA0ZzEDE*M8z~Iwn`4DmViJm=G(<;OTPB{tBw&CGw0s!xtxDHfcl;z zb}qDTw1zSUSViGg69waLhcCn%&*aSUtZTib+701sO0p;u$TMD~JbrvE>igy?Cp-uxhb%o)E(;gygGen(HFYQmdfQG0k;B8V-Y4lV&2Z~M{zNqSj zK7P?ryjVS=th-rln_C)hDfeHFF}W)h+I#g0xJ#(ljrRJ{8u?M(zvv|s@OsPLA_B*%G8C#a8v6@3th z$~5B@@c#=-ET~h}8nwX;&)WKmu4_dW%!Sw`x^6In&nT0OC!(Ep%VpEmfB#stFBTD< zmxZi@gCv#l(OzTgQm-aj**M~%{!dr}Bds+@j3)EHu*84p+mPBu1SRi_dt^RNq>6ol zm|T8xoIJR&{*Dq?v_{W)r(k-b320v+lW~H)=rOeIv3d=hA}0p1;WmgR;q)W&d=JT= zC|{O$q{_wqL6|!w*k#2@DU}m5JtyNToqqT!8W`1db!OPJB6iEl6-eeu>!VT*L3*H8 z$O-ReG<+-jn8WaW{JPIJ?LcZF67xvHK(Z0@Ie|!j$wJ%Bt~L`dE2cdyeL0UTRU@6^ z??R}E*v!IHg7+Pmb(+N3WP7E%-%3mKSNyI@WICV%i`o43?=c=tcPSs_4wuEld!{8# z9#*?HF6SOw$Jzb1;Cl+m#n^0uhfjDv<7XH$0s{27`W4oJw2l-95MaaA%*LNj@Fks4 za~{!=)_WUCpIPup_AsBEk)`WhGXsByhr`)yz%av4U9os>! zq?m*+S(ynJ0GeG5z;|!~0VP~=P-k~2?0JaFs`U>G?JWDC0|45S#$?O~d#%tB(E=fe z{TR4Wjci{f=sU5TMkJJgV=Fjyr~3Us^%r6_#BU7)YWByNX-wbg`7Q%A8pJ zuH;f++fSNWR^jOk>6Q-ukRQ4ewJwbpN4KmHB|A_8bUEjb6qW&s-#UzMBp_>OK~QdQ z^Cu4R%e#Of?5@KLxQe`?89P;4fNu4BCtK?>#opkvRbTpZvS#4x)5ov14$Mvvi=Mj@ zwChFp8?NvNsg(j^(of6pSq-g|syAUg-AQ3_{;4xwD!<3{N469@MrVpq>!!EVVq|4U zKH@6*ODN~V<(R1dZkxb%R2l>VI3zpk2w-t`XJpU2v2k{ftlcX1xZ^=yn2!C1|E^SX z%0OjHKQ=U2Gl=wv>z(?>q}d&{EikVJQS;$MmN0LC0s$-5f7>Fh&x5Ca#3E0vH?$Vg zyS>+3RA*iKk&Z#PJuYj*38?|cx#3nH7A}_)KrG{f-H^ewZK3=r9Y2GaD88TS#W#W( z-~7*w5N2e`w8t$=Hg+9&4e=y#ibVXza34N2= z8nVC&;Cf6%zxy`!yhiC}mu(<_H7BK4S8~hEzg4F_b@fW_jb=pNe~KzWC^a=!5tiBt zLbFcTa*-FEnM|O6{ZO|mqeL^AGeY~WwIwYS-~BcfoR=E0Di9_NI z_Dd;AmgffN9JyKA+;FRsdD$70Tw*Rf8CADv<0Oxs$n(-Ien)}+DA&E?uj3##gwHy7 z!WCtMRI4)DUXT3sk{5SSaznP%ZGM+K2wc#&PaV8uKgZATQ)7~UJ zH#eR=ATT(oQg?>+{9y0jakP^*D+FUfTF~$sy=YsNGb?7l8ycd1?q-PLy}N+q0^VeA zQF54O&g_Sm5wc~vv{W8fKJN@dSez6wl#NC(A=D>^M@DswVYr{_->LgQh3cQh(sL$% zBxHyuxUQpT+^$DDd`-E5vt8sXHqJ>p2nzhr_7}M{?ql5Nt5nJwp!FJaNb!#8YhDZb z*6??oJ*N?)1{zlf>X7j~d|O|QmEjqLzkfMZvNxAeOV}*8?F#*Ym16^34*ku#OLIsi zCtM|pVI>XfYP?9#6yghHZKYv_50zd!W(htl(HhYWr(h|?oT+GKJ389#RNs$g-0;GX zY^?^u0#*ebP31HXfGNDk)*Bl|k2Zgb^5)asGogUAw~WI59>M*yc|_*UnVV+TE;KELjEjlHp81Dr#=ycvjI_JUmp^K3yxkqurg3G z-!$bpFJdcw9`7X67-yOkUz51u=rBLjmM>8rN1eHIHz8fT3UKpS z=-tZ|$l&T8-X8j6fJV}($pPa}hqqG7%txE=lv+j3s^VCDDY;*5VC^x&Z}lH^?)L3# zK!czfmo{x|dX~iPOm-F#AG;TLdN=}9t@VER*`za0mut2IbRpFtNYRjBF`$S&9dv=2l<1pky=o2KwPRh4|6{A7hpVz+SmBb?1s=vMKmKPV!}@I+Ucder5f zhX{{{)pJhapUFV1nz>dV+<=M14d>pM4cINWzHbB0Ek-@8!mRhIIx&|Vugn;|WQ2WnD>hlfk*zd2t=P@_S~ zOK}P}pGE5sX=c&eklFZIjDX3FyV)hohNFG7a5aU~DW;{U{!bj?fNf(u3gPEd+gp;B z!Kxn@UW_T8onlNS6DqaA;7?)Au3PV$?U1Chp_%M&bP<7h9$9`q<*}9^q8g>zAO^`2 zhbWUwuOX(ay|$n+TPw*@21e%FB>BKTy;ocMoN`Jrm+k;-Uo^V-E5JxNa0CoF3X}~Z z$39eB{v7Ohsgekux#X8+3mk!KbGqs89!e}8CnS1a^?ye)+7SLUbeKhJ)7WCuPd@Z} zDd#gvCE`h?-SQ!bGtof|KGvsnGGaS?8Il^@I;DaVYFKl<^AmIGm}wLkTFO3PlT=m- zv@c`8rQ;v>w+ zr{jUj>*ggT#j;%&{88S%4wj`73|8MV4Mq2k;N3cW`4io~v0ds*EQlob2+BBjQa5se zyhg21v_oo29%Nl~mB`jN^l1XQfn^nWBHoHr6hx~48l?lhmx+xj+YO>(<7n{F&iglS zH>@a%6g3hzp_(tlcYDu^)Y)Q9R#MQ(pH*_O)X>Xm{qKnLGmJMIP&DL#*|{3 zJfw)ByxV2#pG^Vfe0?d?Ke;$RDTl4gxCKQDq-l1Y?T$7Cr`;H6JqMttxMsVG{Lpr3 zqAXX0gcj6XG_lS)3`?t0`aMURRCoVQPfy)TKdK{15f2ELmaYoNG4HD{rOpKJ^|hgK zm~X<5g-qfldcugt!)3z{_tz^(I$+F^@8T0ai`^w^e&cA7TI%t-wvfw!b=s1B4K%L- z=)XhI7oY)tA$h%O{0+gb@^;HgQXjESqk`3gD&<5a2{iZZj>8nk&*9G>3p_8H;AD_%9I549yl_8f~3!LyJ&d+b4dKMAKw{pKGx6k%Fn z1bX~%v25o;K_ZCO#dO=Stji3&P}--y=hbYsq7sCbMq0;ah@HrMZ`cA8S+p9LAi%XZ zOyOrUeJsbblB&(cw+(dS5|I*pC=t zNL}c7O6awv?#3&>V;CkOT;|FBZRVRNQ})e#)R`xa*5WKX#vqebdT1?quauL6&RUF8 z^K|2lkYbXXYev&tf8%54RzEY|s4=fs>qFSq5TDf;f)C9&RCZ@Xt928S@^1LuURt>l zE@+f#h{2W7`bWvvj}q!wc->UWZ_h2_4py(MG+eVP8dpG)zYsZV=?@ryG9R-H0q9Dd z+b;*jmIUV6zc4{LsQeJethnHn)vD=OFLh5PWVEE)8CE8z)-AvB)?h7a719!`3d)W_ zWo{LM<364Nj&=qjoWJ8r6<3XyS=mWjY8cd1OWBptOh4f@YItKpYigq{Df=gESDFeb z=(y$!g*!L4Jez`Wvd_>6k{rMLMFiBH5g6T*6XMOn)bba*ncM!;CZ4*i)e=jyjuZll zRO;n~s-Nk}v%`bzhM(LkQoJ}`$m$$=@?wzq4GnTY>dd~ZT#+qL06vj3(#W75Hm&Em z6t>lC0aqNeXpxxkr*%t`1PP34CNHXgO({@vE=7^UvjLCMe$__uu;dU9$ISXZikr zxXT%PInG8{=NxEt@!TkUlsgg5Zl#1=dAI}Hwt%U;jK%t{lolRLJ$1M*KojrC8KAYIzuP!uk$qDMcf}o z?F4tK%?>3nWN*;Nj3N#!BsY~E8|5OE>#*V)8u|Z(Be0Aal}8uV{tHL^huDUTdLqbS z9wGFS-e#rc&}CFxNn2TSi(q@6ATS|z9Bsfl10uw?6220V_vbq>`?$8;oy?V`wK3CK zzALruJ>=V;AfCgoto;Tw{a_d$4u`x-r`rRh#E`Awewq@{~WwATlk*FH~@8V3u zEYx{E#{w=>N3AuB=v9*5Kg~%7djmlWcZ?3{59{9is@MtXab6+YpIYxm;Oc}~Ym7Zy zV|OM1c*6%m6f+>8mOt67Xp7dH)9YSIH>AtJc}$McTy<*vAHA;W!ccGa?-2w?lcfDm zhr6Det-{P8GN*x8@LV6uu8+?j%$>5CK!AZ(M6lHE$IsUdP;Q2m!NEL?9SkKffNi7AY+@Q(V&=`SY| z1N?NbzxZ@|2{;EJXb1F*Fmra_dbE&jv}8W;Gy-+1+3;w2vZt(x+5i0l7hp8{6+|ii z9amrh&719Ve9)2$++=peiO1>~MV?EuEkCOhMKnd2YX<6dR}eN=FLAi01`MJ*3XJ49 zJZh4mMjkjRZnMWs$z*&NcF>~w4yGgTSJU#dI)=cyWPPS4Uv^OmoS~ooGO?V$poACe^_xY zFc@78VI3G-=j>=<$3^fYe88tdf*A}l%jD(@x2af_Y7I*1eP@xEls13>>Il_lzhJf5 z<1&`4#Va7E#2}$9-Q+5ErI(3b!Ll&kM}j1CJ2<5R-_>NQG>%Q(VQ=~vJ`B(E3ynG@ z!YgFZcX`SRFHN{_>f>ae1q*>s0%bM`!J$5zOi2`Fu2-|=Gs+uvsN_mQfnTe}0Cee$ z8_rk=$Lcv>7J_@k?Qa-_k8jVYljxa80a%iY11=6pXGN8d0dljtO@#%nB4iV6??JeK zZBT1l{-D9A$uG$#RFkB(g@=yc))E=A4O%WZR(G8h%dm8KzF!1arlDwz3S^HIl`S}}JM{S=O2c4@;^e$! zQGDt4N-rP<6eB-~cbg`9wjMl}h#sjk!Z@ZZL`s|6sU8;*aQjRS#FmK(8ycyX~N@SP$TK56S%I{FH*uWjb0jX^;Rs0j4UoZLL4;0aSdmK zpRVOPCLKf4()J86LO)1^rXKtp`VpA=3*3_((DpeeR zh+}NNsr)e6wh2X;O5<&L+(ofl4QL$c;te~G?1iJ6aglguC|_FYPV8d!a8nv@kQLFwZk%nxahqpjv zEzZI~LUi0CMkfB}42cZ;aYGZ@Dd|j}`AVmr3MxfrOejuYS)iPxt@b86i8xT4!{aPg z-`3uaS3bbmJet`83XY#yIj6v#aKbw!F8&29khB-8uHnUcncYjvdvOUq{|%4&=S-n- z8ZFU3K+aHNI8C{vpyoX@y*cILL7N0Ajz65{;;7X8Qa%?SdP?vG`(MtPp)?N75(99H zEC{%O#Mjf}2u6nsb{uoWT7&nFHcaBXVp|!&Wc5=s`F)8y&C&Qesa$8$-v_w2+=wc7 zv&q_UhxJ?=IxrX0CJUHEgG5e zx6%+oeyB|<2Nc+t;n*2kR#9i?120N>XB+to@8B&~M{I?Og#5sQq=oapoGHZ3uJK`9ZJTUy1F#Lz zFGc-B4L;kfn(h?|oy&8kq2?s#*rf5KY@CPkM%FgkO~V9TF<*kta?r%(JVh!hN; z3WdE!Mv5Cex2V*xS%i5{@A*TAEI?n!STvP&$|I{C2~AvMB^q&vG{*{$uNdEP85D65 zQzt5Z6pgp(#Ns+Jq;Ih|ueSN?hoc|MPFf5<6Dtg)j)r9K0r^vxtq#P2itf)oMi5gg z9Q~m0&;APY4ObRbD6Qhr!^5vkYq16n*tCX4E6b=DIzCBcr`-+GKHGLVTy^uG`$C{X zkUa%X*7EC&VNJ^1y=Pg#ItWbaN>nL<#RBFj18ZcI*7bq4xq3I}%`GIN!vq(rS9gsF zWmMXD5#jSb{27gAMghcD!V-x*^Xh6S597z%8TxSpG0o97j6&IC%>Pt|^m=y(8Ypnk+TdNV^xE{5u7#1uA8HvMX1 z@Hi-;wpsPl+NR!7_^*xdQFoZrISkw;!Xgc+-i-;w+Ui^Ufh4QZ!qj%cvT40n@4;`Z|BeAVxkz7#5FGrF$*uk{ykMLHVS z-K6|XeDxP;)^K`qKkc!h141U8znbE+XD*2pzc!1+G48OuaMF@}cqD0%k=264C6sP+ z#dz@p$m)^`4S%5W$gL7!KNY*8&0#Zgledb=S7D>h1ML*&sg>N%cuIs=Hv}g0(zVLk z9=XQ!y!9CZqF9$%p;x$#g|-V#FZ<6KAzs}p1v&Ra?#&;&LR$w3Yxp0?f=v3#qrp_# zW(Z_jrJ4nyOyYW1yXFCV9pn|9Y!0s_3!TP82A^(H(sy1-nk{pr?DnL7S?W3bo8$g9pW_!QB#evYs`qImNC=|$r6l;vpzyO zOEq6@Mt$iRCx1l)D{wZUU)Uvai_MwX!FG!kM)l8QI~&tcof;5)^QKr*qc&cFtqzl8 z7CyrX@vLF&K{&IKdi9IfV^zG$gJ3r|KmBO1pJyn5@(X=uxZ$(CN#zTxyAbBo&pJ2r zf!0S4FPy5d70cIZ1jKOAAf8+ixUE@`S|Ts;(wXhz?Um#zcw5sk|8!wZ?Krr6$7-#M zFFSWDB~Z7WJsQpyGIGOBk4oE88e@kphRv%*d*RBZp~{5xs|O&5CEXYl@lZ<<%>|;w z?Qm=L8EX;@l?0?KDai{1V}y7ue?oNn*Cn9RPrh+yZ{R_dgmHe7Z90@sMLjS5O_J18 zm$ISC9-PjV6U!#P)D|0M`6;x*rA4od<4+ZesW$guWISBoi7DbIl3zs+7T%pQ$y49C zfiKZ*+|7)f^21446H0niS;y1Vz;r@>h8og4H83fKZg#Eh1d%Ch0aXoJ`n6nG#ye0` zR-|borXZu7v)TnYM~{!@*1C06Skj}^`@9iTUZqdeO4Qmm{%o)=`J!vK3aRrl63Y|1b50|nID%A-#x%64?x7>hkfRcXB) zp-r~Y5D0@`oCuVjDTl{*Mol=jHF{fFY}U>1X0CLe{-e*~dYzi5_1$L*im@MWgig@` zrM{m|V{DLP<1n7~e6Dnv`KxWSJx?je0?0Vhc*I`JeP9D3i;gvV-A$`oq4 zboOS1C8qnETj&S@@=f0BG~0&29|MNLL8<>O?hZmKF<1?5H=b;@%M}YwRwGa8SEu80 zH6J7*5ln?V8h*0KqN}`eWR+co7elTj{~etq2ws2asRZKnZ_C~E1^YE4%L#Gr)Khcf zw-^+c{!sax81o+;)HS6TDwl}^wo@j3_} z2hvhlHNl^10H~NbB2pU))&_m5M4?(0$~9?pDUcNvE5g_r7}iHyXu0e+)s*w1 z0ra>Ro9s;H+agEea}9ea*L@I6a^m$TD`LVqW1K{@K+|Jd_Ut*HlU)K)2KRZOTAALs zs<4*5?=tXj+mC|OZG2u-x;cBs{;u0C65VyBc^4rFG1@5r&M}dr(K{Tlz?>_XAw&9x zInxYTiA3@ob*)3a?OGC0XpiQwSDv;G!#kr9L?50JJg5%S*53+U9ybAk7{U2~u++D| zS0nqU(fl;^zD5+I+4hNisNN~vwP|C6md{T5d$-unMldpu#xFwE5kk=3fHR>ZY1AaJ~;PF&j1!MN6+P{OXo0C z6_q$4HNH7~oW)@AB8GGiS21o0bcV%Cw0*??#Uut`_O#p0W=gK|RY+a-hJK}&%}Z!X zXYFd`b$17B>6=OzD=5pmet5s()uJOUJ*-9f$g-{f;)pXDUwWU->lpq|Oah0o5?0a= z^}m<|)BiuY5mj@HNAqabzU@M&q+XZ@4PG>}LW-j~azV(a`{pn)!7?1_&w$x~K-p_B z5EdQG{blc%ye)4Wc%fBjMO?$>0t9Rs=T&E(>31mW`3EZhM$dPrSQ7^M7tPquT>)`^ z-KHS-(xXhAV0BkeD;u82gXZG?Q78lvUj|0(=KIQLB0vEIe3!AF-2IgiM^T;@@>y(c zS7GAkFkIhvxYjCV6yulYIq))68*wy&>+jL(Eb}a)0!h!5bh?Rw8$jaC_{A{uJ)SVo zmS6wUh-4<5f0Sd)0g*N2|CmQqcY_g;bW;;9ND(NqC+!SqNG!3Q4!4g}btzL*%15Y1|7)%@)~gX0lVY4n%!W04^b z)I$8ME$4@+oTFAY;{&mLN`m6Itq+!x&6Mpr! z0|KlAo)Fz{$SdXP1PAojEaYb6%7)2tk4OH!JqhZ26etFTxHs49`J)Lu-Gspe>bW_( zVp|lgOG^~d8q2v%``!Tom58wyR_B=+>V84FoE=L3OsQiD#$nB!L1a0kRE@$D|Mu;~ zL?X*g0{O3Dx_{~wLx_)|^V=;~y9U|e1hiWaf9ov1vr1l5<4C>kiz9p8x~H=T)v@Y> zcp(ThJtX)H<~>aGwnpd`E?9O8N zY;*jR%{zHRbqP-fttYgAx-m(=%a#&j5E~Md2@LLIPa@R1yTN(dDyNc|3m z9|6)=KtS3N*LP%jnTZCXtD3p`>uwKE;b06TO?;+>f`_sBLkc^>S=lO>Snv6ded?yOo?(FsK&Jpk}Tj-Li z1m&BjEFQ(m2UTJ)_it>C+OuiOZk zE6xu5-U|spz@X*_5meTU^H2+YD1OZoo=?wOkJ5lK246??DQLm&No>H|F{4zoQdA`jDf3C-Boqv zH{x)Zbc)0VY=UT>IQp-K70w@@i^M6IpD^Yn>UvOvGFv+*r#BD-&qukSxF=OV4qZdk zji0wJe-~NAG~A+?_gkT@7(6v7U}A(Dvx|_;YS|n$6pefC(5oL1vDEJ+Tswiw%)K{P zG??50#o9H`X-q{k4yB^$X*=mC{nv(l87^xG) zZe8)Fe2}01UOX%PwJ$`dfkRN*Wouo3H2h4|gSK9TpR+8k-*e6_$NG}u^KYg;L&l%#DJ(Z@L2;%hhF}Now#16s3I4(!Ph2={%tA#zad`Q(xS$RvE8PnP5YIxe zYnv_&TxW41dqfjJUCmk?!d>XxWLPrlo*7u}%={X4hPc$N5Kj=Tj%qvl$0~eGiNF3bKTYkk1faGZc|8 z(tE@8H}5wtQS|Gj$o;)ax1fIrczvYB6J2t6DBWYc#`>CU03+@M$$jxtW-Py zeqTLSB8VgCU7->n$GaA{=)%7hkL!{xEK%T1t)u?&a}c{uczLD-yjb1G4Y#kQ>12)R zrR4{QkSSH=JUms9>J#WT{J8o^GG9HZHqPDI&x*hWBfX;cM<1{l?|b-Xb+3PEjGg7X zz2bk6d%hBYxGT~~K0tU>s&&4@^Pr{}jYhJf!{HlSgX+;L8T~a*70q%hl`1X(pF609 zQp0g;kimH=w9<+RCSj}@nZ^OCp{M&mc*41S8uBkMOhAUQ!@~W_SywY>LcfruM)0ab zh5XW3mZ7r8YhF=p)88zg*Y;s~9QLQ%a$Ni77Y&CNbO*?⪅doW;=lsE-1HL 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 na}#GN|m%Ch@PY6(V~+p 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 Date: Fri, 26 Aug 2022 15:53:33 -0400 Subject: [PATCH 32/39] Devops: Bump go-algorand submodule to v3.9.2-beta (#1203) --- third_party/go-algorand | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/third_party/go-algorand b/third_party/go-algorand index 379ec4f8e..55f00821e 160000 --- a/third_party/go-algorand +++ b/third_party/go-algorand @@ -1 +1 @@ -Subproject commit 379ec4f8e1b7f81b8494e3ec889c7ffc8ee67389 +Subproject commit 55f00821edb78e2a6368d0e00b6b764658992925 From db21a947944ed463cd673a31eae3b671b26d41de Mon Sep 17 00:00:00 2001 From: DevOps Service Date: Fri, 26 Aug 2022 19:55:38 +0000 Subject: [PATCH 33/39] Bump version to 2.14.0-rc4 --- .version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.version b/.version index 5c4974a25..c6dfbc1b5 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -2.14.0-rc3 +2.14.0-rc4 From 548f180d161a41701fb2561923ea48ffbb0b2537 Mon Sep 17 00:00:00 2001 From: shiqizng <80276844+shiqizng@users.noreply.github.com> Date: Tue, 30 Aug 2022 12:24:08 -0400 Subject: [PATCH 34/39] enhancement: Clarify REST query parameters for accounts search (#1201) * update description for /v2/accounts --- api/generated/v2/routes.go | 403 +++++++++++++++++++------------------ api/generated/v2/types.go | 2 +- api/indexer.oas2.json | 3 +- api/indexer.oas3.yml | 2 +- 4 files changed, 206 insertions(+), 204 deletions(-) diff --git a/api/generated/v2/routes.go b/api/generated/v2/routes.go index 6992a5ab4..b2627d65b 100644 --- a/api/generated/v2/routes.go +++ b/api/generated/v2/routes.go @@ -1748,207 +1748,208 @@ func RegisterHandlers(router interface { // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", } // GetSwagger returns the Swagger specification corresponding to the generated code diff --git a/api/generated/v2/types.go b/api/generated/v2/types.go index 9b93af62a..1db9a17b9 100644 --- a/api/generated/v2/types.go +++ b/api/generated/v2/types.go @@ -1224,7 +1224,7 @@ type SearchForAccountsParams struct { // Include accounts configured to use this spending key. AuthAddr *string `json:"auth-addr,omitempty"` - // Include results for the specified round. For performance reasons, this parameter may be disabled on some configurations. + // Include results for the specified round. For performance reasons, this parameter may be disabled on some configurations. Using application-id or asset-id filters will return both creator and opt-in accounts. Filtering by include-all will return creator and opt-in accounts for deleted assets and accounts. Non-opt-in managers are not included in the results when asset-id is used. Round *uint64 `json:"round,omitempty"` // Application ID diff --git a/api/indexer.oas2.json b/api/indexer.oas2.json index 1b94c4d46..955131986 100644 --- a/api/indexer.oas2.json +++ b/api/indexer.oas2.json @@ -80,7 +80,8 @@ }, { "type": "integer", - "description": "Include results for the specified round. For performance reasons, this parameter may be disabled on some configurations.", + "description": "Include results for the specified round. For performance reasons, this parameter may be disabled on some configurations. Using application-id or asset-id filters will return both creator and opt-in accounts. Filtering by include-all will return creator and opt-in accounts for deleted assets and accounts. Non-opt-in managers are not included in the results when asset-id is used.", + "name": "round", "in": "query" }, diff --git a/api/indexer.oas3.yml b/api/indexer.oas3.yml index 48c4585e9..94818cac6 100644 --- a/api/indexer.oas3.yml +++ b/api/indexer.oas3.yml @@ -2307,7 +2307,7 @@ "x-algorand-format": "Address" }, { - "description": "Include results for the specified round. For performance reasons, this parameter may be disabled on some configurations.", + "description": "Include results for the specified round. For performance reasons, this parameter may be disabled on some configurations. Using application-id or asset-id filters will return both creator and opt-in accounts. Filtering by include-all will return creator and opt-in accounts for deleted assets and accounts. Non-opt-in managers are not included in the results when asset-id is used.", "in": "query", "name": "round", "schema": { From 284ddc14af499b839385d5ec3eaf06385aeadb41 Mon Sep 17 00:00:00 2001 From: algolucky Date: Tue, 30 Aug 2022 12:24:24 -0500 Subject: [PATCH 35/39] cicd: add darwin arm64 support to release script (#1169) --- misc/release.py | 1 + 1 file changed, 1 insertion(+) diff --git a/misc/release.py b/misc/release.py index 18967725d..0d0ea1b58 100755 --- a/misc/release.py +++ b/misc/release.py @@ -38,6 +38,7 @@ def groupname(gid): ("linux", "arm", "armhf"), ("linux", "arm64", "arm64"), ("darwin", "amd64", None), + ("darwin", "arm64", None) ] channel = "indexer" From 35fd7458e21cc943cbf868a64c52b4be23c46367 Mon Sep 17 00:00:00 2001 From: DevOps Service Date: Fri, 2 Sep 2022 13:10:01 +0000 Subject: [PATCH 36/39] Bump version to 2.14.0 --- .version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.version b/.version index c6dfbc1b5..edcfe40d1 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -2.14.0-rc4 +2.14.0 From 2619fdbb31c96e8702b18f354d3566da5c38ea83 Mon Sep 17 00:00:00 2001 From: Will Winder Date: Fri, 2 Sep 2022 11:58:20 -0400 Subject: [PATCH 37/39] Downgrade mockery to prevent incorrect deprecation warning. (#1211) --- Makefile | 2 +- idb/mocks/IndexerDb.go | 13 +++++-------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index 8cb68a820..2c12eae89 100644 --- a/Makefile +++ b/Makefile @@ -34,7 +34,7 @@ idb/postgres/internal/schema/setup_postgres_sql.go: idb/postgres/internal/schema cd idb/postgres/internal/schema && go generate idb/mocks/IndexerDb.go: idb/idb.go - go install github.com/vektra/mockery/v2@v2.12.3 + go install github.com/vektra/mockery/v2@v2.12.1 cd idb && mockery --name=IndexerDb # check that all packages (except tests) compile diff --git a/idb/mocks/IndexerDb.go b/idb/mocks/IndexerDb.go index 7030558d7..55fe296c8 100644 --- a/idb/mocks/IndexerDb.go +++ b/idb/mocks/IndexerDb.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.12.3. DO NOT EDIT. +// Code generated by mockery v2.12.1. DO NOT EDIT. package mocks @@ -13,6 +13,8 @@ import ( mock "github.com/stretchr/testify/mock" + testing "testing" + transactions "github.com/algorand/go-algorand/data/transactions" ) @@ -320,13 +322,8 @@ func (_m *IndexerDb) Transactions(ctx context.Context, tf idb.TransactionFilter) return r0, r1 } -type NewIndexerDbT interface { - mock.TestingT - Cleanup(func()) -} - -// NewIndexerDb creates a new instance of IndexerDb. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewIndexerDb(t NewIndexerDbT) *IndexerDb { +// NewIndexerDb creates a new instance of IndexerDb. It also registers the testing.TB interface on the mock and a cleanup function to assert the mocks expectations. +func NewIndexerDb(t testing.TB) *IndexerDb { mock := &IndexerDb{} mock.Mock.Test(t) From 1a21540774c9d26d1ac950c934b6d1c3fdc62916 Mon Sep 17 00:00:00 2001 From: shiqizng <80276844+shiqizng@users.noreply.github.com> Date: Fri, 2 Sep 2022 16:02:38 -0400 Subject: [PATCH 38/39] Enhancement: update e2e test policy (#1197) *update e2e test policy --- .circleci/config.yml | 10 +++++++--- .gitmodules | 1 + Makefile | 8 ++++++++ go.mod | 1 + go.sum | 2 ++ misc/README.md | 2 ++ misc/docker-compose.yml | 14 +++++++------- misc/e2elive.py | 6 +++++- misc/util.py | 3 +-- third_party/go-algorand | 2 +- 10 files changed, 35 insertions(+), 14 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 076354f62..298f1a4c9 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -41,10 +41,12 @@ workflows: jobs: test: machine: - image: << pipeline.parameters.ubuntu_image >> + image: << pipeline.parameters.ubuntu_image >> parameters: go_version: type: string + environment: + CI_E2E_FILENAME: "fafa8862/rel-nightly" steps: - go/install: version: << parameters.go_version >> @@ -53,10 +55,12 @@ jobs: - codecov/upload test_nightly: machine: - image: << pipeline.parameters.ubuntu_image >> + image: << pipeline.parameters.ubuntu_image >> parameters: go_version: type: string + environment: + CI_E2E_FILENAME: "rel-nightly" steps: - go/install: version: << parameters.go_version >> @@ -119,7 +123,7 @@ commands: - run: echo 'export PATH=$PATH:/usr/local/go/bin' >> $BASH_ENV - - run: + - run: name: Install golint command: go install golang.org/x/lint/golint@latest diff --git a/.gitmodules b/.gitmodules index b5bb3c063..722806bac 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,4 @@ [submodule "go-algorand"] path = third_party/go-algorand url = https://github.com/algorand/go-algorand + branch = rel/nightly diff --git a/Makefile b/Makefile index 2c12eae89..2684f509b 100644 --- a/Makefile +++ b/Makefile @@ -93,4 +93,12 @@ indexer-v-algod-swagger: indexer-v-algod: nightly-setup indexer-v-algod-swagger nightly-teardown +# fetch and update submodule. it's default to latest rel/nightly branch. +# to use a different branch, update the branch in .gitmodules for CI build, +# and for local testing, you may checkout a specific branch in the submodule. +# after submodule is updated, CI_E2E_FILE in circleci/config.yml should also +# be updated to use a newer artifact. path copied from s3 bucket, s3://algorand-testdata/indexer/e2e4/ +update-submodule: + git submodule update --remote + .PHONY: test e2e integration fmt lint deploy sign test-package package fakepackage cmd/algorand-indexer/algorand-indexer idb/mocks/IndexerDb.go go-algorand indexer-v-algod diff --git a/go.mod b/go.mod index 5e29ab0b5..8ea1c33b4 100644 --- a/go.mod +++ b/go.mod @@ -30,6 +30,7 @@ require ( require ( github.com/Microsoft/go-winio v0.4.14 // indirect + github.com/algorand/avm-abi v0.1.0 // indirect github.com/algorand/falcon v0.0.0-20220727072124-02a2a64c4414 // indirect github.com/algorand/go-deadlock v0.2.2 // indirect github.com/algorand/go-sumhash v0.1.0 // indirect diff --git a/go.sum b/go.sum index 509b80a54..56c8d41a3 100644 --- a/go.sum +++ b/go.sum @@ -80,6 +80,8 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/algorand/avm-abi v0.1.0 h1:znZFQXpSUVYz37vXbaH5OZG2VK4snTyXwnc/tV9CVr4= +github.com/algorand/avm-abi v0.1.0/go.mod h1:+CgwM46dithy850bpTeHh9MC99zpn2Snirb3QTl2O/g= github.com/algorand/falcon v0.0.0-20220727072124-02a2a64c4414 h1:nwYN+GQ7Z5OOfZwqBO1ma7DSlP7S1YrKWICOyjkwqrc= github.com/algorand/falcon v0.0.0-20220727072124-02a2a64c4414/go.mod h1:OkQyHlGvS0kLNcIWbC21/uQcnbfwSOQm+wiqWwBG9pQ= github.com/algorand/go-algorand-sdk v1.9.1 h1:v2UaVXeMOZxvWoNJp6+MUAjm8Gif+ultcxg1RBrj45s= diff --git a/misc/README.md b/misc/README.md index 5fdc1121c..cf4d8d343 100644 --- a/misc/README.md +++ b/misc/README.md @@ -21,3 +21,5 @@ Once the developer has built the code they want to test, perform the following: If the error is related to goal then the most likely cause is that the goal binary hasn't been installed as a package in the GOPATH system variable. Navigate to the go-algorand repository directory and run `make install`. If the error persists then run `export GOPATH=$(go env GOPATH)` followed by `export PATH=$PATH:$GOPATH/bin` in order to verify that the binary is accessible. +The test data used in `make e2e` during CI build is pinned to a version of rel/nightly artifact defined by CI_E2E_FILENAME in .circleci/config.yml. +`make update-submodule` updates the submodule and CI_E2E_FILENAME should be updated accordingly. diff --git a/misc/docker-compose.yml b/misc/docker-compose.yml index bc12eb7d3..56cd6442e 100644 --- a/misc/docker-compose.yml +++ b/misc/docker-compose.yml @@ -1,13 +1,13 @@ -version: '3' - -services: - e2e: - build: +version: '3' + +services: + e2e: + build: context: ../. - dockerfile: ./misc/Dockerfile + dockerfile: ./misc/Dockerfile environment: CONNECTION_STRING: "host=e2e-db port=5432 user=algorand password=algorand dbname=indexer_db sslmode=disable" - CI_E2E_FILENAME: "rel-nightly" + CI_E2E_FILENAME: "${CI_E2E_FILENAME}" e2e-db: image: "postgres:13-alpine" diff --git a/misc/e2elive.py b/misc/e2elive.py index 90e12f796..0d3714d34 100644 --- a/misc/e2elive.py +++ b/misc/e2elive.py @@ -83,7 +83,11 @@ def main(): from botocore.config import Config from botocore import UNSIGNED s3 = boto3.client("s3", config=Config(signature_version=UNSIGNED)) - tarpath = os.path.join(tempdir, tarname) + if "/" in tarname: + tarname = tarname.split("/")[1] + tarpath = os.path.join(tempdir, tarname) + else: + tarpath = os.path.join(tempdir, tarname) prefix = "indexer/e2e4" success = firstFromS3Prefix(s3, bucket, prefix, tarname, outpath=tarpath) if not success: diff --git a/misc/util.py b/misc/util.py index 19b79f24a..cf137200a 100644 --- a/misc/util.py +++ b/misc/util.py @@ -181,8 +181,7 @@ def report(): for x in response["Contents"]: path = x["Key"] haystack.append(path) - _, fname = path.rsplit("/", 1) - if fname == desired_filename: + if desired_filename in path: if outpath is None: if outdir is None: outdir = "." diff --git a/third_party/go-algorand b/third_party/go-algorand index 701d43178..494948f43 160000 --- a/third_party/go-algorand +++ b/third_party/go-algorand @@ -1 +1 @@ -Subproject commit 701d431782c0cc3ddbd386e3db8640c943bcc070 +Subproject commit 494948f43c478bed908b4f379d01438ec5bc02fe From fe16e57629522f71c0e2cbff10fc2b11120097e4 Mon Sep 17 00:00:00 2001 From: Or Aharonee <17099688+Aharonee@users.noreply.github.com> Date: Wed, 7 Sep 2022 18:56:35 +0300 Subject: [PATCH 39/39] Fix release 2.14.0 (#1214) * Accept yaml and yml configuration files. (#1181) * Fix bug in reveals lookup (#1198) * add state proof example with high reveal index - from betanet (#1199) * enhancement: Clarify REST query parameters for accounts search (#1201) * update description for /v2/accounts * cicd: add darwin arm64 support to release script (#1169) * Downgrade mockery to prevent incorrect deprecation warning. (#1211) * Enhancement: update e2e test policy (#1197) *update e2e test policy * Update test expected value: transaction root sha256 Co-authored-by: AlgoStephenAkiki <85183435+AlgoStephenAkiki@users.noreply.github.com> Co-authored-by: Michael Diamant Co-authored-by: algoidan <79864820+algoidan@users.noreply.github.com> Co-authored-by: shiqizng <80276844+shiqizng@users.noreply.github.com> Co-authored-by: algolucky Co-authored-by: Will Winder --- .circleci/config.yml | 10 +- .gitmodules | 1 + Makefile | 10 +- api/generated/v2/routes.go | 408 +++++++++--------- api/generated/v2/types.go | 2 +- api/handlers_test.go | 14 + api/indexer.oas2.json | 3 +- api/indexer.oas3.yml | 2 +- .../state_proof_with_index.response | 1 + api/test_resources/state_proof_with_index.txn | Bin 0 -> 82786 bytes .../stpf_block_high_index.block | Bin 0 -> 90683 bytes .../stpf_block_high_index_response.json | 1 + cmd/algorand-indexer/daemon.go | 51 ++- cmd/algorand-indexer/daemon_test.go | 136 ++++-- cmd/algorand-indexer/main.go | 7 +- config/config.go | 4 +- go.mod | 1 + go.sum | 2 + idb/mocks/IndexerDb.go | 13 +- misc/README.md | 2 + misc/docker-compose.yml | 14 +- misc/e2elive.py | 6 +- misc/release.py | 1 + misc/util.py | 3 +- third_party/go-algorand | 2 +- 25 files changed, 408 insertions(+), 286 deletions(-) create mode 100644 api/test_resources/state_proof_with_index.response create mode 100755 api/test_resources/state_proof_with_index.txn create mode 100644 api/test_resources/stpf_block_high_index.block create mode 100644 api/test_resources/stpf_block_high_index_response.json diff --git a/.circleci/config.yml b/.circleci/config.yml index 076354f62..298f1a4c9 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -41,10 +41,12 @@ workflows: jobs: test: machine: - image: << pipeline.parameters.ubuntu_image >> + image: << pipeline.parameters.ubuntu_image >> parameters: go_version: type: string + environment: + CI_E2E_FILENAME: "fafa8862/rel-nightly" steps: - go/install: version: << parameters.go_version >> @@ -53,10 +55,12 @@ jobs: - codecov/upload test_nightly: machine: - image: << pipeline.parameters.ubuntu_image >> + image: << pipeline.parameters.ubuntu_image >> parameters: go_version: type: string + environment: + CI_E2E_FILENAME: "rel-nightly" steps: - go/install: version: << parameters.go_version >> @@ -119,7 +123,7 @@ commands: - run: echo 'export PATH=$PATH:/usr/local/go/bin' >> $BASH_ENV - - run: + - run: name: Install golint command: go install golang.org/x/lint/golint@latest diff --git a/.gitmodules b/.gitmodules index b5bb3c063..722806bac 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,4 @@ [submodule "go-algorand"] path = third_party/go-algorand url = https://github.com/algorand/go-algorand + branch = rel/nightly diff --git a/Makefile b/Makefile index 8cb68a820..2684f509b 100644 --- a/Makefile +++ b/Makefile @@ -34,7 +34,7 @@ idb/postgres/internal/schema/setup_postgres_sql.go: idb/postgres/internal/schema cd idb/postgres/internal/schema && go generate idb/mocks/IndexerDb.go: idb/idb.go - go install github.com/vektra/mockery/v2@v2.12.3 + go install github.com/vektra/mockery/v2@v2.12.1 cd idb && mockery --name=IndexerDb # check that all packages (except tests) compile @@ -93,4 +93,12 @@ indexer-v-algod-swagger: indexer-v-algod: nightly-setup indexer-v-algod-swagger nightly-teardown +# fetch and update submodule. it's default to latest rel/nightly branch. +# to use a different branch, update the branch in .gitmodules for CI build, +# and for local testing, you may checkout a specific branch in the submodule. +# after submodule is updated, CI_E2E_FILE in circleci/config.yml should also +# be updated to use a newer artifact. path copied from s3 bucket, s3://algorand-testdata/indexer/e2e4/ +update-submodule: + git submodule update --remote + .PHONY: test e2e integration fmt lint deploy sign test-package package fakepackage cmd/algorand-indexer/algorand-indexer idb/mocks/IndexerDb.go go-algorand indexer-v-algod diff --git a/api/generated/v2/routes.go b/api/generated/v2/routes.go index dd20e498d..c7d273726 100644 --- a/api/generated/v2/routes.go +++ b/api/generated/v2/routes.go @@ -1748,209 +1748,211 @@ func RegisterHandlers(router interface { // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "H4sIAAAAAAAC/+y9e2/cNtoo/lWI+b3AJv2N7DS94G2AxYts0qDBJrtB7HaBU/ec5UicGdYaUiUp29Oe", - "fPcDPg8pURKp0dhjJ9nOX4lHvPPhc7/8McvlppKCCaNnz/6YVVTRDTNMwV80z2UtTMYL+1fBdK54ZbgU", - "s2f+G9FGcbGazWfc/lpRs57NZ4JuWNvG9p/PFPut5ooVs2dG1Ww+0/mabagd2Gwr29qN9OHDfEaLQjGt", - "h7P+U5RbwkVe1gUjRlGhaW4/aXLNzZqYNdfEdSZcECkYkUti1p3GZMlZWegTv+jfaqa2ward5Oklzmc3", - "GS1XUlFRZEupNtTMns2eu34fdn52M2RKlmy4xxdys+CC+R2xZkPN5RAjScGW0GhNDbGrs/v0DY0kmlGV", - "r8lSqh3bxEWEe2Wi3sye/TzTTBRMwc3ljF/Bf5eKsd9ZZqhaMTP7ZR67u6VhKjN8E9naa3dzium6NJpA", - "W9jjil8xQWyvE/K21oYsGKGCvH/1gnz11VffETxGwwoHcMldtbOHe2puoaCG+c9TLvX9qxcw/5nb4NRW", - "tKpKnlO77+jzed5+J69fpjbTHSQCkFwYtmIKD15rFn+rz+2XkWl8x10T1GadWbBJX6x78ZrkUiz5qlas", - "sNBYa4ZvU1dMFFysyCXbJq+wmeb+XuCCLaViE6EUGx8UTMP5Pyqc5rVSTOTbbKUYhaezpmJ4JO/dUei1", - "rMuCrOkV7JtugAa4vsT2xXu+omVtj4jnSj4vV1IT6k6wYEtal4b4iUktSouz7GgODgnXpFLyihesmFs0", - "fr3m+ZrkVOMQ0I5c87K0x19rVqSOOb67HWDedLLrutV5wIY+3cNo97XjJNgNPITh9r+/cc+9KLj9iZaE", - "G7bRRNf5mlDtVrWWpX3sek4CTEZKmdOSFNRQoo20GGIplSPdiD7mrn/LjZAcLrAgi22/pSg6o+/uY8+H", - "3VSltDtb0lKz+Hn53YeHBLsMiSQty5lDvZZjcFNmzQ+0qnQGO860oYaFbarKthBSsAglbX6gStGt/Vub", - "rWUXAEfM2tvJ8lJqlhm5g5PwzAEcWED7wxPbi68g52tGYHL7AXkqgGxh0U1ZbolxF2ABgnguYk74kmxl", - "Ta7h6ZT8Evq73ViY3hB7+XBlHZbH8o0p4B4cRgS0F1KWjAoAbcdDZvb+0tSs9HCNzS3hggmKhtDNScFK", - "BptsgRB+1UbJLWzegsKcyMpeuqzN8HGIwg2Ln/tvBQAnya6GO9mx6ZJvuBlu9y294Zt6Q0S9WTBlL9xT", - "PiOJYqZWAi5bMZLDnS06L7+iK6YJs4SRI68N81jEJaQhitF8ncZKuKYdiGhDbzIla1FMYCkNkSok2bpi", - "OV9yVpBmlNRa2ml2rYeL/dbTMrrBcvwgyeU0s+xYjmA3kWu1z9N+gQsKbvWE/OhoB3w18pKJhsQgsmSk", - "UuyKy1o3nRJrhKnHhTkhDcsqxZb8ZrjIM3ccFkNgG0fgNo67yqUwlAtWWNoHi5aGIbZJrimYcF8WckE1", - "+/brFP/UflXskm2jSLcPALidRmZd2y/Yd3wXzQw7HvVEOEQaG8LfKOxNgjtolCHaiPBI9qtDKnH9QKf/", - "BA1BODdKp9mdNAU4hidvqaPozXR/QonmqwxHHLwSvjq3tHjJS6DTv9rH4W+21pYude/WU27NV4KaWrFn", - "F+IL+xfJyJmhoqCqsL9s8Ke3dWn4GV/Zn0r86Y1c8fyMr1KH4tca1RxAtw3+Y8eLawrMTbPd2BT+c2yG", - "itqGl2yrmJ2D5kv452YJgESX6nfkvYAkmmqZWkBMWn4j5WVdhQead7RHiy15/TIFLDDkGD4E3KErKTQD", - "qH2OjMR795v9yaI8JgCjB7zA6a9agiTSjl0pWTFlOAu1dfa//6XYcvZs9v+dttq9U+ymT92ErfBnUqQM", - "HzA1DoUh6nJIDZmBTVUbJO0x7NA855+btfXnbK9FLn5lucED6i7jEdtUZvvYLtitXR/utHSHq594bn3O", - "/B7PEYl7BkR6OPKP2klPFV1xARufk+s1E2RDLy1WoEKaNVPE3gXTxpN5RH9I+Rs1o+MVHMN9Mou9mMid", - "6jtfantrbyy7ewbs7iGuuCd77XHXsSUdb765+cHBHhIEVge6+1H968XFz7SqeHFzcfFLR+LiomA38fu4", - "18su5SorqKG3g9HVS9s1AqCfMgx1dduHAqDDAs8et/CwFPVQx3Xgx3YrHHvErJFXcXekqjUzf6MlFflB", - "yOnCDTX5ht9ywWERP6Cq63jN/pqbozzEFbvTPchDRrX15Cd8vNzYG26MAXe+2kNd6aSLfGCJEKY8xCF9", - "LMA/QvxhIf5vpcwvb3WXY1cFo+6Y+XulpDoAFHn+vbfr+WzDtKYrFtePhyfpG045Or9guHZmtwBaxB8Y", - "Lc36xZrdw2EGY+840vNWYXaAg73XZxXo9nbtP9jVDoa8O+yeLyGYRn/qp/fpIKXOkU/H5Z077WP06Xes", - "97vkD15HHCqBI55bzsuSCzQYcCnsTVHniIQmnAtxIV6yJRdgkX12ISweOl1QzXN9WmumnBBwspLkGXFD", - "vqSGXojZvE8IU/YU8DVxq6nqRclzcsm2sVtAJ5i4yqVcyYuLX4iRhpaBvTlwjXFWvlZhPAQ5nCCzkCFr", - "kzmXskyxa6qKyNJ1Y2OEkdFHZ2zWOXFjoynUuay58ePPYODnkdA4lT19k464w3DR9Vex9/sPaZzxkF4T", - "hC9Sa6bJvze0+pkL8wvJLuonT75i5HlVtUrLf7fONXbRYLY4qAYUNg73mbEbo2gG7gDR7RtGK7j9NSO6", - "3oBnSVkS6Nb14VFypejGeRb0vYNGLgDXMY2WBTuEzZ1hrw/zgBkc3qD9BFcIbcialUP/on3vK5Cibn1d", - "OySxEdfNi4ufwSvT30zjJ7SiXGhPFTRfCfsInMPbgpHccgGsOCGvlwSw2rzT3bldO4zZoA6u0UeNnNs9", - "ggGc5FSA71pVgLcQF4SKbd/kppkx3s75nl2y7XlgP9/TDuucbegOkljUdriGLLY3TK6pJhsJNticCVNu", - "nf9OBDTji6m5MOhI0PEGSyANeDWBm5Z9OCEKSTi6BV5LtKrIqpQLh2kaEH3WwKjvk0Yq7+wC9AEQSlRw", - "6jrOxQ+CqshB4ENM+frtv1E73p2e4ej2bg1yS640+IYx6mgEDZ/ILSDPOa4Nl/KvNQOuTCpw4OqClPZP", - "Ogb0jV/KfFZRZXjOq2ladBz9XaePHWQXaY8Sc7ns0+wBSY2SEGycLaiOk29mv1gIrDU6Ndo9ekTnZ0Ju", - "GXZwQsAJxT3VRQl+jo2HPN4xVeCA6beNHuOppcXfBVOi5an8MronEjJva6q9LyY4FHsUMYnNSQDvuT0A", - "AGD7bgLoDflWbuct2RVNnX/a/+W1KCzuYLrrl9p4t3iyMnQP9m5kGAnkvWC864v3d7H/Wmivy5LwJanF", - "pZDXljnex6NlPrOcXx2/JCmA87NvboXHgY09+LgF/0UH12ZX9c/lsuSCkYzw5gwMnAH6fsuco4tt+z7d", - "HMwKBl8QC4N2gMkjxIA7WHYlZYkDk3/I8MWK1T6LFIwDjqF+bEA2wd8sLuEBgwe8HvrTchGHxtzjBcth", - "doglLAwc9heMCXTLJVzMiZXzrmhpuRUjkXlpBom7rz/qsNqOzdOPU3x8XPuAOwIqtteekO7dZjchs+gX", - "HedkR1Y8zrfErkDDeSEX0Z7ViJP+zqkTvELqrB7Bxu+wgL7as/EIdCLvTtF0SNFa1D5vfS4RjcShPQUx", - "0XtJnNhQU9G4Vr3rk+2oPqLTimCThZOvA/YshpLtq8il0EzoGiJbjMxleTJQRGhWMuBssg4nkV2ybVyG", - "YYBgz3y3QElBHvGlFSkeB6yLYiuuDetEnzQOsa2/7xYiNipqDFN2ov/96H+e/fw8+180+/1J9t3/f/rL", - "H19/ePzF4MenH/761//b/emrD399/D//NUtQDZZVSsplenemUku7v/dSNlgZOhLo2Nnmg+/gShqWAYOa", - "XdEy4W5jG73SIDy/Al42yjB0Lptg8BRPqB5h2ku2zQpe1nF4dfP+/aWd9h+NvknXi0u2BbaQ0XxNFtTk", - "a+AbO9PbNiNTl3Tnht/ght/Qg+132muwTe3EyoJLd47P5F30cO0YOogAYAw4hreWPNIRBAmk/iUr0dKT", - "DurFx1nYhidjWtbBYyr82GMCU7CKNFXCkaJ76To4pXcB3nAQoMRNEI2lBzuaKuCC9h/pQTDNNW0k+HsX", - "ZMPdhcKsGyUuzbqPd9jecPip2zuU+yLc3j56GuSUBgAGD8cNtgO4AtXxMKbBMsle/Y2vJRAVMGRRhHsb", - "PqM2aG7axXgWxMXwybohpb1p7g0AWUSUwL3HYJEsldzAyxsypQFw8oRE3gHBluT0ZnUpIobwYpEnhC7v", - "tKAxWv6dbX+ybeFWbW/PmE59Mq2CwsswTmy529XczRYQg3w34k7IR5fcFNhDMgFUyHZse3u+gFKu4vqG", - "cgV8h1y1kV8hOCyYlf3YDctr0wb99fSJjcrzYbnJvu40HqUTmG0xs8U4/wAH5cbacXXvGjx5nzdHq0rJ", - "K1pmztiVwvFKXjkcD829beyB2bH4Mzv//vmbd275YFZhVGWNOJPcFbSrPptdWb5EqgSK9ZHxa2oaTUKf", - "/jtjF9cdA9k1BFT3JGbLaTngQgTdGj+D1+sMZkvPl+9p/nJ2WtziiL2WVY25ttWzo7W2a6GlV5SXXsHt", - "VxsnKri51ka+N10JB7izpTcw2GcHpRSD1x1/HTswUTjDSOT0BuP3NZEuQrqRc0G4BW05AOiGbi3coHpy", - "iJJEvcnso8t0yfO4CUQstAUJgdZ725hA44SYbEe0tDg+Vs2DsWwzPUHp1ltkMEf0ML33a+rsFtK5F9WC", - "/1YzwgsmjP2k4C32nqd9jT43y61FoIiND3O4PKAQBBPuI/64bBZ32lwzym2EICvXDCd1t+b209zdXeSf", - "Vkc85P9gEePCT+iIMVjuy0ZT6qGo0btT0bFZ7+HPFc444DJGfLHc43OoohbcWQFucTu7U495QctlPYmj", - "i73kqDCJyp2kJ50tlfydxbWHoHS9Hk4fTIy944NPloJ67yYhDfFeZqVbXFWThuauS2qk5zsvqk87G2NK", - "m5euvaTko0ux7aHRp+sJmEDs8P4CfxMQUL01lAp8cC8gv11HYoo/29BF9BTHb5+tW/NQr0GvFzS/jHPP", - "dk3PWy+rjt3WSOI7NwmGurd0QgKHraaty9VTMbXhpksGWsHstpwwTjuZB25ZXoCqkNl16b5KLSPD1OKa", - "CuMzLjmE5nprhpYn2+taKm0ggVp0lwXL+YaWcZa4gNM/7zBZBV9xzJVUaxZk+nEDkUpyYRCKCq6rkm7R", - "j609mtdL8mQeYDV3GwW/4povSgYtvsQWC6qBWWlVV76L3R4TZq2h+dMJzde1KBQrzNolodKSNNIKaH4a", - "94kFM9eMCfIE2n35HXkEjiOaX7HH9hQdCzp79uV3kB0J/3gSR/KQ824M6RaAdT3Sj8MxeM7gGJZ8ulHj", - "WBizlqbx+8hrwq5T3hK0dCRh91vaUEFXLO6OudmxJuwLtwlWrN65iALzuAGzRbiJz88MtfgpW1O9jvMH", - "uAySy82Gm41zJNByY+GpzTSDk/rhMCkcYvhmXf4jeOlUJK7Xe1gdE2Zrie0afKn+QTese6xzQjXRtV1z", - "qy9zCPGEuGRLBZGi3AYaTTgbOxcwKJbZBL3zklSKCwMSc22W2X+TfE0VzS36O0ktN1t8+/VwyX+DjFSE", - "iVza+cV+C3/wc1dMM3UVP3qVAHvParm+5JGQIttYjFI8dli++yqTjkNxr3SP0ftBCeNDT+W37ChZEtzq", - "DrjRAFPfCfDEyIB3BMVmP3vB4947e3DIrFUcPGhtb+jH928cl7GRinUVvwsfKNLhVxQzirMrcJCPX5Id", - "8453ocpJt3CX1X9cs79nOQO2zL/lmCCAwZ7D47A/h9tOidhSXl4yVnGxOl3YPsiq46h9Jn3FBNNcpwno", - "am0hx362JC/QiMDQZMFKKVb64SHdLzxhV14xwEmvX+5a9WBgnzMyg6bpg7Ht7BTvfI5JHNq2/xgUqfGs", - "3hlG/N61TTtCWzKGoTQvXOALev10LbC432sKenImCmTrAP2tKRcJ72jGioTnG4MZz6QyHH1PGPvIfmxG", - "0fwyqgI7t19047+GHtCBJ5ueHGwB2vF3ts+5ny1mPeQbpg3dVHHiD+psxA+Aa+zxNV2sjKRZLkWhieYi", - "Z4RVUq93RREnot9uBExWco2EMMxJmUuFWQGB0zGyF+E59UhGY1m7a8yUlCa1UGCJwiBkKQ2htVkzYRr/", - "bgZpmvs7wQgVkIOQzCEiJW8t5fH5FGlZbueEm7/gOMo5NVKyYeqyZMQoxsj1WmpGSkavWJsxHUb7iybn", - "N7zQkA+9ZDc8lytFqzXPiVQFUyfklbN5g2yGndx8T06Ii81z/unnNwK2V0iGglu4T9ymDzNoLCzhjudI", - "1vs/QyJrzcorpk/I+bXEReg2nllb1qjTY1EbjOsp+HLJAHvAdkCkg37th2BNkPsdXMCbYd2eHh4HDCAs", - "02v69JtvU4D29JtvY7B29sPzp998a7kjKgitb3jJqdqGzWyrOVnUvDQuASolVyw3UoUCKxfaMFoMYAvV", - "HW4WoNDLWuTOgarpEmboP/vh+TdfPv0/T7/51ulHgll8/CIwcYIwccWVFPaTV001EOKmbGZjN1ybj8AD", - "mBuRgXSVUEEY1HPdiBfYiLigpa55sYfCNqjv8A+/ZMWKqTmq4eF58A1r8wxYzl8q06r7lgxjeSxd5MIo", - "WdQ5w+j2sw7eCJbFB0tq0loH/iHw1n2JhHadXlXnKfIJIa9BPHqCTLqQ3R3CG2NXTGGsRTvQIyQOwbq0", - "oQoca8DPxm2VFY/jpL2uVooWbJpVHIjVj9ijicr2I1zJ/Qb4ybbvM90dzrbDL8Z5vCBywfIoIc2N0ZwR", - "LJHk6d+n4t9eYdkBxUoMQYKM9dB2PuDYl4xlmou4Wn3JGJBnmuesspAe1otizNIafOnwliFi2jNt9vKF", - "4VcMg6NGuMwsp2Vel+hoPMJCXue0VF37XMmWRlrYC8uItLpmbudagKMzpnrH+ZSlYUEPSBVzxdTWtUCx", - "3GdWt+9G9ZxKhkGIWcmuWFxYZhRjEX+Q12RDxba5CztFu4x5ELHUrByZYPBYwNv+0WkMguXjO3MAOb5I", - "exWJwy3Ce66Y4rLgOeHiV+YeeoOxPMRgiQYpDBc1VLZQrF03knoCYZX90MkhBKhUcgj7oRulINh157aL", - "QFDo+vRrQy8ZLtsHgDruZuqdKqZ5USd05Irm3ZXtB4zu8b6nhp2q5mr1geCyh7yaRz726Pqw3AOb3m0N", - "TymJpzp4eQqyok0IFHE4POLm7LLO+JYJoVoa6VWZPutCM/YVU7rrQBsol9nNjrFti874mItHSVRc7T9L", - "5v2jdHK+LaLjFuY8/4xh09CfOQedyAkmEhU1C9DX3OTrLBEzZNtiC4y56onwwymRu4BXyJZLlpspa4Dg", - "E6xUklwFfrareMloAZG8bRwRRhD1l/LoH5LYoXXA8gjNQZBoOR4Y5fEeiWYbCNkF/D/JibB/JeF/YHuf", - "8Aw8j+PuPq5PxzYOeNqwcUq2TMOpNO7QwRuppKZl3HToJy1YSbdjU0KD7qQNz+utp0hzqKVhlqCg+3Xc", - "rz2Y2r2zscltk/6Gm+c5fBVhCYT+TX5/RctEeNN7VimmQayh5Pz752+ckTgV5JQnY/KoccHwhpJk/ooP", - "c5CF4igC/RDhu6uvFlWQp3wP0fXQfh70vp3PSirPW3Cg3pV1uKC/+0gLUlHuPCDaCK/hybqov2Ec5pRo", - "jfaC+5twsXQwSGwnP1C9fkWtjL0dJpmzkkAie4Mzsu1zxF9+G4dOu4T4JGDBc3khuhJ94xgDTikefcvl", - "IDkEgewQa+oEff+nFUyCTBDNdyvv9MWW9i7CVIlDnySyhs+YRIn4giDDm05mlCwWWeN1HSsMNJ+5jJBh", - "GrydoRZcZxu+UoCh46OmM1kGOvFI6CpyBpESdQ4Lp1mHHpB2Nt5bcbu8ViT1M8cA+rUo2A1TrSL5bbu7", - "Xu5rlHYZLZjSWav7ieMmBPaH1ehg9KudQhtWjAiXyz2fIpqxS0tVJo1f3m58kQFVF9k146t1/GDf3Wpo", - "S/V3X9rVw19aDMG9BSXlc/sgASITiHbZouHRfK0BxgYPaJOwyJk1bv9TCflSzLJcVWK5ptgTEP47cdj9", - "BPURRK35pirR1cmhkkEKlb3Cu1uP7Pt38D+0d/S9+zezW7vZHN6t+bZr2Z0kZtyZ+Z/ihdxUJUszzxU6", - "qWGlVhQzIC1WUJPTq6xlnteqtTn13ZV/oiXHYnEaUmMJKSvIhVUZLux/IFJa1gb/z6iy/8FEjd3/IVQF", - "fJIdagb3Aslp/EA+EGpm5ZsCtSuub4yLumW2hUnG0iFjHsFELW+AAmwifybk2gjFo8CiPXQ2ydW2MvIU", - "2kCTU21UnRuN/ibtnAPMUlFl0MS+u/pGn5JYAiA1R627kZliV4ymlEmYS+e3mllhFRTKtjFpBuic8p5v", - "tX/GOLZOOwWGBlt0Iqe5QUWsS7UFFYY3tPoZZ/mFZOQ9rrjJ7Gs7kI1eVfv7F+BQ0ZrMtDRZkrl1bAU5", - "o6UJqYddkLNGNnbcdEo8ZFySsQAP7+fBV3cAQbthVoxxede34PJi1L29vyZdFRLe7pO6YgpjxiaDw0++", - "x4f57EH38b55sUOsEOxv2i7CQwlQQ1yy9l/9c2ozL1JRkGB+TeBtRDxa4OkyYdT2Nmkc+CrTpdxje2d8", - "dWY77DhS32xwpqW8Ziqz845ccdn1HcaWncyUTWpxHA/teawgdjP6dgeBA+91Eq7L7rNox+6ZTmmZS5F1", - "Zn9YrIP4MgPoyppo0B2nRzfd06u8SLUv1gIkseVilc64dcm2n4YIGfGLG9wnGCLSMjx6pTdmtyBp2bUz", - "daAqu8vo7MhHbLl0yEXq0rSPvKukT/6G50pSMBm2CSvBv4YL1ubWdTw+eNw0pzFmBk2UXYa9YefzbcUa", - "17FhWvcNrYLC0lSTS3YbPDddV9FkAoz5Pbmi6ZDfs3c0rS/MmpUVIKpWJXrySYHvTwFl7llEx88n3wAA", - "BfaK0MvQ/n94ZEYx9vB+WJdsm5V8yQxPBIiUEKD2d7YlvtnJwXiKVGaJjp0HBM4SPVfbbBlEKvyygi9h", - "Ug6CeBQiwbT/S5OCGaY2FhTX8pps6nwNvDtdMZ+WAvT04P/Ym6gzuo/U7aZXcZENuqI5DoTRjyVVK6aI", - "C0gkruxeo/ffUA7vpPVZ68ccgTsDjdlgdiXLeIsRkQHuAotZkDIjkpPDL+OSbU/RIAS/3wKRpDNvJBYG", - "+TfucUl3SuMRZoLZAa+XHVsaFpPoJM9pln9Am5pdn1Mh7GlTG+a4mbo92Ac8h1qz4T6n+4yHZxsRcdu9", - "TTUIDw83bcc1iyl23LRdERA9HghUaiCwVPLvL/9NFFsyBXHZX3wBE3zxxdw1/ffT7mcLeF98EbfCP5QJ", - "Gc/IjeHmjUJMt1xZz5yGhF9D2uslulxYIicFOBuVZc9ZXxQEgiqBZaHgu8xKWbFoazzg4NIheY5iq7qk", - "6KTOhWCq02lKVgRUCZgb4dRf8Of5jYi1DVlMaB0cR6ycVVBl+nZ13np1SzAnRQ7ZH247Yps/oh0R48zv", - "MuIrDHJvRoShlkzdZcxzN8aEEkIroTBZGCrouI95BKYYb7gLTU0cpC8t5LM5NIEY7Leali7QREBYxzlk", - "NMgvmcCqQRbzuVpxhAldK6cmtGuF8exS3DAyJPC6bXLb+kHZWE0OlaNG2PliuhhXyM6BXS3rUdjLkeMZ", - "7217K3aOJPLJIZOPa+gztYGX0y5xDMBYbdLm3F6GztAnGrJV+f6J4dtU9G2p93gepzYhV49aYwLiR69f", - "PiaQrDqVNjgQvnZvO8yGP21FGDg9WEs/b9c+q1gylnJE74XEkCVLqId35VxfXrXp1qFV33lw5yonRrn+", - "QDXkT3fNXTzFJxra2lkkef0yynJ08gzunZN7PlspWcdjDleY+7IXow2CATBdKNSjn9Hp02++JQVfMW1O", - "yL8gERES32Glle5tEt5WcOkUiiKwsCa5HfJDLowmmHPtLnQQ1sZdOA0M8/A3fJtUsPMZ8CWZuYmFZr4e", - "8CykcrFHkJctwDcdh81DBGRyYRRF5JvJ5TKaq/Cf8HtrIVceJys2vPUJWPmSbRW7Le/yd+iMDkGjmKe8", - "auoe3A7xlCxVhqu8iTyfr55m7Qs6IW9sb8LEUioraW9qsP6xG8hZ5IxwIZcKiXxMW5IQcviI35mSoEgQ", - "RIqcDWggDw4b4oNoDvy8dvFvdg1NUsJGWfnoDLiZOS7yMcqpw6dGamE4sj/2GH8KTrGyhMcu+l9rXkag", - "oJL2uw7XMSdCEiy2G7bEgNw2IRWu2QU0dgDpYZ95mJi1iJv/LSQUmOS6zWfeainyNRVt9dDd2a+HMDmt", - "4t+gKkTkmR8yS/fIOj+uz5aQicAm4WqRWAEFUkM1GrWHXXBFtxsmzC0x3zvsjf4KUD1PjUsAKiEB+N67", - "ahFesm1mZHxshsYm5MwbUQt0p4htgz3OE3JPEx3i6662vCu+IMsiLGsw8gbmTK87dSJd41p0ybatB0xY", - "9gnFpltIWUgW45rxc75hrVyCjFyMBeKTSCKKl3G5FrN5IMr+y8h2mmHGoUInoAL7jsPEZNtvALaB8XeQ", - "oeMWryBwTYIo8hGP/23FuiEpndKN3fBs0BmckJdNegNwScMo0TbnAeqz+o5rGMvfZJLkyuu9qPI6bPBt", - "u7j4ucIInQgicA2QN7JthlySa0Lz5aopAB1RBPlmN0um2nYxZYxvuVS/tw2HeiDfbFg7PNJKmwoMRqmb", - "bv3zKrqdeWZwNp/Zbdl/7LLtv0v1+wyKapdQkK5aDt3z4g/YwUQG80SCM2ddqbXDSDYvsQWtHRrQ0UJG", - "LuQMLEYBVd1XPRkq1TF1a/vDC1qW5zfC+QYOI6AQ6abcOLE2mMsH02Boi8adJ6fXWjnsEFpnaJ5bFq9o", - "g5WDdf5Fk34GegxhHuagjznyTcXQkVrwDWxStUruGxRWQzaU54SqVY2JMx5gfzt2kKy7xAuXIGtYPMix", - "bIgWasUKIpVLQsOXLsNQKvv1xIogWEP/jVzxvGUN2/jpBKTPrfDDKpeHVoosb5yMLZ20EqaR5AKdcy9m", - "J+Q1ZjtQjBaIYBU3LFaborN/yOl3zaDmpoforLndoPLQiX1FndofGiBbMfCpiFSj+VyrndBK14kbS2El", - "5Kq6l/QRbuiFnal18MFLyqkQ0nxG97RntZNuivDQpb6qmrInJbPn/lsNsVAWYcOwCR2tVIyvxFiB/yX1", - "hED3rytKDrpYyiXKCi9eD6hEw47fDomC5QUHwzretMikKLdjbuAR9NqcxWiV/yZNmm7DMLTbZZAnfNoW", - "PZp5F+wQANuzsofc3y2K09y5Ik1vgA7W2NW3E2sSqWET0sL+0Ls4s8DKOcqZYdLq0m4c8ZNimaefHmOJ", - "AvNZ123oyoV4Tn5nSjphtRnKPohWN+6SmrrMfieRTk3yeT3o1p9yz+T+uPkR7jBZNOPi4ucbOuAyYE13", - "4C9uV/9k5x2/SiRXD+/Ym8pcNvU7Vk3AGUcOtg2/G1rEaFH08kyHfl+IZJo8yXjaLss8AAu9TiR0H73N", - "5ehtjozfyR1y7aVDVyA8ij6dNIlZWq79iWOPWIhfOlytrb4xnHrK42+cByaBhpeQ7wocftYR8BipiUPR", - "c/R5U+7MLU426zshDoU4Q7v/XXk9Trn02Mzb5rz1OIQ0S5mQrm1oddCKOzuRR7DitM8BS3octBl5HGH2", - "4wVZbGGA1rXBspreGBnhGPfcuh89foPwtZ+HhYYprvVa1mWBWa43kESoFTEjl+NKYzRsYVuzBL04wOki", - "DLfVwQzhWRPy2o5My2u61V5P2wJWejh/qpgLO6IjDLOMoXI5fjYqR89xlvOKM2Eal5vwXiyMp7Wb8YGd", - "ltQiHUx/xK8apYXzxadtsZmu5c0b3lzZDBoQ6Lk7Zlp2tQU4sNdE2zYv/Nh+R82VBvRsd3KJWOmh5kh3", - "4DxnGh1Fdk6tuC+Ow16I5HCaNHYT/RLpCZuMsI3spb2l6rJDA2mnKr1YYWB5Z9QOixGEg49VaY+nri6d", - "JeNdW5Ue/MAbu4ILAijIeyoKuSGvfFqXRz+9f/WYKKbr0ngg8yk5LfC5lXzcPNjJjVdq6XZ+FgTQNNvn", - "whlUVlwbFdFbPviuBiX2o4Ep0rClNq3TEdqrMU9ZJ2Oh3R13WDBOhYYF/FMzXhbdTHG6XkBdHC4wneSC", - "mhycWQZL0CNT73BwsG1K3Cp4Odx1p9MeDGzXvZjOLFXv/XxqALRDkvDW1XHs6Qw3+6JP1w3xp5vpduwh", - "codt5ESQwdLep8/k3yP8d2KygikwdMtyH9pVY2qZra5HaVsXTTSOoYEdYafHaXe8RBFnx2fBJFDOhQ85", - "LjshUH9HW1rOyNXgx3puZcD8LGtR6N4RtnWFR8yvo7yPY318m1FLboopmMoJdOJouysBu6WLQ2lDqHul", - "w6HGFlbT+qcoty49WT8VfXuUlZJXvIhV9C3liucaNTD7Gozf+L4f5rNNXRp+y3He+r5owY6TQ75ypFAU", - "VBWEFU+/+ebL77rZET4hdDU8pKh3j9uWUzJSw/MuH9vsbgIS81d5spJDlJW0talVa3pobGtzqArYOs/t", - "ZyKDhaSj4b2e1fmHLLaEBqAuLdteGt7+NLe/ralet6gzqOwIFTcpcfiq7/QHIUcfp3R88CiyO/ll9J5H", - "CnG0j+RTeBshekR4mIoS3waYZFj40G0R1a4WXnwcJpx1VTLL27U4MJlZx18Nknw/5xkfFkgOx4ufOjSA", - "Sk7SciKYodMyky3HBQqCdlW3cA4enM9ZuK5YhrS1YtquKO58s1bR5CNjmRjbHHiRhMB73e1Z70x7yUrg", - "3JIcbnX5kXLajMHAp5HYIe6HNc4yp9IzkClxeU1+qn5eqjT3HOQHHQP9ZObNrvw8PcmJW07fyS3lnaYr", - "75927h3SXEEqnwmBvEbwb50agY8VmMLGJV9D26/LXN09r7tH6X+AAIGlxIQHwtAcBAWsJTl77kaaudKF", - "s7UxlX52enp9fX3ipznJ5eZ0BUFOmZF1vj71A2FR/zCbmuviyrZYsltuDc81ef7uNTDJ3JQM4iXg6oLU", - "qs9mT0+eYBI+JmjFZ89mX508OfkSn8ga4OIUE97Onv3xYT47vXp6GvpGrWJxD2eMqnyNYOzankBCOYbi", - "7OuiafRKqud+OGfnAhPx7NnPqXr0Fkfbv3+rmdrOfEHYUO/XWl+H+HB3TD3qpTQ6/JpaYZYCxUjuufbA", - "tQC8Bwi7YoJwhMSSb3hTB1oxmq8dmxZZM7Tdc8FtEn+6YsF6T8iPmgVFdOQlhByhfOEDGHwNmKZTYmF2", - "iNi6Whw3DCjHU3OyDfh/UuFNLSsIsgMrmQgclU86VSicbt7XbcK8l/mW1KK0DKW3N4GZWDdbgwIlmOEm", - "p+4EXHSf95LW6Rvwk2RuhZld4Z434oqEgjAM3IPz6wa1ppOVHYzPmxyeoaPI3Jd89kWZ9Zw0WTF7JoW5", - "c/Sww+LnwBMJXBDQjSS1YedyntGyjG0zMC72t/n9jdtmC/24W13na3BJ6i+0vzKQjH1yirZWPJ7N3PUP", - "3ER8aGbjHtK0FJ0DnNDHHge7qUpZsNmzJS01ix8Pw012jqbhCL0DLp6d84TpBaVq9L3VWeAOMusE1NoW", - "Qop41sxBlkKzBdRtic5s31dXuqr+n+iTs1Pc6b15t9vAp8KV8of9QqUn+whdQqco1WhC49PYbqcz7fjn", - "1PI9nfGuLG1hdsx2BZUQK6ZgSJGDNU0DtvCqaoR5701VcE0XJRayAz1UxxUniRCaAmB73ECYvzVNkPtO", - "SCMz/AL1xSGTPry0p0+eeN7J6ZaD0U5/1SgFtQOmnbf3CQWLPUBfQ2U0zL6pjIdGT7zXa+QZNlVt0o4h", - "NyYDSj0c+UftkGRFV1w4dyrQ2G7oJTK0GBTovBn96/RZFSz5b0xxjmFwEDNBcdryZN0D+CXK63ZX/gi8", - "mh7bDX59p3tMllBIlzLo7cM3nLLs9w4A0SMbSzB8mM+++dy3YIGarjRUwACee/bLhx4nf/qHdyfmxYck", - "W/9Gysu6agwCYVHuAXePbd27+tsWkMQod9+YGTzOBZQCae9bjNIschaekVE124tXnYqBD4gxjzzikUd8", - "GB7xXkjpHgT0HglmnEgdadTs6ydfH8nsp0NmSyB+O8js6QAD7KK7InBy7ONRWSG6Lbdee+zjgjBJzgh1", - "fl5VkIcBNLL6U6LTBxcz/qxk+ajkvJWS88CktPfe9xBP21nal3oUVoNop97BHjmCI0fwOXIETWzlR+ED", - "vGjy6dD/e7H4HWn+keY/GM1vXvQ0Qh9WNDzSd0/fGyXKkagfifrnRtQjqZT3I/FeWxlXZt6J5L/AoZ+H", - "SzvK/0de4MgL3I/830EA+4r+R4Ygkt7kyBYc2YLPmy3YX+ZvGIKeLfQgrMBRCXAk/EfC/9GVAEdif5T+", - "j2T+8yfzYVTWVMe6bpKd807VN8Uc2mYFEezaPjYjiSwtMdpB4cOBdhH4I904TFRMUIrKzrLkNw47+wxI", - "rtxvW6xTSMMwDXpyFZBzBAbb22kdo8dTPuvN1z+iE/vE3uGkh8tJHjs9voIYvyUvwW/vV3toHhDrNjVG", - "47bpU9Q3MaGQPl7zFcmaDAX2lw3+BFGvZ3xlfyrxJ4i3x2jj2BFovkqfgYZuG/zHjjdpk+7xBxvpphpY", - "bB3zHr+SOOf7Sfq++impIVY4WWJAWDj1hotsdPqmwUGWsGBL6SJggjXQmx1r8A32DZq4V0HG7yzY04pb", - "BAyFp8lbh2+oIO9fvSBfffXVdwTfvRVsEFxSG8YhsZxHuLgGbxTUNJ+nYKH3r17AAs4al9ZJrXZeagNR", - "h9o5jPjpbfxPHGv5pwx4+5ixEbhrp4FwQiXWNxrnUpoqSKMKi8MK2n8SAXk+60sVdy9o2BOUuifZm/AY", - "A/YfJbdOsUuHGR26xpdUUoc9TMr3b+Z9BQIEyg+dCg3No0OOocnT2yaYiyJ0bHY7xvuocT5qDo6m5j+j", - "qfk/OpI4OKfTP7rIendEcVCmLaXDbJvEo4ljLHGfZOxki/90BsN7Qzt7IpuHCxq9oxXpaIL5TFjZARI6", - "9aWcJ2IiYttPQEdv5Ep/HJR0ZLUOY6T5yBr4P6k6HPJjN3qlQQlFzODkkp6Pi2OueHNb/+h+EjndG61M", - "lyuteHHTqxxMuCjYTSL/+32y6KVcZR797x+1unpJ4wX2PwfOH1H1HTiHMZo17v8XKl6g5VgizUm+e0c9", - "xJE47kGtOqozV87z4ZRmu2e3oyd3S3uGuwPMVwtuUvPZb7OHd249eisevRWPcuZDKrvgkk//8M9zt4LL", - "lZHcnTDPNpwuTYal7o6qrXtVbQGam4oLHzAHGkx5RDdHzdynrZnrY8zTBS2pyNlOjRyy3hor+vqEz9dr", - "CQjFpW8EBDOKUf1kR9noKBsdax4c/fCm+uEdjOk6LDcSIs9JUtpbLvgxuUyM6i1a0nAU2f5MDMg+kVkd", - "8wToYh1+GgvPwqAsS1IxUGtU5jsGZx2Ds47BWcfgrGNw1sexRh/DqI5hVEfx7T87jGqKx4mvXs1FWLs9", - "RPlA/pNcyH07oQw29UJuFlywVgDyO2jrgxnpap6Sayju7+iwb2gk0Y2XwY59ZUqWCfoKTjhhqf35bKkY", - "+51lhirLXE+ht53d+AVCJZdg/rCUy157s0wxKtyID19DWBb2nMtyS0yTWolQ4ncyt3zyVtbkGh5LyS+h", - "vysDYw99QywQ98qyGUmMqpPGadc9g/XsDJSbP4QB6Bjzd4z5O8b8/Qm0IYtS5pf69A+46gz1CDuN2NAp", - "pcT4m/24S3GBjxGni0cxhwt6WAXr2CvCzR1DAz5jiJ+k7QucLafmYOor+TwHHOfEuAYOt88HN5LXftmd", - "GsfPo/LwqDw8Kg+PysOj8vCY2emokjyqJI8qyaNK8qiSPKok710l+THViPdfLeaoqDwqKo9qm48aaRNe", - "7ekfVibaHWtDrPhYdihkSmsZQt2UgBsnlE1Pr/gZoZDguPZ6rNMf5zEs5YhePhWt8If5TDN15d96rcrZ", - "s9namEo/Oz1lN3RTlewkl5tTyPvg+v/R8P1yswFC1fziRg5+cajswy8f/l8AAAD//6ANRCiqYQEA", + "H4sIAAAAAAAC/+y9e4/btrYo/lUI/w6wk/6smTR94DTAwUF20qDBTrqDTNoD3Kb3blqibXZkUiWpmXF7", + "890vuBZJURIp2/NKsuu/krH45uJ6P/6clXLTSMGE0bMnf84aquiGGabgL1qWshWm4JX9q2K6VLwxXIrZ", + "E/+NaKO4WM3mM25/bahZz+YzQTesa2P7z2eK/d5yxarZE6NaNp/pcs021A5sto1t7Ub68GE+o1WlmNbj", + "Wf8p6i3hoqzbihGjqNC0tJ80ueRmTcyaa+I6Ey6IFIzIJTHrXmOy5Kyu9Ilf9O8tU9to1W7y/BLns6uC", + "1iupqKiKpVQbamZPZk9dvw87P7sZCiVrNt7jM7lZcMH8jljYULgcYiSp2BIarakhdnV2n76hkUQzqso1", + "WUq1Y5u4iHivTLSb2ZNfZpqJiim4uZLxC/jvUjH2BysMVStmZr/OU3e3NEwVhm8SW3vpbk4x3dZGE2gL", + "e1zxCyaI7XVCXrfakAUjVJC3L56Rr7766juCx2hY5QAuu6tu9nhP4RYqapj/vM+lvn3xDOY/cxvctxVt", + "mpqX1O47+Xyedt/Jy+e5zfQHSQAkF4atmMKD15ql3+pT+2ViGt9x1wStWRcWbPIX6168JqUUS75qFass", + "NLaa4dvUDRMVFytyzrbZKwzT3N0LXLClVGxPKMXGtwqm8fwfFU7LVikmym2xUozC01lTMT6St+4o9Fq2", + "dUXW9AL2TTdAA1xfYvviPV/QurVHxEsln9YrqQl1J1ixJW1rQ/zEpBW1xVl2NAeHhGvSKHnBK1bNLRq/", + "XPNyTUqqcQhoRy55XdvjbzWrcsec3t0OMA+d7LqudR6woU/3MLp97TgJdgUPYbz976/cc68qbn+iNeGG", + "bTTRbbkmVLtVrWVtH7uekwiTkVqWtCYVNZRoIy2GWErlSDeij7nr33EjpIQLrMhiO2wpqt7ou/vY82FX", + "TS3tzpa01ix9Xn738SHBLmMiSet65lCv5RjclEX4gTaNLmDHhTbUsLhN09gWQgqWoKThB6oU3dq/tdla", + "dgFwxKy7naKspWaFkTs4Cc8cwIFFtD8+sYP4CvJuzQhMbj8gTwWQLSy6qestMe4CLEAQz0XMCV+SrWzJ", + "JTydmp9Df7cbC9MbYi8frqzH8li+MQfco8NIgPZCyppRAaDteMjC3l+emtUerrG5JVwwQRUI3ZxUrGaw", + "yQ4I4VdtlNzC5i0ozIls7KXL1owfh6jcsPh5+FYAcLLsaryTHZuu+Yab8XZf0yu+aTdEtJsFU/bCPeUz", + "kihmWiXgshUjJdzZovfyG7pimjBLGDny2jCPRVxCGqIYLdd5rIRr2oGINvSqULIV1R4spSFSxSRbN6zk", + "S84qEkbJraWbZtd6uDhsPR2jGy3HD5JdTphlx3IEu0pcq32e9gtcUHSrJ+QnRzvgq5HnTAQSg8iSkUax", + "Cy5bHTpl1ghTTwtzQhpWNIot+dV4kWfuOCyGwDaOwG0cd1VKYSgXrLK0DxYtDUNsk11TNOGhLOSCavbt", + "1zn+qfuq2DnbJpHuEABwO0FmXdsv2Hd6F2GGHY96TzhEGhvD3yTs7QV30KhAtJHgkexXh1TS+oFe/z00", + "BPHcKJ0WN9IU4BievOWOYjDT3Qklmq8KHHH0SvjqnaXFS14Dnf7NPg5/s622dKl/t55ya74S1LSKPXkv", + "vrB/kYKcGSoqqir7ywZ/et3Whp/xlf2pxp9eyRUvz/gqdyh+rUnNAXTb4D92vLSmwFyF7aam8J9TMzTU", + "NjxnW8XsHLRcwj9XSwAkulR/IO8FJNE0y9wCUtLyKynP2yY+0LKnPVpsycvnOWCBIafwIeAO3UihGUDt", + "U2Qk3rrf7E8W5TEBGD3iBU5/0xIkkW7sRsmGKcNZrK2z//0PxZazJ7P/77TT7p1iN33qJuyEP5MjZfiA", + "qXEoDFGXQ2rIDGya1iBpT2GH8Jx/CWsbztldi1z8xkqDB9RfxgO2acz2oV2wW7u+vdPSPa5+z3MbcuZ3", + "eI5I3Asg0uORf9JOemroigvY+JxcrpkgG3pusQIV0qyZIvYumDaezCP6Q8of1IyOV3AM98ks9WISd6pv", + "fKndrb2y7O4ZsLu3ccUD2euAu04t6Xjz4eZHB3ubILC6pbuf1L++f/8LbRpeXb1//2tP4uKiYlfp+7jT", + "y67lqqioodeD0dVz2zUBoJ8yDPV127cFQLcLPAfcwv1S1Ns6rlt+bNfCsUfMmngVN0eqWjPzd1pTUd4K", + "OV24ofa+4ddccFjED6jqOl6zv+ZwlLdxxe50b+Uho9p67yd8vNzUGw7GgBtf7W1d6V4Xec8SIUx5G4f0", + "sQD/CPG3C/F/r2V5fq27nLoqGHXHzN8rJdUtQJHn3we7ns82TGu6Ymn9eHySvuE+R+cXDNfO7BZAi/gD", + "o7VZP1uzOzjMaOwdR/quU5jdwsHe6bOKdHu79h/tagdD3h/2wJcQTaM/9dP7dJBS78j3x+W9Ox1i9P3v", + "WB92yR+8jjhWAic8t5yXJRdoMOBS2JuizhEJTTjvxXvxnC25AIvsk/fC4qHTBdW81KetZsoJAScrSZ4Q", + "N+Rzauh7MZsPCWHOngK+Jm41TbuoeUnO2TZ1C+gEk1a51Cv5/v2vxEhD68jeHLnGOCtfpzAegxxOUFjI", + "kK0pnEtZodglVVVi6TrYGGFk9NGZmnVO3NhoCnUua2789DMY+XlkNE71QN+kE+4wXPT9Vez9/iiNMx7S", + "S4LwRVrNNPnXhja/cGF+JcX79tGjrxh52jSd0vJfnXONXTSYLW5VAwobh/ss2JVRtAB3gOT2DaMN3P6a", + "Ed1uwLOkrgl06/vwKLlSdOM8C4beQRMXgOvYj5ZFO4TNnWGvD/OIGRzfoP0EVwhtyJrVY/+iQ+8rkqKu", + "fV07JLEJ1833738Br0x/M8FPaEW50J4qaL4S9hE4h7cFI6XlAlh1Ql4uCWC1ea+7c7t2GDOgDq7RR428", + "s3sEAzgpqQDftaYCbyEuCBXboclNM2O8nfMtO2fbd5H9/EA7rHO2oTtIYtXa4QJZ7G6YXFJNNhJssCUT", + "pt46/50EaKYX03Jh0JGg5w2WQRrwaiI3LftwYhSScXSLvJZo05BVLRcO0wQQfRJg1PfJI5U3dgH6FhBK", + "UnDqO86lD4KqxEHgQ8z5+h2+UTvejZ7h5PauDXJLrjT4hjHqaASNn8g1IM85ro2X8j9rBlyZVODA1Qcp", + "7Z90CuiDX8p81lBleMmb/bToOPqbXh87yC7SniTmcjmk2SOSmiQh2LhYUJ0m38x+sRDYanRqtHv0iM7P", + "hNwy7OCEgBOKe6qLGvwcg4c83jFV4IDpt40e47mlpd8FU6Ljqfwy+icSM29rqr0vJjgUexSxF5uTAd53", + "9gAAgO27iaA35lu5nbdmFzR3/nn/l5eisriD6b5favBu8WRl7B7s3cgwEsh7wXjXF+/vYv+10N7WNeFL", + "0opzIS8tc3yIR8t8Zjm/Nn1JUgDnZ9/cCo8DG3vwcQv+m46uza7qn8tlzQUjBeHhDAycAfp+y5Kji233", + "Pt0czAoGXxALg3aAvUdIAXe07EbKGgcmP8r4xYrVIYsUjAOOoX5sQDbR3ywt4QGDB7we+tNykYbG0uMF", + "y2H2iCUsDBz2F4wJdMslXMyJlfMuaG25FSOReQmDpN3XH/RYbcfm6Yc5Pj6tfcAdARU7aE9I966zm5hZ", + "9ItOc7ITK57mW1JXoOG8kIvozmrCSX/n1BleIXdWD2DjN1jAUO0ZPAKdyLtTNB1TtA61zzufS0QjaWjP", + "QUzyXjInNtZUBNeqN0OyndRH9FoRbLJw8nXEnqVQsn0VpRSaCd1CZIuRpaxPRooIzWoGnE3R4ySKc7ZN", + "yzAMEOyZ7xYpKcgDvrQixcOIdVFsxbVhveiT4BDb+ftuIWKjocYwZSf63w/++8kvT4v/RYs/HhXf/f+n", + "v/759YeHX4x+fPzhv/7r//Z/+urDfz387/+YZagGKxol5TK/O9Oopd3fWykDVoaOBDr2tnnvO7iQhhXA", + "oBYXtM6429hGLzQIzy+Al00yDL3LJhg8xTOqR5j2nG2LitdtGl7dvP94bqf9MeibdLs4Z1tgCxkt12RB", + "TbkGvrE3vW0zMXVNd274FW74Fb21/e73GmxTO7Gy4NKf4zN5FwNcO4UOEgCYAo7xrWWPdAJBAql/zmq0", + "9OSDevFxVrbhyZSWdfSYKj/2lMAUrSJPlXCk5F76Dk75XYA3HAQocRNFY+nRjvYVcEH7j/QgmuaSBgn+", + "zgXZeHexMOtGSUuz7uMNtjceft/t3Zb7ItzeIXoa5JRGAAYPxw22A7gi1fE4psEyyV79ja8lEhUwZFHE", + "exs/oy5obr+L8SyIi+GTbSClg2nuDABZQpTAvadgkSyV3MDLGzOlEXDyjETeA8GO5AxmdSkixvBikSeE", + "Lu+0oDFa/4Ntf7Zt4VZtb8+Y7vtkOgWFl2Gc2HKzq7mZLSAF+W7EnZCPLrk5sIdkAqiQ7dn2DnwBtVyl", + "9Q31CvgOueoiv2JwWDAr+7ErVramC/ob6BODyvN+ucmh7jQdpROZbTGzxTT/AAflxtpxdW8CnrzLm6NN", + "o+QFrQtn7MrheCUvHI6H5t42ds/sWPqZvfv+6as3bvlgVmFUFUGcye4K2jWfza4sXyJVBsX6yPg1NUGT", + "MKT/ztjFdc9AdgkB1QOJ2XJaDrgQQXfGz+j1OoPZ0vPlB5q/nJ0Wtzhhr2VNMNd2ena01vYttPSC8tor", + "uP1q00QFN9fZyA+mK/EAN7b0Rgb74lYpxeh1p1/HDkwUzzAROb3B+H1NpIuQDnIuCLegLQcA3dCthRtU", + "T45Rkmg3hX10ha55mTaBiIW2ICHQem8bE2icEZPtiJYWp8dqeTSWbab3ULoNFhnNkTxM7/2aO7uFdO5F", + "reC/t4zwigljPyl4i4PnaV+jz81ybREoYePDHC73KATBhIeIPy6bxY02F0a5jhBk5ZrxpO7W3H7C3d1E", + "/ul0xGP+DxYxLfzEjhij5T4PmlIPRUHvTkXPZn2AP1c844jLmPDFco/PoYpWcGcFuMbt7E495gUtl/Uk", + "jS4OkqPiJCo3kp50sVTyD5bWHoLS9XI8fTQx9k4PvrcUNHg3GWmIDzIrXeOqQhqamy4pSM83XtSQdgZj", + "SpeXrruk7KPLse2x0afvCZhB7PD+In8TEFC9NZQKfHDPIL9dT2JKP9vYRfQUx++erVvzWK9BLxe0PE9z", + "z3ZNTzsvq57d1kjiO4cEQ/1bOiGRw1Zo63L1NExtuOmTgU4wuy4njNPuzQN3LC9AVczsunRftZaJYVpx", + "SYXxGZccQnO9NUPLk+11KZU2kEAtucuKlXxD6zRLXMHpv+sxWRVfccyV1GoWZfpxA5FGcmEQiiqum5pu", + "0Y+tO5qXS/JoHmE1dxsVv+CaL2oGLb7EFguqgVnpVFe+i90eE2atofnjPZqvW1EpVpm1S0KlJQnSCmh+", + "gvvEgplLxgR5BO2+/I48AMcRzS/YQ3uKjgWdPfnyO8iOhH88SiN5yHk3hXQrwLoe6afhGDxncAxLPt2o", + "aSyMWUvz+H3iNWHXfd4StHQkYfdb2lBBVyztjrnZsSbsC7cJVqzBuYgK87gBs0W4Sc/PDLX4qVhTvU7z", + "B7gMUsrNhpuNcyTQcmPhqcs0g5P64TApHGL4sC7/Ebx0GpLW692vjgmztaR2Db5UP9IN6x/rnFBNdGvX", + "3OnLHEI8IS7ZUkWkqLeRRhPOxs4FDIplNkHvvCSN4sKAxNyaZfGfpFxTRUuL/k5yyy0W3349XvLfISMV", + "YaKUdn5x2MLv/dwV00xdpI9eZcDes1quL3kgpCg2FqNUDx2W77/KrONQ2ivdY/RhUML00PvyW3aUIgtu", + "bQ/caISpbwR4YmLAG4Ji2M9B8Hjwzu4dMluVBg/a2hv66e0rx2VspGJ9xe/CB4r0+BXFjOLsAhzk05dk", + "x7zhXah6r1u4yeo/rtnfs5wRW+bfckoQwGDP8XHYn+Nt50RsKc/PGWu4WJ0ubB9k1XHUIZO+YoJprvME", + "dLW2kGM/W5IXaURgaLJgtRQrff+Q7heesSuvGOCkl893rXo0sM8ZWUDT/MHYdnaKNz7HJA5t238MihQ8", + "q3eGEb91bfOO0JaMYSjNMxf4gl4/fQss7veSgp6ciQrZOkB/a8pFxjuasSrj+cZgxjOpDEffE8Y+sh+b", + "UbQ8T6rA3tkvOvivoQd05Mmm9w62AO34G9vnnZ8tZT3kG6YN3TRp4g/qbMQPgGvs8YUuVkbSrJSi0kRz", + "UTLCGqnXu6KIM9FvVwImq7lGQhjnpCylwqyAwOkYOYjw3PdIJmNZ+2sslJQmt1BgieIgZCkNoa1ZM2GC", + "fzeDNM3DnWCECshBSOYQkZLXlvL4fIq0rrdzws3fcBzlnBop2TB1XjNiFGPkci01IzWjF6zLmA6j/U2T", + "d1e80pAPvWZXvJQrRZs1L4lUFVMn5IWzeYNshp3cfI9OiIvNc/7p764EbK+SDAW3eJ+4TR9mECws8Y7n", + "SNaHP0Mia83qC6ZPyLtLiYvQXTyztqxRr8eiNRjXU/HlkgH2gO2ASAf9ug/RmiD3O7iAh2Hdnu4fB4wg", + "rNBr+vibb3OA9vibb1OwdvbD08fffGu5IyoIba94zanaxs1sqzlZtLw2LgEqJResNFLFAisX2jBajWAL", + "1R1uFqDQy1aUzoEqdIkz9J/98PSbLx//n8fffOv0I9EsPn4RmDhBmLjgSgr7yaumAoS4KcNs7Ipr8xF4", + "AHMlCpCuMioIg3quK/EMGxEXtNQ3Lw5Q2Ab1Hf7h16xaMTVHNTw8D75hXZ4By/lLZTp135JhLI+li1wY", + "Jau2ZBjdftbDG9Gy+GhJIa115B8Cb92XSOjW6VV1niKfEPISxKNHyKQL2d8hvDF2wRTGWnQDPUDiEK1L", + "G6rAsQb8bNxWWfUwTdrbZqVoxfazigOx+gl7hKhsP8KFPGyAn237IdPd42x7/GKax4siFyyPEtPcFM2Z", + "wBJZnv5tLv7tBZYdUKzGECTIWA9t5yOOfclYoblIq9WXjAF5pmXJGgvpcb0oxiytwZcObxkipj3TZi9f", + "GH7BMDhqgsssSlqXbY2OxhMs5GVJa9W3z9VsaaSFvbiMSKdr5nauBTg6Y6p3nE9ZGhb1gFQxF0xtXQsU", + "y31mdftu1MCpZByEWNTsgqWFZUYxFvEHeUk2VGzDXdgpumXMo4ilsHJkgsFjAW/7J6cxiJaP78wB5PQi", + "7VVkDreK77lhisuKl4SL35h76AFjeYjBEg1SGC5aqGyhWLduJPUEwiqHoZNjCFC55BD2Qz9KQbDL3m1X", + "kaDQ9+nXhp4zXLYPAHXczb53qpjmVZvRkSta9ld2GDC6x/uWGnaqwtXqW4LLAfIKj3zq0Q1heQA2g9sa", + "n1IWT/Xw8j7IioYQKOJweMLN2WWd8S0zQrU00qsyfdaFMPYFU7rvQBspl9nVjrFti974mItHSVRcHT5L", + "4f2jdHa+LaLjDuY8/4xh09CfOQedxAlmEhWFBehLbsp1kYkZsm2xBcZcDUT48ZTIXcArZMslK80+a4Dg", + "E6xUkl0FfrareM5oBZG8XRwRRhANl/LgR0ns0DpieYTmIEh0HA+M8vCARLMBQnYB/89yT9i/kPA/sL3v", + "8Qw8j+PuPq1PxzYOeLqwcUq2TMOpBHfo6I00UtM6bTr0k1asptupKaFBf9LA83rrKdIcammYJSjofp32", + "a4+mdu9sanLbZLjh8DzHryIugTC8ye8vaJ0Jb3rLGsU0iDWUvPv+6StnJM4FOZXZmDxqXDC8oSSbv+LD", + "HGShNIpAP0T47uqrJRXkOd9DdD20n0e9r+ezksvzFh2od2UdL+gfPtKCNJQ7D4guwmt8si7qbxyHuU+0", + "RnfBw024WDoYJLWTH6hev6BWxt6Ok8xZSSCTvcEZ2Q454i+/TUOnXUJ6ErDgubwQfYk+OMaAU4pH33I5", + "Sg5BIDvEmjpB3/9pBZMoE0T4buWdodjS3UWcKnHsk0TW8BmTKBFfEGR809mMktWiCF7XqcJA85nLCBmn", + "wdsZasF1seErBRg6PWo+k2WkE0+EriJnkChR57BwnnUYAGlv44MVd8vrRFI/cwqgX4qKXTHVKZJfd7sb", + "5L5GaZfRiilddLqfNG5CYL9fjQ5Gv9optGHVhHC5PPApohm7tlRlr/Hr640vCqDqorhkfLVOH+ybaw1t", + "qf7uS7u4/0tLIbjXoKR8ah8kQGQG0S47NDyZrzXC2OABbTIWObPG7X8qIV+KWZarySzXVAcCwn9mDnuY", + "oD6BqDXfNDW6OjlUMkqhclB4d+eRffcO/rftHX3n/s3s2m42t+/WfN217E4SM+3M/E/xTG6amuWZ5wad", + "1LBSK4oZkBYrqsnpVdayLFvV2ZyG7so/05pjsTgNqbGElA3kwmoMF/Y/ECktW4P/Z1TZ/2Cixv7/EKoi", + "PskONYN7geQ0fiAfCDWz8k2F2hXXN8VFXTPbwl7G0jFjnsBEHW+AAmwmfybk2ojFo8iiPXY2KdW2MfIU", + "2kCTU21UWxqN/ibdnCPM0lBl0MS+u/rGkJJYAiA1R627kYViF4zmlEmYS+f3lllhFRTKtjEJA/RO+cC3", + "OjxjHFvnnQJjgy06kdPSoCLWpdqCCsMb2vyCs/xKCvIWVxwy+9oOZKNXzeH+BThUsiYzrU2RZW4dW0HO", + "aG1i6mEX5KyRwY6bT4mHjEs2FuD+/Tz46gYgaDfMqiku7/IaXF6Kunf3F9JVIeHtP6kLpjBmbG9w+Nn3", + "+DCf3es+3oYXO8YK0f7220V8KBFqSEvW/qt/Tl3mRSoqEs2vCbyNhEcLPF0mjNpeJ40DXxW6lgds74yv", + "zmyHHUfqm43OtJaXTBV23okrrvu+w9iyl5kypBbH8dCexypiN6OvdxA48EEn4brsPotu7IHplNalFEVv", + "9vvFOogvC4CuIkSD7jg9uumfXuNFqkOxFiCJLRerfMatc7b9NETIhF/c6D7BEJGX4dErPZjdoqRll87U", + "garsPqOzIx+x5dIhF6lL0z7xrrI++RteKknBZNglrAT/Gi5Yl1vX8fjgcRNOY8oMmim7DHvDzu+2DQuu", + "Y+O07hvaRIWlqSbn7Dp4bn9dRcgEmPJ7ckXTIb/n4Gg6X5g1qxtAVJ1K9OSTAt+fI8o8sIhOn0+5AQCK", + "7BWxl6H9//jIjGLs/v2wztm2qPmSGZ4JEKkhQO0fbEt8s5Nb4ylymSV6dh4QOGv0XO2yZRCp8MsKvsRJ", + "OQjiUYgE0/4vTSpmmNpYUFzLS7JpyzXw7nTFfFoK0NOD/+Ngot7oPlK3n17FRTbohpY4EEY/1lStmCIu", + "IJG4sntB77+hHN5J57M2jDkCdwaassHsSpbxGiMiI9wFFrMoZUYiJ4dfxjnbnqJBCH6/BiLJZ97ILAzy", + "b9zhkm6UxiPOBLMDXs97tjQsJtFLnhOWf4s2Nbs+p0I40KY2znGz7/ZgH/AcWs3G+9zfZzw+24SI2+1t", + "X4Pw+HDzdlyz2MeOm7crAqLHA4FKDQSWSv715b+IYkumIC77iy9ggi++mLum/3rc/2wB74sv0lb4+zIh", + "4xm5Mdy8SYjplysbmNOQ8GtIe71ElwtL5KQAZ6O6Hjjri4pAUCWwLBR8l1ktG5ZsjQccXTokz1Fs1dYU", + "ndS5EEz1Ou2TFQFVAuZKOPUX/PnuSqTaxiwmtI6OI1XOKqoyfb06b4O6JZiTooTsD9cdscsf0Y2IceY3", + "GfEFBrmHEWGoJVM3GfOdG2OPEkIroTBZGCrouI95BKYYb7gPTSEO0pcW8tkcQiAG+72ltQs0ERDW8Q4y", + "GpTnTGDVIIv5XK04woRulVMT2rXCeHYpbhgZE3jdNblu/aBiqiaHKlEj7HwxXYwrZOfArpb1qOzlyOmM", + "97a9FTsnEvmUkMnHNfSZ2sDLaZc4BmCsNnlz7iBDZ+wTDdmqfP/M8F0q+q7UezqPU5eQa0CtMQHxg5fP", + "HxJIVp1LGxwJX7u3HWfD329FGDg9Wsswb9chq1gylnNEH4TEkCXLqId35VxfXnTp1qHV0Hlw5yr3jHL9", + "gWrIn+6au3iKTzS0tbdI8vJ5kuXo5Rk8OCf3fLZSsk3HHK4w9+UgRhsEA2C6UKhHP6PTx998Syq+Ytqc", + "kP+BRERIfMeVVvq3SXhXwaVXKIrAwkJyO+SHXBhNNOfaXegorI27cBoY5v5v+DqpYOcz4EsKc5UKzXw5", + "4llI42KPIC9bhG96Dpu3EZDJhVEUkW8hl8tkrsJ/wu+dhVx5nKzY+Nb3wMrnbKvYdXmXf0BndAiaxDz1", + "Rah7cD3EU7NcGa76KvF8vnpcdC/ohLyyvQkTS6mspL1pwfrHriBnkTPCxVwqJPIxXUlCyOEj/mBKgiJB", + "EClKNqKBPDpsiA+iJfDz2sW/2TWEpIRBWfngDLiZOS7yIcqp46dGWmE4sj/2GH+OTrGxhMcu+n/WvE5A", + "QSPtdx2vY06EJFhsN26JAbldQipcswto7AHS/T7zODFrlTb/W0ioMMl1l8+801KUayq66qG7s1+PYXK/", + "in+jqhCJZ36bWbon1vlxfbaEzAQ2CVeLxAookBoqaNTud8EN3W6YMNfEfG+wN/orQPU8NS0BqIwE4Hvv", + "qkV4zraFkemxGRqbkDMPohboThHbRnucZ+SeEB3i6652vCu+IMsiLFsw8kbmTK87dSJdcC06Z9vOAyYu", + "+4Ri0zWkLCSLac34O75hnVyCjFyKBeJ7kUQUL9NyLWbzQJT9t4nthGGmoUJnoAL7TsPE3rbfCGwj4+8o", + "Q8c1XkHkmgRR5BMe/9uG9UNSeqUb++HZoDM4Ic9DegNwScMo0S7nAeqzho5rGMsfMkly5fVeVHkdNvi2", + "vX//S4MROglE4Bogb2TbjLkk14SWy1UoAJ1QBPlmV0umunYpZYxvuVR/dA3HeiDfbFw7PNFKmwYMRrmb", + "7vzzGrqdeWZwNp/Zbdl/7LLtv0v1xwyKatdQkK5Zjt3z0g/YwUQB8ySCM2d9qbXHSIaX2IHWDg3oZCEj", + "F3IGFqOIqh6qnoyV6pi6tfvhGa3rd1fC+QaOI6AQ6ebcOLE2mMsHEzC0RePOk9NrrRx2iK0ztCwti1d1", + "wcrROv+myTADPYYwj3PQpxz59sXQiVrwATapWmX3DQqrMRvKS0LVqsXEGfewvx07yNZd4pVLkDUuHuRY", + "NkQLrWIVkcoloeFLl2Eol/16z4ogWEP/lVzxsmMNu/jpDKTPrfDDGpeHVoqiDE7Glk5aCdNI8h6dc9/P", + "TshLzHagGK0QwSpuWKo2RW//kNPvkkHNTQ/RRbjdqPLQiX1FvdofGiBbMfCpSFSj+VyrndBGt5kby2El", + "5Kr6l/QRbuiZnalz8MFLKqkQ0nxG93RgtZN+ivDYpb5pQtmTmtlz/72FWCiLsGHYjI5WKsZXYqrA/5J6", + "QqCH15UkB30s5RJlxRevR1QisOPXQ6JgecHBsI43rQop6u2UG3gCvYazmKzyH9Kk6S4MQ7tdRnnC99ui", + "RzNvoh0CYHtW9jb3d43iNDeuSDMYoIc1dvXtxZokatjEtHA49C7OLLJyTnJmmLS6thtH/KRY4emnx1ii", + "wnzWbRe68l48JX8wJZ2wGoayD6LTjbukpi6z30miU0g+r0fdhlMemNwfNz/BHWaLZrx//8sVHXEZsKYb", + "8BfXq3+y845fZJKrx3fsTWUum/oNqybgjBMH24XfjS1itKoGeaZjvy9EMiFPMp62yzIPwEIvMwndJ29z", + "OXmbE+P3codceunQFQhPok8nTWKWlkt/4tgjFeKXD1frqm+Mp97n8Qfngb1Aw0vINwUOP+sEeEzUxKHo", + "Ofo0lDtzi5NhfSfEoRBnaPe/K6/HqZcem3nbnLcex5BmKRPStQ1tbrXizk7kEa0473PAsh4HXUYeR5j9", + "eFEWWxigc22wrKY3RiY4xgO37kdP3yB8HeZhoXGKa72WbV1hlusNJBHqRMzE5bjSGIEt7GqWoBcHOF3E", + "4bY6miE+a0Je2pFpfUm32utpO8DKD+dPFXNhJ3SEcZYxVC6nz0aV6DnOSt5wJkxwuYnvxcJ4XruZHthp", + "SS3SwfRH/CIoLZwvPu2KzfQtb97w5spm0IhAz90x07qvLcCBvSbatnnmx/Y7Clca0bPdySVSpYfCke7A", + "ec40OonsnFrxUByHvRDJ4TR57CaGJdIzNhlhG9lLe03VeY8G0l5VerHCwPLeqD0WIwoHn6rSnk5dXTtL", + "xpuuKj34gQe7ggsCqMhbKiq5IS98WpcHP7998ZAoptvaeCDzKTkt8LmVfNw82NmNN2rpdn4WBdCE7XPh", + "DCorro1K6C3vfVejEvvJwBRp2FKbzukI7dWYp6yXsdDujjssmKZC4wL+uRnPq36mON0uoC4OF5hOckFN", + "Cc4soyXoial3ODjYNjVuFbwcbrrT/R4MbNe9mN4szeD9fGoAtEOS8NbVaezpDDeHok/XDfGnm+l67CFy", + "h13kRJTB0t6nz+Q/IPw3YrKiKTB0y3If2lVj6pitvkdpVxdNBMfQyI6w0+O0P16miLPjs2ASKOfCxxyX", + "nRCov6MtHWfkavBjPbc6Yn6Wraj04Ai7usIT5tdJ3sexPr7NpCU3xxTsywn04mj7KwG7pYtD6UKoB6XD", + "ocYWVtP6p6i3Lj3ZMBV9d5SNkhe8SlX0reWKlxo1MIcajF/5vh/ms01bG37NcV77vmjBTpNDvnKkUFRU", + "VYRVj7/55svv+tkRPiF0NT6kpHeP25ZTMlLDyz4fG3a3BxLzV3mykmOUlbW1qVVnegi2tTlUBeyc5w4z", + "kcFC8tHwXs/q/EMWW0IjUJeWba8N736a29/WVK871BlVdoSKm5Q4fDV0+oOQo49TOj56FMWN/DIGzyOH", + "OLpH8im8jRg9IjzsixJfR5hkXPjQbRHVrhZefBwmnHVTM8vbdTgwm1nHXw2SfD/nGR8XSI7HS586NIBK", + "TtJyIpih0zKTHccFCoJuVddwDh6dz1m8rlSGtLVi2q4o7XyzVsnkI1OZGLsceImEwAfd7dngTAfJSuDc", + "shxuc/6RctpMwcCnkdgh7Yc1zTLn0jOQfeLyQn6qYV6qPPcc5QedAv1s5s2+/Lx/khO3nKGTW847TTfe", + "P+2dd0hzBal8JgTyEsG/c2oEPlZgChuXfA1tvy5zdf+8bh6l/wECBJYSEx4IQ0sQFLCW5OypG2nmShfO", + "1sY0+snp6eXl5Ymf5qSUm9MVBDkVRrbl+tQPhEX942xqrosr22LJbr01vNTk6ZuXwCRzUzOIl4Cri1Kr", + "Ppk9PnmESfiYoA2fPZl9dfLo5Et8ImuAi1NMeDt78ueH+ez04vFp7Bu1SsU9nDGqyjWCsWt7AgnlGIqz", + "L6vQ6IVUT/1wzs4FJuLZk19y9egtjrZ//94ytZ35grCx3q+zvo7x4e6YetRLaXT4Na3CLAWKkdJz7ZFr", + "AXgPEHbBBOEIiTXf8FAHWjFarh2bllgztD1wwV0Sf7pi0XpPyE+aRUV05DmEHKF84QMYfA2Y0CmzMDtE", + "al0djhsHlOOpOdkG/D+p8KaWFQTZgZVMRI7KJ70qFE437+s2Yd7LcktaUVuG0tubwEysw9agQAlmuCmp", + "OwEX3ee9pHX+BvwkhVthYVd44I24IqEgDAP34Py6Qa3pZGUH4/OQwzN2FJn7ks++KLOek5AVc2BSmDtH", + "Dzssfo48kcAFAd1Icht2LucFrevUNiPj4nCb31+5bXbQj7vVbbkGl6ThQocrA8nYJ6foasXj2cxd/8hN", + "xIdmBveQ0FL0DnCPPvY42FVTy4rNnixprVn6eBhusnc0gSP0Drh4ds4TZhCUqtH3VheRO8isF1BrWwgp", + "0lkzR1kKzRZQtyU6s0NfXe2q+n+iT85OcaP35t1uI58KV8of9guVnuwjdAmdklQjhMbnsd1OZ9rpz7nl", + "ezrjXVm6wuyY7QoqITZMwZCiBGuaBmzhVdUI896bquKaLmosZAd6qJ4rDtAH4IP6Hmix882S1/CG4BaR", + "9mGiiGC/FJVFTAUXHWEnL6CXHXqxJRF66Q0zMQIcQECLaLyFBx5m+FGKwnVyxfcRdC2FjUNo0OSIpwq6", + "zRh4p0AyFEE7AArjHLZ5pmToiDUxw69QYx2qCQC2efzokecfnX49Gu30N42SYDdg3oH9kHC4FBLydWQm", + "Uw2E6oC9W0C+adO0Ju8cc2UK4FbGI/+kHaFo6IoL51IGN7uh58jUY2Ck8+j0GMpnlrAsUDBHOqbJvZo9", + "lMcdX9o/gF+T/H5/5Q/As+uh3eDXN7rHbBmJfDmHwT58w32W/dYBIHqlYxmKD/PZN5/7FixQ05WGKiAg", + "d8x+/TCQZk7/9C7VvPqQFW1eSXneNsEoEhcmH0k42Na9q79vAUlMSjjB1OLpDqAUSP3fYZSwyFl8Rka1", + "7CB+fV8qdIsY88gnH/nk++GT74SUHkBA75BgponUkUbNvn709ZHMfjpktgbit4PMno4wwC66KyJHzyEe", + "lQ2i23rrNeg+NgoTBU1Q56dNA7koQCutPyU6fetixl+VLB8VvddS9N4yKR289wPE026W7qUehdUo4mtw", + "sEeO4MgRfI4cQYgv/Sh8gBdNPh36fydWzyPNP9L8e6P54UXvR+jjqo5H+u7pe1CiHIn6kah/bkQ9kU76", + "MBLvtZVpZeaNSP4zHPppvLSj/H/kBY68wN3I/z0EcKjof2QIEilejmzBkS34vNmCw2X+wBAMbKG3wgoc", + "lQBHwn8k/B9dCXAk9kfp/0jmP38yH0em7etY10809K5X+U4xh7ZZRQS7tI/NSCJrS4x2UPh4oF0E/kg3", + "bicyKCrHZWdZ8iuHnX0WKFfyuPPhFtIwTAWfXQXkXYHBDnbcxwj6nN9++PpncmKf3Dye9PbysqdOj68g", + "ztH75v9mD80DYtulBwlumz5Nf4iLhRT6mq9IEbI02F82+BNE/p7xlf2pxp8g5wBGXKeOQPNV/gw0dNvg", + "P3a8vTbpHn+0kX66hcXWMe/pK0lzvp+k76ufkhqIvFhiUFw89YaLYnL60OBWlrBgS+migKI10Ksda/AN", + "Dg2auFNBxu8s2tOKWwQMxbfJa4dvqCBvXzwjX3311XcE370VbBBcchvGIbGkSby4gDcqasLnfbDQ2xfP", + "YAFnwaV1r1Y7LzVA1G3tHEb89Db+F443/UsG/X3M2AjctdNAOKESazxNcymhEtSkwuJ2Be2/iIA8nw2l", + "ipsXdRwISv2THEx4jAH7t5Jb97FLx1kt+saXXGKLA0zKd2/mxTBdlB96VSrCo0OOIUTqdkn2kggdm12P", + "8T5qnI+ag6Op+a9oav63jiSOzun0zz6y3h1RHJWqy+kwuybpaOIUSzwkGTvZ4r+cwfDO0M6ByOb+gkZv", + "aEU6mmA+E1Z2hIROfTnrPTERse33QEev5Ep/HJR0ZLVux0jzkTXwf1F1OOQID3qlURlJzGLlEr9Pi2Ou", + "gHVXA+puklndGa3Ml2xteHU1qJ5MuKjYVSYH/l2y6LVcFR79Hx61unpuu6bq738GnD+i6htwDlM0a9r/", + "L1a8QMupZKJ7+e4d9RBH4ngAteqpzlxJ0/tTmu2e3Y6e3S0dGO5uYb5WcJObz36b3b9z69Fb8eiteJQz", + "71PZBZd8+qd/nrsVXK6U5u6Eebbh/tJkXO7vqNq6U9UWoLl9ceE95kCDKY/o5qiZ+7Q1c0OMebqgNRUl", + "26mRQ9ZbY1VjnzX5ci0Bobj0jYBgJjGqn+woGx1lo2Pdh6Mf3r5+eLfGdN0uNxIjz72ktNdc8GNymRTV", + "W3Sk4Siy/ZUYkEMis3rmCdDFOvw0FZ6FQVmWpGKg1qTMdwzOOgZnHYOzjsFZx+Csj2ONPoZRHcOojuLb", + "v3cY1T4eJ76CNxdx/foY5QP5z3Ihd+2EMtrUM7lZcME6AcjvoKuRZqSr+0ou19QEOuwbGkl08DLYsa9C", + "yTpDX8EJB4TikvEL+O9SMfYHKwxVlrneh972duMXCJVcovnjUi4H7c0yxahwIz58zRdTUxvImmRCaiVC", + "id/J3PLJW9mSS3gsNT+H/q4MjD30DbFAPChNZyQxqs0ap133AtazM1Bufh8GoGPM3zHm7xjz9xfQhixq", + "WZ7r0z/hqgvUI+w0YkOnnBLj7/bjLsUFPkacLh3FHC/ofhWsU68IN3cMDfiMIX4vbV/kbLlvDqahks9z", + "wGlOzJViHfLBQfI6LLtTcPw8Kg+PysOj8vCoPDwqD4+ZnY4qyaNK8qiSPKokjyrJo0ryzlWSH1ONePfV", + "Yo6KyqOi8qi2+aiRNvHVnv5pZaLdsTbEio91j0LmtJYx1O0TcOOEsv3TK35GKCQ6roMe6/6P8xiWckQv", + "n4pW+MN8ppm68G+9VfXsyWxtTKOfnJ6yK7ppanZSys0p5H1w/f8MfL/cbIBQhV/cyNEvDpV9+PXD/wsA", + "AP//V1Y4WK5iAQA=", } // GetSwagger returns the Swagger specification corresponding to the generated code diff --git a/api/generated/v2/types.go b/api/generated/v2/types.go index e58c9d030..820eb31bd 100644 --- a/api/generated/v2/types.go +++ b/api/generated/v2/types.go @@ -1227,7 +1227,7 @@ type SearchForAccountsParams struct { // Include accounts configured to use this spending key. AuthAddr *string `json:"auth-addr,omitempty"` - // Include results for the specified round. For performance reasons, this parameter may be disabled on some configurations. + // Include results for the specified round. For performance reasons, this parameter may be disabled on some configurations. Using application-id or asset-id filters will return both creator and opt-in accounts. Filtering by include-all will return creator and opt-in accounts for deleted assets and accounts. Non-opt-in managers are not included in the results when asset-id is used. Round *uint64 `json:"round,omitempty"` // Application ID diff --git a/api/handlers_test.go b/api/handlers_test.go index 3a89f1231..ef9236a17 100644 --- a/api/handlers_test.go +++ b/api/handlers_test.go @@ -628,6 +628,15 @@ func TestFetchTransactions(t *testing.T) { loadTransactionFromFile("test_resources/state_proof.response"), }, }, + { + name: "State Proof Txn - High Reveal Index", + txnBytes: [][]byte{ + loadResourceFileOrPanic("test_resources/state_proof_with_index.txn"), + }, + response: []generated.Transaction{ + loadTransactionFromFile("test_resources/state_proof_with_index.response"), + }, + }, } // use for the brach below and createTxn helper func to add a new test case @@ -1270,6 +1279,11 @@ func TestFetchBlock(t *testing.T) { blockBytes: loadResourceFileOrPanic("test_resources/stpf_block.block"), expected: loadBlockFromFile("test_resources/stpf_block_response.json"), }, + { + name: "State Proof Block - High Reveal Index", + blockBytes: loadResourceFileOrPanic("test_resources/stpf_block_high_index.block"), + expected: loadBlockFromFile("test_resources/stpf_block_high_index_response.json"), + }, } for _, tc := range testcases { diff --git a/api/indexer.oas2.json b/api/indexer.oas2.json index 2d0f9ebc8..b482eccd7 100644 --- a/api/indexer.oas2.json +++ b/api/indexer.oas2.json @@ -80,7 +80,8 @@ }, { "type": "integer", - "description": "Include results for the specified round. For performance reasons, this parameter may be disabled on some configurations.", + "description": "Include results for the specified round. For performance reasons, this parameter may be disabled on some configurations. Using application-id or asset-id filters will return both creator and opt-in accounts. Filtering by include-all will return creator and opt-in accounts for deleted assets and accounts. Non-opt-in managers are not included in the results when asset-id is used.", + "name": "round", "in": "query" }, diff --git a/api/indexer.oas3.yml b/api/indexer.oas3.yml index 031dd02f7..f21f11b7b 100644 --- a/api/indexer.oas3.yml +++ b/api/indexer.oas3.yml @@ -2314,7 +2314,7 @@ "x-algorand-format": "Address" }, { - "description": "Include results for the specified round. For performance reasons, this parameter may be disabled on some configurations.", + "description": "Include results for the specified round. For performance reasons, this parameter may be disabled on some configurations. Using application-id or asset-id filters will return both creator and opt-in accounts. Filtering by include-all will return creator and opt-in accounts for deleted assets and accounts. Non-opt-in managers are not included in the results when asset-id is used.", "in": "query", "name": "round", "schema": { diff --git a/api/test_resources/state_proof_with_index.response b/api/test_resources/state_proof_with_index.response new file mode 100644 index 000000000..7c8e9ff4f --- /dev/null +++ b/api/test_resources/state_proof_with_index.response @@ -0,0 +1 @@ +{"close-rewards":0,"closing-amount":0,"confirmed-round":1,"fee":0,"first-valid":20028289,"id":"YLOVOY45NVAV22BERQADJH5E5LXSKJLQCOS42FN4IUF2BQ5WVJTQ","intra-round-offset":2,"last-valid":20029289,"receiver-rewards":0,"round-time":1661088335,"sender":"XM6FEYVJ2XDU2IBH4OT6VZGW75YM63CM4TC6AV6BD3JZXFJUIICYTVB5EU","sender-rewards":0,"signature":{},"state-proof-transaction":{"message":{"block-headers-commitment":"ZClIiTWJXFe6gpzHC+5imgisJOWEdV0k52xxhRkBulE=","first-attested-round":20027905,"latest-attested-round":20028160,"ln-proven-weight":2334949,"voters-commitment":"YvAZnMZrs+r/1V+MdyHco9OFGV8tLWq25p/onfPe9ox41zE0TlWZITXUGq037JepxGt6W9G/SSEu9vOhbLN65w=="},"state-proof":{"part-proofs":{"hash-factory":{"hash-type":1},"path":["waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","gUbLag90ryPo4QdPaGtlornLHX7kKgRxKK5n3Ezo55FIFZw6IKpbIVoYzIbI1uHWceoBFNoXr6fqkrPGhmSPmA==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","ao7DK6WeLMzlG5BS5j+/N9uWL189AZjs1zydciQRNYy5MVdpG27cDlHVXJkA3aU44FQm6YgiNc069Hi2IUH+3Q==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag=="],"tree-depth":5},"positions-to-reveal":[8,5,4,2,16,12,9,2,17,9,15,11,16,0,19,0,8,7,14,15,11,0,4,12,15,13,15,0,8,8,12,12,2,0,1,11,10,3,15,10,4,5,15,5,7,5,3,9,13,6,16,11,3,19,12,15,7,0,5,8,15,9,12,10,8,6,13,15,12,9,8,8,3,19,15,19,1,0,13,4,16,15,10,14,8,7,4,15,9,5,14,6,14,10,13,4,15,7,16,8,10,12,0,0,11,14,5,2,12,12,13,4,13,6,16,13,14,5,12,1,11,0,2,6,5,1,5,17,0,10,14,6,17,6,15,11,7,16,7,14,16,7,5,2,16,17,4,10],"reveals":[{"participant":{"verifier":{"commitment":"Ejf1ezIQaBFxlxsqRI+ykf/vZuMVc/2lTJd/rC2P1NwpCFecRdDsUg5eollQhhruWj6ijFZkYyECbqf4CkyxqA==","key-lifetime":256},"weight":506298128548891},"position":0,"sig-slot":{"lower-sig-weight":0,"signature":{"falcon-signature":"ugDfq6kkSyuabrZpu2qTNI31uZNFDX4ZX5mquypPWsHoXeYXWZaqfeSUYFUall8XrmFwBTFtvTs45ZTDQwyrQ9Qt0BQp/Sp0g+LUweuK8tz8z7P8NHp7smpZFzmNSgpDaUBNIYjTIjw2qAhNMCwWBWdqWmdS18pZGim51UTUQfR62fk0frw1V+hqzIW6y1J4fbxoFKm9hW5opCPj4WrlB0Xi0He8kd+zDICgsa0Lm49GNn0fGi+VYgtTclLsl4kDQunRQ7jFa9hl8cMkChSrY6REYnJyAbnXl5Z6XRNVXhQd0TVwZtq3Z84Y/BaC+WoX1tDiwJD191X5VZpL3UUFzkCbgoKIPUh90i0ArtcnGo/WYts7YuZs4zIcCIas1ll8LpVxKodGEGq/G5OvLuuFsZ57THSCmkHb8pu5Dl8Xl4ln9YjiIqKukOL/eUvfvdXrFGIJq8CfZPfHIqdTOql45JF6D9lW7DN2NX2AYOle/0UH1lfxUKJdLGb+nPQtFVt9tmtXwjCzcElBK9pENCo9WOlzKUtBi6LvJefX+ZaNWXVV2NkFJjH8L/1j+OCQvQp6kTHMJ17/LbQnW/IPbOV0vz54gjVtxnw2aFkeNbYlt9qE7hrGhnXG0MaQyQeS4YhqPdpmMUasJ5JHsq6TiKsOheQTiqas7kLQd7UI8p7IxCzVN2zhSlvkGdkOBVLx1dpY68mnMSibhQZpjTw4/shMydh5TNONq+tJuUTrleX3YgQiSaDxNNDtwhxLdXjZP1k0mTpp5iWIlxHims682Kh6RrossZdfka43La82Uzl38Qw0ER/I2BoE2rmEN+oSBIUnTH0ZBJqTGx3pEnm07faXgQBUBoLgkGQKsgRHVfRbEmjpZ8GPdH4s39ax3EWgBZLJg08/5YveX5zM1iSaFJ0l0tNBn1f/S1qEwftgFiplTUDiRxb/z+q+zG4ryldtLc28EEbVyCZzLnOr3mSM5MWXi+nbaUMau+7+Ly5hNp4UZU4izWQr7Tty1fNezEVJHa5meb9bZxUO0I/rt0f9W6SoohGsUedMVPSAbb+SE58PIWh7iVjpQ7w2qwICsDHIZoLHApnAPjapKirVL0urFsYQmVKDGfxYKySbcPmnfi4EZIpJJbDlkp87j7NrJH6rRcguJuynL/jlhQDM7D/IYoxmh878jm15y67K6V1m870Lo5ZjWggKP2/llW5eqiJM8hl/lUNsbrDYOJUbG5xO0+qtq6ma+jVfzGuysDozNdqUOwlrqEX5LQ1VoHtZpdfYlJ20q2BO//PO1hIs90lrHRRxZc1nUSLjacC1RMvMgnKct6GSTozbv1hB+OUOQR+hZKY1/dzgyruILMyY8dkO4RrDriykSg/OOpFpSS5q5RYfxhZKzR9YTTEAcQoZQFHVOCIJHJv5PBqlu9Hm5FNbZx+ynklMRta3xCC33GlqsX/lPimUMKxKpD+c3FtkminlMwM/+dC8A6VHm+hyQwA2CmqVf+du4KZ2VbxlYMvWrYhYWmVZEEcRRNiRSAgPZjKP1b3eDnupN5v0IZiWYwmubalKDwudIJEy7GOkueywzTomyVWY48dsIhde3Qfbf4sqFDQGIwZ9uUYfjm/LsoRtJbqb+lf50D6HHW+b2GDpm9Whp6sI","merkle-array-index":4147,"proof":{"hash-factory":{"hash-type":1},"path":["ztbupAoGcfxPIL7UHWA5g3OYpmhUr/h7qviVpA3+ICRhkz7x9BgFMdwmI4hqU4yLMRPq5fxlOcCYS4s+xWFjfA==","z+K8x5kRSCA8CwYwjIyLpy8rtmCX+imNVChvzmeAYm2oJMgK6JC/DOd4vhjrLrszgJwhIr8QJnApENWb0tlEcw==","rWoDRojXDfBEz3EOq+ytRKXXiKTwfcppEB6uzW7QnbGvO5RZ6JcmEF1V/uxuaoxco3zFLGVDkzuqZ9DeSFf91g==","z4sJFr74GvB5MLK5pe7yU3buGVhijIi0K1yHayf4Muumqsi3mew68M8yBIVib+QCmnmVbh+SqUixsdMtzYcz/w==","wGcvTxSivf2hVwYn4+L5diM6JlbgcdFelNSGPq29YqU/ckFfluUCPh2W+A5BOMVnPpJ5HPoVO2pMWwlL6s+QKw==","Zagi3rqFONZrW2bUri+U045W1H7Hun8N4g+13NlfiULJD8d0jjM7prLFM91SfocLZznggLD4OSQHdYmJ0j5ppQ==","WP7fAdmSGTMxRPPJJMY2mnyMsb/vDPQXgXGwaZ+qdAFP2HBs/igHUik3YYzptdNAkx/YWljzHm73OIaHOQ63sA==","dQj6z3vB5Fzjl2OIue0ifGdA1ujQ+GKviKGNDWEL/vg0d6YiAHPG4ipEQAhvaZY7phRRPKYd5aTlgom6l4hNWQ==","OSYNVGtX26BfSYXM5qw2PvsJfhiywDVJrjSXp2r3KO3SyBsHSopnE7BDTfuUP0QsZC8iLH8+HZVjdvp7LCyCrQ==","CjZ9FDkv+GHFHmoZTFvOLduE9e24XL045ziO92WKbpUl3PC0UqdAPb7jYuF/FOaEHIw71jBCK00HVp2+251UUw==","fllAv1pSMPmWMjwO7hPhm5MmuY/XLWcTBPDv2gbjO46kG2h8d8ge9jtS3YK8nuY0jQKprF+x1tt8swvPNCO+PQ==","Iq8g8ou1Y0a+FoyiF+VWlGRh3hDF+ZE6LS0r9MiydvueUdyR4dkNVgVmE+HeaUrXObgGtPUET3H+Zh1LoTeN8A==","Rv4BOBcD7Ydmhfv7JBKHIpSpC0GpDYwp32540TzdxRtTl76TCTm/uBV01n8IM4zhAXRbbrvnQ+7FjtBd4OO+NQ==","vxgPeq5KuNKHg2AiAGkf+ODwc8cVEH/g/wYu1qIJUWwF7zkTFM70T42dOasew5YF8i3s68XyHwpzViZMr8GuEw==","H/hqfX2d2n5F0xmnCMqJsqEQ/AuKS4t6EG9xpB8h/wC50dDk24xHP2QESwvh8VKjzSJHMtvi+xZugli0rgmqAA==","cBrVvb7NT0ZcvbuprYwQxkztXd19AW7CgcZ7dXBKzU+j7owSvezzB2mHTAZODJSHGEgEtGGd2JxGvya9gS8hTg=="],"tree-depth":16},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"gXBhWirMNCHEMqYv199mpZ+KJAjxMIwzrYTm62jcVT2fPwk55y+Dn4IOJdmd3eZs5GqsxxL5bKSDy8owA+U3bw==","key-lifetime":256},"weight":506298128548891},"position":1,"sig-slot":{"lower-sig-weight":506298128548891,"signature":{"falcon-signature":"ugDq0+LyuJhiL6RX/VAy3PMij1xlCXiSFiUiMI3UUjrM89Usoj5y0gWCKY5OMSpMX9c73rUeZMm012UZ4zVepcvqc8vY3v2ZicKwXfPJcQW/c/JPugDwSMtZsdcYyZXZl2ph6iItqcgyzH4LBbn656rqe6CTQqIInE+tODiY3vx+7FFRlftMhBHoq/ecvGASPm7zZvzoERrjCNWe3LLHz/t4JfANAszMuqiyWaUmtOwT4JHLT0J3RqX6kaczVLXqFr2b9q0ZETnYo9iWFE1JbGOd28HhOkjTeKwxMwJQubI15yoKVM8LHcfm8fBYcI/iCBTqhPmxjPJHVsS6I9y3m5R5juniGRIWgjBesl1uaazb7TEll7xV3SYg6kC/myi1bWrW0LZwB69n0PdXeDoZvJ2gHDx+ATwh53pYolAlae3ugbyyFxjSJJ2qMGf/BoopJ/rHgbETLz8f7+aPwSJlv4GFiaPQayySq8jURn5ZzYYK9tWlnB9XxkifJzKsXF6HWbXGFphMJS1IhBZH3WHnGyVc6sBMVglt6yOR1t1B0FBINni3TVxKUz+ukM8MSR87Td7fCu46vL0rms5JuVAopEp1JHRUbENff5vRpdN6bR/HGzxQXn0HVEMSCBNJM/Bb0PSHGsNsVPQ5Zp452NxMAV+EWW2I3cqtxlZVw9KfwENzJ7m6p2882PzR088A4SbW5Oc1341KlmiC3ta22KvqcXk344cS8TpcpW6orG1hKiqrbulYsTExYitH2laI7jXUM39F23i+8QmCGvi6qD/trpK7bfZca2LmgyfrWeqoowJaLtw/8PkmHL/2+IDqKGcfiuNd9SmfIghB51QG6fH7955yOJrrUU0E9RBTUY9XxOzn/hjmLl7mmnxgfqW2b0eZjpGkypRREDUSSHoF/tlwNXq5zvmyjN7rUTlubb8frJYZ+cYYswSWZXKxdIE+6TL2hxovrT0XPH1reb5aGROJVshxob14/SHjdXSIQ+p9En77aEtfZnY2hEYTnm1zmdD39jGKMd5PWuO7Wm0yxz07Zbr1FhY/umWjiDKuyiTO+g5oZURMzeEHr4cTTPi1HcTi82OqJHLF21bLnmzNh+9opBBfKkJqDluQyyHCuzJIviwIcrGDQatK45xp4gFZ+BSZyRzotD2Lh4OChr23SpUuJG7eD0F8cSRp21W2YcU518aXOgNRiMakaUGyfFxdY2W2pLd2uj6o2OQq+66F6xGUUs/zLNUnlVdbsqbKiKRXLJslPM8/fKPn1nUAvnFSC7wigzIT3cocrQpCCdXk+xLlmJgvRjbMiJ46H2hsojhn8tM/IsXO0NOuCzKJ65684qqQMRPWbxMrSF+EvVndcqDmes10b1Bo2jFu6youg/sARnBaW4S40cqQS0M1ncc7tBIc0k2i6pZyIZa0rG1Tnb3bpQpJvMTA4LpmPjUM06nOJ1PjufxBoXuopwm/8e03kSac0ruS8nNJl73I+jbmGvS2rMnEcJvbE+vCw8oGBsWiJvo8imPo0xOlJ3hvefflXbBjZLET3LbE64wZm4oVfkV0iCrMswrTs1H84rPfTTap4pBDlE/WrZ9WNnGWVmlezdHtNleX/VrLuuZ27ogxzfkXYzdTLf8WxQyjLM2LuxsyzVQ=","merkle-array-index":4146,"proof":{"hash-factory":{"hash-type":1},"path":["8+y3PnDCR6SbUxNU6qpHh1XYGOY1AFwcmhanO6q7+tEhxH8ppPspYWAMppbv0kg4WrSNJSYMWUCV1Bz3qyTiCg==","v9CZoRUpgztEdDaq9V8s91U5pdQv0xn4L8I+lEmotohdbthhVC8eYIkzEJMXCL5NG81HIMUTNZNZF+o/0gJI0Q==","wUMeV2i10EO4r0mCTdCjlAyBdhWbj+Ui4yzWhArEl2Vgz1QHUwAfRl6qcjxDx8G4i9XXj4Swuo88jxkhLZ8BEA==","ilcwNoNWZ3taqkmw9SHFqDHgcXDDyX8FO8Z+OMP6EQW0d4iZHuiRhQzPLoUcXZqMhMt2eVOE2b9OsOp++Ho5rw==","EoC/ROFvbypcpJRSOaLal8AOwUxSWxhfEOF9TUHvFZAj8F0xetdaGgMwbxtzmvT2ffCJxJaSZekVxGZYGsSwhA==","83ZkniCaRs68iQN1IakDLqpPCp5mVXs2J6gaPA7JxyfSVqtXpyld9S7ugmga19z/Gsf7SioiNKEF6Dp3eLLn/A==","sTLfxVq7VdkSHU0/kEBT/o4jaV3haBU6CDV7No2QENfYWkDBoP3J/isWW1AmkbgAFsWNnIulLIxXYvPUZh+XJA==","oDKmwEIMEBvONx1RgffTysW34XfCSxZ51Ipjf2UbNALkENJbglA48XVDxM9yRPKbuJSZ0oA2DsqCryjNiv8kLQ==","guv60VkxK4Vx4XdN074ILICvGmlKjyAwIkChjtxiaT1CC8XMKJvbGKQH85L/4Pjauh/E4F94YwajTzMRFXn4yQ==","eaYV6b3EKlFCS3fk/sI5VRZq8tzkl6TQMMmhT47K56jxM92srzrxp6vQpZNMp7EyqefDkb9beYDNz1/JTwZcYw==","6DrAG0D6/7KcbvuqMNO4q6gU3sngzFqsNdwOunr5wH5WBWf85Ginsl6jJq6w3qFbuNgfjYaopl2DfsdzlYa/2A==","CIG95YVeE71v+ZbqZUtU8kCzoxMpO0hdUjCx68+RRsDcgQzT9N+6JsqS/FOpEZCq4Bq7Kax6OzTnS/VAo7+S0Q==","82FbEhcImxqWu85Qk0tmu5O6RtEWK0LUHOaj/NN/bnEUe2tLCYOSzOfJFa6mZN3ub4bgwYPe0ZlgYoCsG7KxfQ==","bsCQOMJH2BJH9Eqm04ZDLrw/wcBvr66ekYpMKDOQo+McwhROzuOsvmt63kodnSIjHds9OYe1cP3RsDsVCiU+1w==","5nTILTL5d2rVrv5VYBirpRSlWfvhQRMPmoN/j8HL4yZd8cB2AsY1/jstEGypzWZ4WZ4u/2rrGdXgUaJSNbTzqg==","4JQhclO0lgOlfyvUXJPTXPf7KHRr+D//38R4sl6l/ym/menmGZITiTJch468cpUODYTPhC1c6N8dWpPfIys+3w=="],"tree-depth":16},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"7pd3Rl8V7SB28ws0EOilLRM0i8IijsmP2oAHmOFE0RfJ5jVLeJP93qFIqo0cSkXRzCr1px0ajHWaCxD6d5KUrg==","key-lifetime":256},"weight":506298118547901},"position":2,"sig-slot":{"lower-sig-weight":1012596257097782,"signature":{"falcon-signature":"ugDSR8+2n/kVhdJxXEXLOK1MLupvQ0dz5/gw8cxA8dEbpMBCICRpEcPFds8k9bWfFc+2hJNpScfCPI83zuQ1wmaMimubpk2mrxbJ99OtcOwSFfZVDmvFnoh8Et2ky9jaULVjxHlen0BT3ja1hmMQ532r0FX8jRIQa1rXbVFU4SpbqNeqBCpS2T9SSH1WC+9KWlPK+PwnrVIup88SIkTHsDxKuqxcoBCNu5lE8+RZBhGC91czhyW7/WjmRk5GRha2spDMmhiOLNpHCrJC87rQXHJF+0ReifoQISWuUnjeD4w5HRFxBFljBuqFUXjh6+ddP//FWQxRxJLgb5VUBp8ZdLtE4Zz5NdqaZNkDlZHTEYlz3bhglPINhRMDBhdIGYwT19m6iOq1W4XjJaelGfPfNo41uvg0GRTYSIn2rNUmkZ7Fegbm/dE12seghi3Fdic883wSijNNT/OjrQ4xsmygN8RdWx51/YdkWz3uCdT2S268Ig/bsHgMdMSh+fjLUST3IJPXNiKeRLtxRX5ZLkvILPWb2X/Y9+lZ4CKyrOVYj3pgkn2UkgcmLJAo64+jIGVvCohuU3cf7YZy/T3ifs47PW8yePfp0B87TEW04Y9pJtnmuPOuH0+Gf7KtcigzPSzk6zos5rtZjGtvzn7F1kcY2m1nfqOlbWNNta3SC2btAs0pSNcdVNQSNctxOltLI1O8w2YzP15kdRZU8W4sIgKqJjfptaDl2pgXSfGwyV3dTNcg67GCZoRIW+3yixKT/W7u1QyPX2mJDFSLnk2/dh33MC4k0jDuUHBcTSQV8K70v9B8G7Ounc/6Op8yCk8QpcpPnIFGeE1pUMIi5MOOt2cjM9lxr4kiMAbZ/XAVRgrwsRZGd9snXBq8RdPbF3swjiHfeeTGP8SgTpVu329wyqDo/u4/vBgXE37IkpxnEcuALtpDtDvFYqjJPdA+pPpfFKrsM6xDc0maa5jVYRC8KxFjBwel3tZk21Cu2qOYJ7UuP7Ga3I7Iz3SGDZV2v/0YxW89ioHdNFAb/GqAbXyr7W+20dImsUx6w17enzq8Bg0uwIwcXaC+2FUNEp6qJ+zvZ0ce7vWpBS/zWPaXVuutiZLwYp3Ef2OZWWuTvj/fzRN0YZaK+VRYSpvFwYFyZVT8lq7wkLxunNNu0sqhbiX7YWn93svKmZxVP312gY0qbsQMrzbVnitMtjkZBaSI8tol4gKNFi9vu/N8W2Y16tz/3bakNnF7ajSfufCzkOvmCcNa1UmxfGY8evTkl6ibZhPvSh51iczrNYvCYBEmZOu+SLW6bsHAhDY0YF5EsgTd49jSWuO4JiG2gZ6tQxLkqVBWWdG/4/cptsUm6M4ydGht2gmMW9fI3HN198V/CqOGwMLZvQYPjTd+3X3SVvanzWI8UR2eZpY1Ol9hWtMEkJ/VI0e5jLqU7CYv94lk4fp61sIkTGlYo2Rd/DC0Kb7txKGxrszxU2TiuqQLiwRjDkNUsBtW1aRmjB71picJktFatzIzDGa6EsKmiCq9oV5jCgWJu96JUizix1yMgYegoq1y5lCYyxYfwvHEEEoLr7Iwz4MUSvKM5KaR6EAzaCwtoyX1jgc02W4Z7YOS9cGIm6kVPU0tZjSLCHvq0D702RJjeKxromg=","merkle-array-index":4143,"proof":{"hash-factory":{"hash-type":1},"path":["gPA7g6zyIMmGv9LCOnq8+n7PNToJJzIIzduvDwAvU/JoOGYHp42grEBQ+t8caqaXhDXywrKONiVm2yVR0PVMbg==","LlrpzXHOWzaur28LGY1l9HBtwmDFtnyNk+9IjbaAjNJ3XTFW709Th7M2KOchBGKIVO6tHvUIpBS9g2EF+0dOIQ==","R2wlEgd/Bwi9dXCZo3OU4v8UttiGgL7zBQqEF07aaNalBJ42XTv2RajiLljwpb32AwTq/Bk412Q//74p5BH+vA==","xdJvHcLZuQuNn/L5QO/GvIoh50ovmNvQvblxwYpY5jDD6/ivoO0/Tx7gGtJbD34qNiNDWM+aKORcId3+PyQ/nA==","bdPjZZUmQz7Nn5bf2nBnbIJlJ9r8/JNgt25jwP1zuOMGeCt9QH9FAt87PN7pu/sJyz3Hf9bN2Ft8po7UDbxiow==","AkdT2TEXmL65tzVaOFDv0i/o1co+hukNRnNDnRFl9/Scvq3suuCREXveoqq4MOLcQIBxRQfVgZmXmbzFH+oc6A==","IluB4l1vIgbECwCOZXPUlVUNW85CeFd97KR//wbSwzAvh0PNR51M2eLPvgFnyz0/65kkJrIFCOdqcRhN9/Tz5w==","6fB9eEI2wJyjcJfJfXcVlMjz36K+k4GJNcP9aAFNI9TFLQ0u9FcIPIGZHLkIEDvgPM65CLNRPz40niWIvB7Paw==","93HYUta9ahYUzCzTKQ8ume8ZP2csN2MnAmhrK0QgP69cOboKVvtagMoNPWtEN6h3zYvh5ff028NWBh7Y0j200Q==","886gdc+KcZSWGbgor8CBdevqD36PStyXYsfCiYs5fuiyQKeeYM3Vm+fcEJqd+Vyr6Inoox2pIG7ABWEi5OSkeA==","Q0lZ74Q6BKcOJrygaQseQzlE9K/Ta57+tcEqGjrkUOCxEAoAyKTcfLsLEz8e/0zQyT2WhgWyXAqirvcTKhRmTQ==","1X/VML5Y7W6WsOTuhILUCnYNEI7P935/9pJ4un/WBv/lGCgnw6xy02jkV13aVKxGG4zv4knkj8vSkoSbKjJ9rg==","B3FsDfI4yjW83YQOAvg8Nb/Z+aTUNUDDXV9M26NjrW1O4zDDcnpBB3K8LbGHXwlAw7I9KYGqyBaW6P0i3EPSbA==","tW8IuoFt5DM5iRhEqlNHfr65/QtB3q5omdcboXwpvQBuEoKQU0VdjHxVX4DsTzn7YDnT5WLdIh2J5iZAw8hqCw==","29uIcBTALKG5030QE/xFIr881yJ5eyFZfqc4vsh9GnB5wbmTCjrp5Je6iJm6tkeXy95Ee022EmDhs257ZB/2hQ==","TDzH2J54JRgOCzHFWpK3V83lmRBDumsaxI1RH1UpFxHjaR4teyMVIJf9SYuBEIacDH1/ME+/AJ4L+ElREuLg2g=="],"tree-depth":16},"verifying-key":"CmNu4lYfiKGbSOzSc6m+LkU1dxCC/wlWe1H1Ax1kXuoACdcooaBhtu6hVWPa10IsYB55nB4xsaL5TnQwesSjOp2JFiS4xFE2gf6qUNx1ptwc53IsVxh1mREfQ98hwu7DlZ4TNijbW0rU5Bf659YcJjSTOHbzZMuEU7B4gmxTJKrVHqfWD6tT8ripK5lNE3VjiWQWvyCoJ0ACqvqg2hOr0GgNlp3oiGQNsKB13LmcwLmR4gxxhcSJILEPy7JKpph6FBvI0KVaguUFoUJNsMiGVr8M6Xk8dQYVk7xgVkGEbdLeuzHt2qIIxwVFKxu64LGLVtSrARoSuiCTlglWQhm4Z5h7ZP9CTVNTkOfFAQgj2S7iiH1K15d0RjcyGABCfkeLgTkkAyWVsoKRfyC/HcMwpIDjUNCCoCQOswCLfZRqD2GhJFq7CXLlK4qDd7TrB+zg5K3MLiMU6MgzoG0XslaVVRhoKpPkkRPVyqDSghJEgqbQEatrgrlxlwJh6iykjKSZna54mRhi394BXPrUqNrb2q6UOtIMkCZxfUAL9kCJqBHRhyFNfokavThrS0GenPk1Gx5oCdipk/Wj03Rh4HFXBnNxGhIo9NDRn21v84YZZnQVrEpJSKoLopJkRGrITZEEmWzSrTXpmGjeD0eJZCDDXYILQ9Ks6IzGHSoIoWmfg3Of4NrjnNZPjyojAUaKwQ3ZyBsOHFc8pt+G6EMuSfi0FV5dKmTw12JYVvaEDtYTrKdBkrqHO3gdXVA6NlZFHRcFoNub962MRJK3EXJYHk76YJTuAiSfQTUoYiydCzjt84QC+kHoEPfFCRKg4VZFLIAAocV+0V+BsU9we6hYgcYhft4mFcBtLyRaZbHRayJirbhuDA26MEoBxGhLiLb2cyYVsB/Z1kjCB/F5Wm6m3gbwgf5yhp9Odhldy1dGQE9kfrx3AhfgS9asE6WNqgw6NXU+rUBpvsG0edrklphSZF/qpzv5MBC3EM+g2d1i6UCXKM5j+4olZRj0vuV6yzQFBk6L1a8XUm6NwSIeF7cKqkLc1HIHej72AV7fCKYhV4ZcKyWeXYEQ3fBhbbd7CZdXW9baloKZz5Rln6Fto6SieBy7L+bkl57zdMpktnAqYWVmpdwnTH8UQJ6toXJo8nHhibQkWfPARXkLxTYzbQOLSNyDglcUCkYQlyR1T/wrluxlopfUYtaCQnHYEleSMIGv5gp0gCryfcPfFDTxZXRonhiwyGjIpV60bnF5oNOFfyEjIqhQ/jxYcEmFytBz1h2WkZroh77IylUv5VyOWZudV2JjLFvijOuNctHD+ZhoY2fIlsfn6xNrwHs2nUpzAvRGYFIAYyadnEFaC2NeJbZQ9m9qHsk3IQwdmlBJCNUSg0aWWhLwoueeSlTOe0Yu8ryOcesAmeRr/kGBZh/hdlDfsGsYEXqZytNWk/B98Ji6Pdr3XsaCg6pgKHlwq4a3U15+dajJMEQhenUMw7SGNhGUWfVnli8cBYo1xVpoGky0Z3dFt6A+lgsY07ooyCLWmB19Yx3CwDDAmXPV54NHLaSmgXLxSaMUQUT+MsLJHXxtpnDjqEq7htYSaxNhIvaFpHJOnb6KyjF0wlqUqWAXq6iklHQAs0sWZbmJryVw4ksjLtKxjcYBXb7hEhCXDqcGNiWRA61a1VrVwwyVBNSB6frn4jQNLyTUhi+I7nPHE2n8P/mIEzWQKGcVgRUl4WIWBM4ogZVtcyL3GLdohhBMyddsAz4mMay7+yBOOE4m2uqJjwLs1lL70vpeaUzVMxDHbboCo/LFuAnSryApRchFUKNxhISuD6Z5ZGyKJ34deTEL0nVzjK42A+8kvLD/50OTIwQtIQlV6cGawETCDE/Rj2WpBOXTUEF077CZ5rZTYUqJ51dJUWmyOexJfy+6cyTg4KetqLcYtp/+tOINx74htwlNbOLnp5Y76jdmRagxQkjPVx8NeYx5emMWbYVsAfvkUx3cPXFx4gbcNjVW/UYr2uCpanpTmWN4ReDF+Z/sB3kJRNafTT21QJ1x2x6woFg8IL2MXDseRqX8pWUiVEG1uJbAfv3kIbFJFZ+Cd2IyCQ6eWeIVUdlWmVkdhy+QDXyVz1tghO6nNqu4gKGApg6MdhRQQ7FezaWOaCOM9FyD5Yb7gc4essVpLqZC56XMRWVmLuwGtx/ad/LrBNYdb7z5H/m7YoFykbqV+gXbh90+gmVVcSf1dFNbQwANEME4TUxYs75hAYBmGnx4Q0MMYAGOQJbUJCCTvVyNpp3XUgeEWwYnwO+4ZRaBsM1rU4RwIvGs2F3uakN6TyyZfuz24eyjaim4x4IkLY0OuzgLIQOPujPEvSiVA3LM0+RusIe00JeMmYZK8FhI+p+RiJZqO6DNdq11lUcAT6o="}}},{"participant":{"verifier":{"commitment":"CUEyPrHSn50k7CCnxOtjQS2v4msQ4FlpgSIuPs159FwGaBpjGFjYA3ORLi4As5KOpSXPONF5QWBbaEXNR8U8LQ==","key-lifetime":256},"weight":506298118547901},"position":3,"sig-slot":{"lower-sig-weight":1518894375645683,"signature":{"falcon-signature":"ugAOv9TbxTn32ce7Li5v6KJE3ncvsayF6bAsHJqJb8A5bj8rWwtNmHXbZ9U4WGVe1NdgVLSNym8bZOuXKThQKCj+0I4EtUuGqvwNlOL/hqrlHWtDaBvRA3/yeSjjRt0TxLMev+BjrzbDOTdLfts/BA2G67r4XKNzSN7aahV0Zi77E0iB+zRwCjVQ4Whbg+tQhPg/LVIGlyWwT0bWn8l54E9/u2zXE2aoQtp1lPMjMe3jUfVoIthXi1uE7rGTtz0D7rxDHlWSD1Z7TWmiXO15CXRgsiRpQia0EpLPd3kVeNwkpCVtWq8bacmkgqqllWcntaia/nfp3zYR2eWY6dzg70xNs4O2xWgbloCF+wm0veaokKcXkIF27ItaCLJuN8Wzg1KGXRCYuRuoR6hT7NtOj9Fr7pOoscgb+77F5+wxhaIQdWArPZKgszLMFl8r8ZVt1+kwhhaup9ENljPUFBt08aG2Uq6u8RoWPdyYwOFXxMnRmLr++jMFLuCnjwUTEqLHX/yM82KMK67wlfXmWOYIRhINvg0k9FYgnKpclZiE/axJyZFAKyrTubmPw/wWdeaQxEBguQJ9tZBZd4QdschNIDg/aZN/qXWUiRKnvQq0tLW2km1dsoMT3yibZnX0Nj1corzPWKiW2sI3soHpPwvsHIWhLEFCmSrq7lvr2Sn0PdI69vM++0akjBIVaZBHrd2HE4DOweRovaJvdZHJOjM0OsOCrJn4JlPBx4o4dvoENP+z66J2npmOnJcTpM88hYFlaRscCg6NFRXLLcTLKQ3dAz9Bosj/uAMCS2UV2Ex5mGqz9j8LPmANdFlu8CiqCa8xqzQTHJcROwfx6yU5t4kr2rp72MMNYEucdPXQpbZkqibixotcfWxA8vl1tsNn6eawWH/FwI44P/weuIhZETWAaCgr9fI7iof1FKxjwa50fLX8rV+4QWgfj7NaJTxONfG1VuBfSoOTSVxh0ghqwcbn7RYZF+GESLwRNbogrbCxB3p5InWxZU8IjpwdXE8GsW5ybnptBCcayNRdQ8t/6VDUuZN4lI4FC1DRZRFvq7jXiazndEmclFrxM4lDIvZbmhVL/KaGomlTt8bbO44QiyQL+2+ubtgSLZdIuDabBZ6IWCF4b+V1Mt/utS0f0iP8eZeZ18IqgJhtNYFoxmTzKF7CPkHzKCIWeBR3EMGT9Ul+dW3WEm7+s3un92HUtnV2mQ6AtNKqm8md6eCBcGhbE1imdn8wdIz1U3T9FLEGySEJMwOuPASIn+S6KMJdoJc0XyuuOPQ1k6kKxSnSYzqxukJQ0aEaLhPg67BM/V6LsffjiZzuyIW73KO92aMQOzZiEvxvb1SE1cSjxT4H4QM38KGxn+cmKBv9t0s1KdwTNQs8zCIA20Cd1jy9YdwpbqJirW1hFOYXLWWmFgtHuU7xT1LECcTrG7V9oS+d/eMSw5r3kUQjetp9Tpl8jFv1GRN7ybZGWEGNUfgtSeVm9CzBtkyNvC9fcFNU6vksQ/gPe9UnPFDDDGWo2JvL2R+ekSxnQl+69bQjStSoNQOfoXuR6ttIgZIoRVpNw9G7dRqPTUskaBsdC25aTWWRJyLYo+6I8uezXkxN4StMLTYrsY6fvBlbwRSOjR99wPzBGsQZMIA=","merkle-array-index":4144,"proof":{"hash-factory":{"hash-type":1},"path":["YKnJbxxJvFBn5xrT8okgW76DDy6Z9rgpJCXXTlggrSuWl4tHLJjsmdyCEmFj4VcazJVOafyhl8JyuXMeiB0Kdw==","H1pRfniIQUkWuxgIoP25LAsXt3c68ZqPtQlK4CeHKKFn8TA0qOBoGLGZD9DWMPT/Ut7xYSAVXFo2IDoV8Om96w==","48ndzdLsH64jyjk7TV88wIoMmvjFQwKsV0kJZyAYItnFOiURvdWE2vHr7IaOGJLeqRFiycwll+neppF9T3vYpA==","cNFr0vpCZsZM8LW6FBzb/E/pBWNXeLNNUgPsRiHPNroEKP9wBWBnXWtCCLCNQ2GsQcQg0S0NiF4nN3B3dIT9vQ==","rVrZse2pvC3W1445l5h1W935B76UNW760OjEaeZxArYYnmlExkxr+7nYWbHsdftXYCkIzrwgZl5MX4IkBwxI8g==","2GGUfivENbVhET/y9C9EkPBIyrTo9XssasCiuJiWgcKSsjk1Uxd9WPhpDMzC1QjDekkuBfnLVb6K0ZFaexUrQg==","M0/2CP1YEIcSEJpAmJLl4hLDJaJeACkO2wZznuAbSjgMyiL+kUZmqizUZ/IwpuiXBuS1AIFkIYvpoE6GEA5rqw==","3+54gKjTIwEqTMYffMC1jU2sJdxpZNcat7mJHDPWDq2EjevCmVeAdVtXEXnpbiN34693be7rdCtD24MvD9j0MA==","775J0xPWg0QZXUY+1HBppRY9rfNzR59/uRWszYmTf/wE4RDA38fqQVQPng3WWI4pleOQ00UXUqAKZQe3dmH4Fg==","f8MAIx9ainP5yVpSW8eRF0yDd2rnMSbz4qj+xZppxItWI4uO5mwqWusuAcR1e+SDaRgBU4P6Y5yl58b+EZJcCg==","uDLJQKy8eM91cU4zuk9b0aYJNhhuliUHDyiqaq9dMR3Bo/ZE1kG/uq4WeHTv14jrCX9E46Q3fPUKiZQlO9YNkQ==","GzGw+nFdZzhslJDyJezj0tLVMVGx3V7su208KsUY50sRZzdyaa9cW7090pKRZLAEaB+Q1KXfhbjx7Y7zzA4Vig==","chqnxArkaMhxZcIocs02z5pFNZGkb0J3mqLTROqv+qgvQgplvtXdsJeUjYU4xu3pvub3UV63e+b555KoXuacYw==","IODUohO1IFYRHec7L/l8T28vhUUZzlriCXkDdSYgzrYRzmk+0tyhlj4fXPOL42awAKeFARdFZSEdKSRGjjUWuQ==","LNl+1UI5mrasRHoTolDKvJbfDMSnmKnKVXlqzTajJSaV9BwA7KLSc0dw+SeUg/RWXanNvGm5do3+Xggn7U48iQ==","DPqbRnp99MYzTF19TUDuiP0kOoiUutMwVjSXd3faq/pvv3M6cEt3HKUcYOrb6kmVp+Jwjmwj8JXXXiCkOs44/Q=="],"tree-depth":16},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"DSIbLC6pU6JYMKha7vK1Y3T3sn0pAqZV/2hRFT1DCy3VTYuLXdR0P8SiDwkf1jHnnqj6iWXRpqi8f2IDWOMubg==","key-lifetime":256},"weight":506298118547901},"position":4,"sig-slot":{"lower-sig-weight":2025192494193584,"signature":{"falcon-signature":"ugDPj2B5XZ2HCSJMvi/0g+0+8scObAdivvG6BSCVldozi2CeVdicY6mSxcB0EAJXk+kll6SojLt6njTzAMZZbvXsEzLyyPN6SgZF1tTm8nTpcizruhhzJ55xkocdGFtwkpQWCKC6cm2xVlIKzltRZb4RJNflqzA7Aj8FoFltW9rVONATbtbOtIbSIOVXDYZB1fhJvWQOZ8SqHAfatwY8qvLXgqvM2qgtSoaOI6XXY1G0JBaGPgh67jbCI/Vf9ZzY4z/6JAjOxQRkJB/sncCTk2lFC3+V1ecsfN6sV0aZpjDXb5jMYvHP84D0xpQcIo3LVz+NgczgpKMMc5MWDykLiPV2M0SuOmq3Vgxny35UKHJ3WhhiLXpoDDWmfJXXJSBhSTsczrxQqP4pl/WhUwi9tQ5A1DkFUikNYnMWqreMy0bawurC/nRbilNTsLb1IBxkg+nLcKOwx89xhU/YrmbBkNm6cS6TOuNatGmMDbpkenzaOwykdl85G06UaedymOiM5vcRjC19iI2svb0d2JSRmzV6zmGOItlEsaiYw2z8Ms+PP28bJn2irwY3I8JL/nA1l73zqR2YvP0qQO8oK9SbXgdm7e2Mwx5iFJwg+3qku1pab8lUoZdqrzTxGJOJTm8/PkTKkuni29+1sMwbaaycFx1jyZ1mcIR60cio4Ijz9xcp3odmJl7ljrT0odpTCyXy7TDLE2nCtZgjX/9vNRdgVx/ZjqFGjMOFPkOYN2cgIwbL3YtgycmC6roJe8qc+BqXRZSqHMreUUaHIxDYK6ktYRk2CaRHs31Gcj9pgWVXiJdVz/zF13pcAiVgUBSWELDH6h9OVLYp24KuptVhIvIIijCTlppBBmJpFP0DbW1TzpUAXuBf7kpQI/wcRq1JgDb5Q0PFN03l+5NJe9XNgzgsylTyJ16kL9RyjsEqapkD7rNb7T/2G+KpqbB1wgPVmqeQjwLf0IpQ8++nqhrsOdWaJ4k4nnAIy8yeJwhKQ5CLGFarZmIg0l2yOZBDOMPGkmxjuChVqsuivmSRWoZtfqfW5ZJNF28t4LOStDK/x3ZN9ncKuz6ZFrqjALXM70jWTzED02C2HS3m3y8Zmx2m3QVoG8TGDJ718Gh5KWCJGyq3UWRRYlTONv4UonMa4O15L+Qxv4Qgl7T1ckSeKxpU1+fm2SY6kzZQmP6kibh1JR4q0RrE5UzUQeSOCccmpNs0qWaTqi0SjecNb2ySFyG5mspXpKJvzK+SU3ubFylVw9BvulwDRZyhvgrxAxQWYh0tlsmjGvOx1nW3FP53oiNLYS1dJF2Dx8eMw6JVeFEU2bZHGumssJ1H4JINU0axIRmXRTrE4zMsw6e4OOFije12uId3D8VJ/vENKdrEJBvSivwmeLuKIe3YGTjlejSisLWHaQ00rS6ihlplNimhvZV00y5bZ1Fr1UcX90TgLR1lwZxb8CwSYKVd1NMalPANRbuxG3Pm0vUUije/6Sf2WYbstNoC2mGoVX9MD7zy2mHKBpsRBdttId0bwhntsEPw0Wpxaos/7QPDqYbD7ajBuXLccjJkcavXzwRU63iEQFpoVHtFp4bIrHrdu0LBiOIdzeLjEsKv1ZMkElOPO6PpFp9UOpq4p/2XKqrDTDXQ2nrr","merkle-array-index":4140,"proof":{"hash-factory":{"hash-type":1},"path":["5Jg1ExyErJL+hveBUiA/0vZNX7zb+4W0ynUaO7PxAFlLw2IUCT/li4lrQsZhDdYBiqJprP2fOL7yHqmWw/uySw==","su7PpzXMUI/mievrXrDZxUPti14AT+SAq/QyX25aJ/BYyKZDtJeK71JvvIkffkXg7INIcqqENWpq6XWWusug1w==","xlxaIs5AwuN33/acS+KJl0MjlgQki+knhozaDhT/brncRWlKQwzTqt+ARYYgCrz/EX/UaiTLsbWrOuKzau/zOQ==","EzQVR2SdOoi+9SO4k77bBv+J1gQhJy5mtOYrAcAkJVwJSzoLKglAbweX0W4KbxNHVZBceWTPHM4CitYDfdXMTA==","GPyY3R3aQsdMZP5lqksy3UHMcIBDKRVCfM8O+VyG//Rf2B1jKyFCqKoooem2ENYAzUyAFI71TcpPjqwCzMZf3Q==","fvOVNHtR+11Ds6meutoqe4TtkH/xr+VAW+tSM1w4AI28lZJ6oYLXWpJsqwIk8Nke74FlGxH+o2oxNBr/8pj82A==","iEjrBrlSOOZJoVyj/Jpm6TUVPmASEOIKEX2QKuCEgGnFjDgt4TSqU8llDrQ5QA0/28Df2ZPy6Fa+zSOaLRR33Q==","2o9Y1C8Iw/UVAapoCJAOVBdKZ+/QAtiR+zgyQXA+OtfZQa7eW9X5ilypEMnuW5B0U/XzAAsi3BKoPwwFDcFpkw==","yrLWtqKXq43MqpTp83XF1IG/WSwOqIoGEC31mxQ2mXzx1rWc+acHV0wVn10ibn5Mlnpb4no4E6LSXpP45qTDNA==","UylMpHwUobIrgbQYQyRYiK7ETUGFWq/t/KoHdjqSc0VX/q5uFi1bWUF9KEm7n/4N/+5zvWHcG3wAFqapBA0mZw==","WDxc6EoMYc11veWphwgpL61RzfENSoZ/qs0EZwV4/IRzjWYxzxcis8X60T0LuLVt08FRXaESVaLKkg6jCvIfbQ==","IhcMM5Z3zEs8HRvlIHzccfZp8aTs/hj/Ts8az4KS4bPkIvlIbZkQOst7NL8isPdHOoxXkzczbNLFbUK1jv9z0A==","60jG6lgePp5mct0Ndai5ywanZTHwYfg8zP1XjqzouSjpRdBvw8IRwiXFMjmMq2cYTLOjoo1NfGCmJdQ47Ld78g==","4inAl3qCGXugLAgXIb9OfzsCBaGo74pKsA7s09p/bBJjs510dmOtO4NSQPPWFuYfoSo6wdgmkl4T4mT719/pow==","IR4PKvZrkgwGCGbv1hbVV2sGzCi9YTe6LJ0a2ntbb6qXu/o20Xxp0NPPIY32EpcmsOZnr/5ZLfzyXtCS6DwvJQ==","80OhrjpXqku16OTD4gmI0ZX1JvXPjvnrnNNvaHsI1byzRhjjxDH/ePHjSJ2BNj5bPoLTxnd+QG0SrjiVXZoRyA=="],"tree-depth":16},"verifying-key":"CkCAPanom0A9RR+IKC30VF5/mluStwxs6ohD4o83cEX5iIFvE5UlxRVFBm8FVAZ/GtIcEAD4aiDtpX43c+PSxCdFbqDux2VbIPK0+hMsLmFaZCkW/SY2a3XAm0Ev/bimr90hOHgj8kDO9b7mXHZ8Y6cFbEAnSWy3sKCOcFiJUW3g6RvTl1tpeGomVYTsmgKro92AgZvduPVZhZxdwtT3RgLfOzmAlmFbYG/gi1pMGUBMtNJh3kfbZAZRm6yVzT619UVuqk0PNVj3iJEqbXhHpXfeB4L9M8snYTyQWVoL4EvHiCIHezkZnW3lsxAmho4F6ACKEwPaUnkBNnLswp3MreDd1pACag8bYo+SqXKtksfJAw1VaKQ3ljBY3h5y3CWhFVDxgbiGbCZILQe+XmVs6F0GVGoVkEjKtMsH9GsyJJRnawFnViz6jtRraFUR1JknKimF1aGWqyZKFD3qVRijvfgzMnmMX2fNTlLK1clyrJGD0mv6gek1tTKr4qIQWxq/KGx+QDoyBMH2KOCygXwuUl6JucAoK4mh8aEU19FPUWSDmwAbfh76+bLsC1lrQuGz2q1BazHI8iHo8lRAAxuWQipRTJnS29n8fUK5QDAUJBTgbXakyJKRIGcoIElcGjhUBWnFAkl5LqX30TE72Cz65kdMcxBfcBnh0wJRUNEo6klYlIeo3RKkmoYB832CWJ9tSuH4xNunXVEEykBYh6Zrw2IW3pragNgAa5++QS95cMBXo0hTUBymrTtVACD6ksejYj7YsW5rafDHkISehJu2JotiV8mtjSMq8w6KBdC9YKwMhjjekcgpHfV8KVPAum8rZUSIZz9NI1zSFxdxFwZURiwkKlQpWeVEkX/iaZFc4BEKKr5B6UhL2RTFedkKJxgasV4S2QXlgtgbZmC0CQFplDoJ8JGvdgCQVeAKormUVX0obIa3FxaYR82sH65hlEEJFA44xm0nqYt5Nx7lJEVg2lDY+mfkl8ViPdQ2TZYyOjzPhbbGrWgWDoCOZH8zMr3oNGGUX3I0i3KGTLfhJif74PhVvMkC4+0jQEp7B8iZkCxd3VhRojt1DtqAlitmBj0eJogIdxaC3ouRl/qrVv5aCAxcqtx3GaWn8W6VVGbjbGoZyjihhQ4VJAwkGtiXhGTE6+mjjARUORKoDqddiWpY+tFVkDuA5wH3D2BXrArESt9yHkTTu8jJig4xXde5Dlq6/BMoCp4zKuawRoKNnF8WocUc10w9/TAq89iPGHUVMxQhdFBOJOP/2UKwLGh4fGnIN9bkSsuBSQqEMeiGyiFUAUIH6eB6gDgP2ysrwCPK6zSG3t069afxQCENjEELQl5C4m9IMhhlE2Qmff6bO9HsB1INkXYcroxGIvJx5JJ1ChoV7x57fgQEeI1m/3NW8ZuVo0IL9jmx/yeJCjCfeswekzLNx5JjxF12Bo/YE9xhcjqpK8aQKA/C7Kb0Qhp4OoESR4BnJ6ymcdbB+qLoqIQeBcQBPgMEVYiIs+YoG7dIjFN1VnZN2Y8vxh6WOMvPI9L4phjJSISxN0t/GiwT+XFE6t2cfM7LakSUChpY5IB9DYZhVBv5mtyVEWlDkRHClhXRXhjVkN84AMpaO6KRpSJn88quOIvcJ7JOhANYDlYoU5SfK1z1VDKimQJdo+amnvK8gKe5c9rntQgGGAdLuZueXka/2w+hseh5X5n0cuCLUdao/TmI4Tpsk++xqlnZ8iqjCAHx2oXFBEjsZbsz4Jk6Uu/WCIAomW2Y9WuTwYcpbwpfrBN/zmpXyY0tcNnXe9LBlpPU6pH+GbOWPPnyld6pY6HXOUQRvyuK50qabMMWVedjAMMNlta/NbIDtl+4Fji11j5TVFIihaziBf2Mme9M51mZ4gFHzu5zvVQ3UItgM+UsUZ8CBAwGMrfUxb+7noUCrhd/G9zNtvwDYRLEK+CKp8WKnDf3l0KbAc5Ktelq2Dm6PzYLjKgHpkKy7+H1NM59NMtB7LsFevrWpcIvrnrFowrcFwF/YmpqBXy2aLRfJ1YcHfD6jeXNBl5GZUcI33WG7cSngV6WQS8oVgP7lZiKgm5P9Ws2Vhjszq98ChHpnSzJp8ZjSIJhxXadcuNG0dUlmBIiTINTdZ1kirWdhWrd8LpXzOQ1QurjXx2FDIgmEzEn5T6SxGbBmSlnXL76/NbZuRAR0Yct94CumRBKSwE1dimG/uo1uabr9JWvay3CrViUpgmtTAM1F5UJG+pVMmflZIbW+9BGFRdNcCRwoGF5MCBCFk/da4hWI4K+rb14BsqYeAkFuvl4Rvtrw2yJr+LXylIOMcSCs+OIFqwDu2mpuhq2LraB5Ra2rUul99PZu/Fz4keIMC2gDiPjSU4dzWq2MIDKFKD18EmHUwTdt0QzSy8="}}},{"participant":{"verifier":{"commitment":"QH+bJ0jp/LeqoGNUtLTsz+rqQDP1R9S/wQQXu3B/FxqS/utcGRQnFA6z1ZUhhIdiWUpvEryamTwwUUcP6hjhJg==","key-lifetime":256},"weight":506298118547901},"position":5,"sig-slot":{"lower-sig-weight":2531490612741485,"signature":{"falcon-signature":"ugAIYuyO24Pk8jJpUriLyBY+KYoJDSbERjhEu2j2yOxR+s/K3w64z585xzSbon3pnL28TfSJln4YqeQQr9vW/MnleBuewjzEL8uPgcEjmJhJQFfSlA7XrIPFTQJCUj6PcI5ptZJslI0GLHEIhKyyuvbIURVUyg6ShsuO/847yebjjFainwtB7b0r0RRT0KhS2mVYXjsy4/Qwj2i7OjEehKDNykrlleGGmPy2igzTa3swBCZZsCmWP2kAVZGPLlKvK5Ve02Ysm8R1TcTfuVDpZG7emwMJtMJnsgcz0byqsdrH4dpztGVOWseNqVnWWmZp+hHAjOsaW6M3r9+ZlAr7VcSXskibpExLhkFkqSm5ro7jw1ixlLQl63hWpTn/6XkJQmVC6i3bPTcFCDwH7ZRhMX8LznSlTBkhdmAIPVelBHTXqjZlGrMNaRqGGZ4UH9MKg0JUMjtHrBiLK3POg5oZ1tE96/1jDHTfbbH77/F7zTjPnpijmXyLoNXvDt39TmEcoyJwcYRDS8KrJUxJBI3j1/m+aRF8PLB5dyOEvTrfagxHr1/m50yArPkgJpiiaSId7I55wGtPmU6Qv3kubJI71JFyM0PWWHLJRXmsZdHJ8fjupT1ICx/18K9yQy7I+GD3zHEIrCqT4lNZqRKonrHMl9XNTnumceNylwv5jHvQKytTN5zZ+/DKkM8PrRcO0mlR5NoohiXosbbDzAoCySYwKyKblMC2MzzPm72TyhV3idTj05iIk7zV6DJbZQaXES+MHbP46EJoPidSvs7nTiMm+UXl/Ak9To0IVOLWbH7TWa9DcAopvMJX53Ri3z6QV+3uPJNkz86VY9dYSlsSlY3AiDrv7ENTagIWNHB3EnLMlrZ4sSXPMwbla3zzoiZ3EE16ITRoI3F3RxMeO/iNIIUsmXOM54XTMsjheffuOf73cxgbU06MscyawaiK8dWFVlPELRGng12am644x4OhljdvjJXHjjHpFSEsgZgzLK23XCb6yV1to8bNxtRQuVluK5ui7fO888NBinIpbQ4NXdj41x25rGIwq2xnZeDX5P7pEyykT529bM3F5s1hTG4Vt8nQjpL3toeViYN1z7R8Vn9GRco3iN6ItM2RhvaSqeld9mZzJzOUTIap6MNpenCN/ostoUxgceZl4kB3djnSbdbiQRF4EmZ1FZaZ7bWgO5lxjejn3O+LqTezoEoDWFDRp4/ZNr4ReutRnuFINBSYHDJDFPK+srJlXo5N65LdfCxqVP9W8LP4XOljEc4k0NTXBM/Du3TTOdX9r3oY3P9DnUm57B/aAQd+2DRWb0CXMw5ivmk/T8ySbukkMAn2ghM/yvkR4hC8ZZ1anCQx7D2SBY6tyRdWyTj1vJ79urnvtnxmTWqUl3PbnkI+z8AgApPt+LNrm62n88xSxoTsJyquibHEGixqMucum2L73kyaDXOYWBY0TgOY9ZL2Ob6ycpa7eQV5YCxmHf4iQzakxfvfa2R6SWhBWx4aKSpC5kcVQz7U5HGXW3R+pAcwUmf16Dpo8XY2OwwdM/Hq88gzC4X/ra8yV0m2DbVAI4mdjwpOvdwc2UUKj3KKirv3eD6ZtEF2v5waQvaUNpBF6FCJBgniMVfVUXTgWWqEZblqWlTp0LDpCA==","merkle-array-index":4141,"proof":{"hash-factory":{"hash-type":1},"path":["GH/IaRjeT/Tx51RKTINJQU2Nmxu/2Wv2ne2CdoADrz2+U4P6mKcL1jqaMWthopshUHS4P7BWsYGvISlMg9gCtA==","UkejL7aZd90xJRFsvjWkrfo3vbN3ekXrMqo7n4qHzUQcXurYD1a1VYw9ur7UtSjjk48sKt1zgELQqf7j2ZZjNw==","ELVN9RqbVw5KzTt34hXvMSJ1VnJOo7KsMJamtioZzercWwF3JuDF7tzyF99ForshIaf9QDsBaZDRtGi8i/7Qew==","RfLyYcQI1av/8qvok3R3RUeBckfxiLBgTpJqfJrAfx4H3dFNbAbOqo+4lHpVvxSWG8x4Nr7uEp6EqUBZeeL71Q==","an7LMERQlp5Jd/uQoxjrKOyKBxUuX5TTaiPSzAkvOCJ+VWPbOsQrq/UiXLRYdZKe0ifKJFcOF5I8WxTuKqBeFg==","S2Ft4+8hfimMvg+1HZw6fsRR1nagaOBv88fENbbt0fFHiZrZbB5WZV/doQUV4LY1AGYTXlwTBTK7nkRoZqfPzA==","LZ9swUCEZXpz2WsobNaXmzbqdNq8qUujbmHC2RW7yd7QCzZf0ZYfafo6diDdnsYMkaExwSwlwD1GKGtOIdcHnQ==","Q+P9QUl53NV79C4bHidZQSmVR+bg2sEhJDQ9GgrWdkh3ps49TzaxYennkI8czTAfzxeRvAJ9q8BMzUjvO1GLqA==","nQqqNgl8dbUMHo4Gny/ONd+TeBjzdba/6oUbl+0LbQ2dcWNW3riXDBcqOpjqSorDK17Bgik+mW45eE5hGzoSEg==","WSDr7G9lIM00yohI7LM7+seo2tps+2t23VN7sDQDrCFNWJ0F8TBSpuoA8B4R+3Y2IB0wBvq5SQ9NaT+DWMkxkg==","pOKciTr13FAIqiq0AXlo7M+pkmuwsHnDZAKYl6sy7Q9oYbZ10zfEMPEGl50fyPRqq7I46vENe1pv4bUOU6fH2Q==","5ds4xdiPg/ZNgHZYyh/Yi6ak9pKdEZhkunEHepSaLEgT1yOa3agK2K8TpGJkaEJ9HTLwS5kMy/a9BorgNJdn1Q==","zUHGYjWSldifjLt5LBy2R7FTBm+ABDUirI07SViSQLRL69JlSK5FSO1VkuXP1Fg91loQcSVXO7/Wdx0O86eLPw==","pr6FgOQ/mEFJTIqkNNn41yBihSiQlZD7T6K/2OGXD/5sUxkRBN9bXEK6Vc1OhaVSEe2Mn2n8Y8BvAeJfp9aMNA==","XrV97m5jDyyDAdT0fLPgO38lmdfvesYcnJ4W9vLsCwfqgUao5qmZ8w8WgdSjxuTGTPpOQEI/gJmipkgCN+T5mw==","U/4vtS6Ilem6jZTx0g+UK6aEdO6Sa8jufjzDTN6De+kNoDIHI2Hr65uJFkEJj3iOJI/r7FMKsv6Om/eV1WH28Q=="],"tree-depth":16},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"i6+wAFZOSM6VWRS35WpEfv4PqHhbGGxI9uhTKqfbhQwoFnnrk42D4Z6Wa9eN98zm0MgKWbikM61GyBsfwXwTtg==","key-lifetime":256},"weight":506298118547901},"position":6,"sig-slot":{"lower-sig-weight":3037788731289386,"signature":{"falcon-signature":"ugDZXB5mpOEpXKMSZRUeLk6c8GnYPb0yToRC36irOtzr77ZSJQNMzRngxmUYlcvhVJZNdUTTq6YlrRuVhDF+9p2HIOo002no9yiSbucJOz0WSYohyTovD3KfuD907Yc25vAmTI/2TuLi4dKucQ5fJRikCSuniCV/ZUqNrKaXTuC6kyv6vMqhhU5VGHQ8n99KR+5QM9mbFh3F042eg0LA4yFMa19lYvXTdT6nfYLPZs2KdQfNq63jDIHFJHgj2ysr34liTztPZRrNfY1FGUOVNqbx/mUuvONlEyJxt9EEwRmLeYlalQCd19DXg+u1SbW1aR5XywOYrcjaqNpRx4sLUkJ3bbNjp0ZSCWGS4Uj/3ZHbQnJIKg1l2efTgwLkt5kUR4k99mc6KhGHU3PTOKTfikZU95Pr05JYaPMWBRZAc5/5nRCWoC4HHqShxVlaCma2ciax8nTZ66cXghtOtBE4vRKFM8X2Z6ax6rswvCsJM7yhjBGMG4RijyaBv7h/qgzsUZUUiljIU+PHj8nal8comCbnD877Cg3c4UIrG40D5wGSkuaY37UMQkFuob3pa8vu3Cia63bfYSHDpNd++Uw5qLZZmUbkH+TWM7l7Ubay6qNMsdJs2MAmKoUeb0GrpKn47+sp7EJ4qphsCyYtuyvJKIm5jr4etZt57itN2nZc3MaebnsjawWJkNgsEPtKm4FHDnmx02wiGuS6r3Tc9SIlmTuSsNnm6m5aiSz+UaeedbDEFM7XcgwgneDbk9MZjZb2Uymwp0eQzFbiYLLto40iBu+YJV3R68/ZmPNunCSq97o++rQu6iaZot11Jh/QhaZZ5r5JksD8f4lnVx9x7uzSGxQdoIakKuIohyRomr6HcCpF0bseTbRXJGlQclpXZBNP/5TlUNQoEjzOGdkmjkCRZS5Uf81BfanEb8OeIG6sHuDjJ7Q2e2RSarNpjWH7T5croslgQplUa1XbVMrE0qJIuhHY4t8NtXdnKYP7VOfTtVEzCJEi+63U9W162XWZMUke/F6xLozh6ultaYNZ27/symHXNet8cQ5s0vn6qvRty4WnjpCbiXpV2afimKaxHaobyIb/2IeoLILVI4/ZcVKJZt87mSwQSp+TDv4tl/nGgndh2TXUupNOVYR+i4RkzTeRyOA29Ipucje8k0HRe5vdhWDqtKoHps5FDi5Dr40WsrmLgiOfh5YSe7JzppPO6FrlsfHtnQmppuuguxicFQB0JKzES2CWs0fhylBc2mep7mCqOZvDEVLppdi+nNs6qv18vp+myJ9UPNsXXWXBNSiVUjcxbsxH50xDl26MLzShVtHEJ0anlFJVKINtOXmQ9keyHhlxvvwgcTsSWa/OcuKG5Mvq8vqlOk3fP1COV7rAlRlPnQIytX59NgRFHWEOTg2G/7p0Yp+Pvyp2J7dDy/NZYEOhbn3TahKxIFl1kifc7i32SkP7/KVfNrAO378QluP1HbfE+Wfave6FrZHOkywmHUWhaRT9OybgymtangUTYJUVWjdlpnEznZ9Jx+ERRyfllSVS9mlCj6kExOzmWDqlzP8la/9zYi5Io3RiK93+qgpPubLLf82fzgkrpnARNnDefqR3DBmqrKVs+9yYZMUtDdMqa1o25LFJKQdyMm8E","merkle-array-index":4137,"proof":{"hash-factory":{"hash-type":1},"path":["+b683r2MzIXPdIA+HEHz8Bf320l48v8RPorJbS94maS6c600/MZmv2ZUPoMr2Qg++aCDDIF1g26Xhwa6/IELzA==","Wf1p6uHXu21JICFDWNvY1oHBDyMIGqxavlWriTZKKLAmZ98MQONVbcFrSIrTIpjVC1/Qe6h6nTkJ2/gzUhZVSA==","C/ypysUO1dR4HwfNT2EWzenETeYJ29DvWbhgXI6qsONlvQpGvhx1vzYACp0ntAWJRXb8LeVDlnW0yh7tX8fGRw==","I3JblcSKEzkyyWY8S6kFnMR1kpMdgAsK647tjN79dpfbULZ0os8SQgvaKSRPtvWWXCJPs0d2NwRUUW63HL/bSw==","pZ8+UMOoxXXkvC3Va1ahhpGFmlmrhoA70kSlbUqHrYmCjzcJ8Im/v+BLWM4mJRYLaqotAklR8qYawin99lr86A==","O3DgFKJXQkZJYSIR9IDB3cwkNRaloFLJ22Nf1KEXzrhCoW4/lLnut3+AKTveLk01DDOFyp+kpU3ecHF8WUDiIw==","VuPaK1h/4DfcO1F5l4dr6Lh4o1TzJZoutsmcZWBXYYmGGDtlYulomdQZFSwnObwepVrUGfJu884ZILTfecSItQ==","qfTAMOD06cH0uC/HQhANagObkeiErTRWomwK/TL6It3ch6CWGnD/m/EDarRIyLrYkty03basIm3XUuBkZO0q8Q==","vqZhyLHgwP3F9ZtENQWkBjn+2gvEaKb2L9qxuj/cGHrQ6jcue/yXjP966oDkViTKObHTscinWD77Xk/qbnidZQ==","gihfJccZshNmpb9cbiUMbzxrJx6AimH7gyEWd7cxeDc6NMaqK1k+n2dutdHtbHDG6c3WvUzh8HRmQSaRZet0Vw==","l0U/wgBQvO/oCHdXzFokZqUOOpmi6QQf9F5L6Mrs8ddIaUzbmn3FakW0Cl4zcgXWinn9cNqxmItAkx8hwMTHfw==","A8uiXQKqmrTUc2piwh4YLhAZOkS16cV9Z3XdrctP4sBrKb0YviAxmA5HKWEp6+aJ6qPMWJl4RpZeEC+CMSCCGQ==","VEZ19JVZvhmZFx9Kt4TqXJK6lVmy1BzVKinoBvlIc6ryujN7u577gqmzEFC4mkS6jiVQa8j3yVZlk7x3BZJTyA==","aL8qRRadySDYmIY7BFFQjcuQTthJAA3KIF+xAGzd5nqF9yuWdyKXeiU/U1OJVzS8o54oRyMeUEiQAJAvYsSvNg==","cLrdrPEDZzjYJSxAcNsUhg7y+fiuILPGmsDVc6KsLcYnH5+azH/6m5o0zOyibjOEepFNmsUCjpSzEhEyIuroCw==","wAP2QaORa28iJP3xffwcziG2khEGj25tQKXMsu6J10xkOqKeQF92UwBCAlxMTrTeMqiYzRkpz5TRNpFH/pl/rg=="],"tree-depth":16},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"XjTuRMN15i+mm6nmV5Z8GMAuDiRWunI6cDMJvFxFjF09FztbHrex/bYwx66LKINz4Va4YV1o36xma6M1opOx9A==","key-lifetime":256},"weight":506298118547901},"position":7,"sig-slot":{"lower-sig-weight":3544086849837287,"signature":{"falcon-signature":"ugCGmnIFCTSEN8w0p/cPQ2QzyCNYbSWpfa8Vk7QchOKXvjE1+pRFC7jAJsd6Ao6rsheeMciCsMK5JPy0E2LktuCVrXJFox8lW/iltOwdFjlUoTuvgkNYa3TkUr8Ujp22B0NxQ2LlX2GgWDi+2zE8FqmcWRGimX4ZT+WcilK0vzu5Wla3z8KmURZWryop0RpCNq7KzFqYmdo0+2clY87hpYZBCmojaDHO39P3ZYMExlEa89fL0/HY80k83V1pNGZKE9hTPmyLV8bjrNYKkpic6R7OUoSNua8lG+tUwOBX0pU1T5zcnO3NvDi/yPKNaJxu3y4mjLPw0qa5P1RKxlH356Tezvk/hTixuSwNtDYNXPnCTBcMXDxKMz6cC/6AexttIRRgiRDUoe1sc12cbz0cVF0RRE960os90wjH6/vPkm9/H1t24sjMkvNO1dANwsmH52Ca2WsjBEW/CZw1BVLmtLamQYxQbUTFB//rG9tbb3rcFe7zfkn3EKeyH3dI01jFNYpiMJcYeXSCHSNkuCYPPw5+jWsIeSwrW+k/IdKH+yMwskCYMfe9EqLyW+K5QjiC7O+sbEu+1p8IE1Kx+hBSZZg3bFa67q2zmbQTaRFnrd1OY6bGdCATFDeeWVybZODcI2Rp6+XUoT95HimvE12qJLa8/h6mjVtSFjaVOZVRIhnxvICKN2Efo5rEijNI6BqLPKVXYjYH5zNo3OtI7hkyRhhXS/Z2vDa019ie0ghvV1Xy0J3qM6LsbusXmTrKVGeyxs0oeSp4rbtbDoC1RekX9OxkmJZ223fX5njMym3Xk3Vqqsvo1zUL8ZRAnMp2xRGG+CjUDRWhOXvYPOYOAEf8DFGmZv8LXUWz47SrVapvQqnVkjYB0pPSE+4EBlL4455d3mYie1q+7mWZ7/xObaiel/Xp+oWguelj4eBYUcTlO08umO6UP0xNEzOV9IhVsz8tUfKpXzIUufs70nmXF2mb/Qrsh0Xbk28syX+qdRNrjM26Z4nm8nds4tsc8c667EmfIAY//4RnmpWU8GPy7PNDQoJHlS11BQWs3fW7K0qFgs3LRuZO2ptd4+fdaPlmYTr1T5CiAtt3Y8NBIjhXCmx65bIgMl96muc1uDO/UCdqCV3zFZMg9fqWeGjYbO/fJDC8MOv7gcd1oaZUp2Os9dvTH2xzHKcwhBUmX6rF82q+FsEXnlFOA8f3hZ46i4SIr6h3eSKwpCb5cowx0qXRmYBL9QSkfKk/CU3NnlLWJIGWMEUtuHG4SFlIhL1m/SnNqub7joubbjwCPVH1wBjEXKEkTVQqV3LF+iwcVAHqUXYwmFIOVSawdEqQu8ueGnt7oMg4kWi6+Vpn7Z5kSbFOu/fnwVAqxlnnuetMK0ECMledZAfVrRwzDwxLXqmtW7Bvkq3qQRbAL/50m4+Ha3WKpTbzAYeaX/zN9H76VJt8kQoiacRAOAoJLbrCNq487XXYpJ9FrwPdy/X4FXzbsXY/GtSSlp8V7YE3o/D+WRRXhSarEDo0KqfdjPIrWHNWoJD1neSMtmbLLJbhtbXkNc2NSyUzDJPOiSWUF3Ndj0Tg6MW3QTRHiodF1KJm07mkm5hq5x3cOStK5A6OWTCTWPxF9VN0pQgjgZjO4+jT48KOooQBskSQ","merkle-array-index":4144,"proof":{"hash-factory":{"hash-type":1},"path":["Lr3keTnHvMxjd6KfCPf4OBP/c8kgmoWgVeZudn3wDewHdal1HoiJuEDztj9xxIi7YGg0NUYcbp45SlrMPa2rLw==","yD5WGwnaoSpbExs4P9+wHks2kyElm8lU3bHagq4E/ouyTw8+sP5yfqURqymH+UnNmIlKaUBDylQ9ryRBPKfsYA==","KdGXs6Dk0JTneMUYZeMbV+/hTmdcfvdv6SBOo5JK0LZYe8RsPhaR1RmtfIMbyj6lYtK6bHGa+UUo4xhXd/X9rQ==","Ptcq7ZUCQIwqmqX3sXH1coId7Qf8CyCd5wMKlWzcQgtEAAvnv34xLLg9+zPFmnxX0VSzYsOTz8yH1EjgYxaBgg==","gOYVRaUThRLpJL9kUNC30MyDiJUlhyxS2pB45/iXUE/z7n0CwgNw0H97G0+Me4leoAZz4G9dSJvwuY8YTrnkxQ==","imYpOwauEMnbmQkAJycx98vm4pRMG/DzIq/YWt8JD9sgOUy1lmAj0eB+XO6BJhIGPA/XrFRPg3C80M5+BSyrgw==","gvZly+BAmEcHTbYjB+Fp3rBdMR19+C25q34p6AQ2b5dJlWwMIY/6mwtmyE7G1ZYMEtEJW3ldJxKSed3WvStekg==","Yglh8JFdwiXUx5IWkGNKOz8UbJczLUYv4RMCc2aBt4AX7CCRhDyQU9l778PaUSw9iQ4GG88dVJYz1WQEUrsvzg==","HCNvzyhVKzgZ9hFNjkTFyoB3BtymTt4Ps82/2nsPwkE7Aj4f+uFskzAZQA8gxJmWczMPb/l2kwiklJX+5QcfQA==","gw4fHRLVuVjWjf1O5tPCEbEbv28vBrunsxrLtFj9h/0K53xg1hMegHnYvAKE9sr9zSXpDYUmdXc6EjrB3n1s5w==","5v1ZhP6oY17uG6TtMMUzAVy6hQFWUdvQZRnoyxJMvB6emUomY7uCFnBCIC3GhtHNGuA3EyPvktaMwm4ZJt85Kg==","Ymo4ndooovC+J2ZAHXghA2UlEK+ahHoY2zczywd+GmvjWEXEVS78Aq8ja+lBVyOUAlDZHl9OIAIMJQlBejZx2g==","gOOUvt/CcYB0dQIAKI8DpgwVgmNIsPvSTb0Rv7tJB341WwKOFZniN1n/5K+/Ehs5A0c2tbv1HgIj+70GMyBxSg==","FFLAcqwMKYeMJLiFGbeeItnMNhb8sP6+jNEd5/IryCKqRaaI2ggaBmxPI+WsOE09twIELBaPFaReCijWdT1msg==","BYPldorjCfTbI5abdED7Mqn4IE/6Q/49T1uowKtBxJHzxh+yDETp+Y2AvSPX4AigI2nQJkbEw3qF0baR24QeHw==","IKq6DdCtFZngU4i8Er3pPM8D5XbqvQAXs3kKqxfbLRyhsVqtNu+LOscLYfhyb++aS0Txk/SnDRO8kHT0nL4JQg=="],"tree-depth":16},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"coEjxiB164o9Gpqem1AaLtf+iP65Y07GflBqdN5njG8bfHhnyYeEe8TL0XSQVnk5nCt/rXZtJR6HecZHQM8P4g==","key-lifetime":256},"weight":506298118547901},"position":8,"sig-slot":{"lower-sig-weight":4050384968385188,"signature":{"falcon-signature":"ugDKuCb+pJV5neeYZKKEjV+uKVMRYGQ2MJX6KMdMr5Q4FiV/l6Q9d43FpeulEV+dohCcyBtaJ2+5yEgSDVThP/mSdVlmZVf3pQi7p3gE2byE/m3PLmTyQo7dGOHqJG2autoIulC25TWP9tmZOaIbVnPZAmCzM/5dQtkZgqBJuT/XZTU5TGoElen9DXPJQ8ESZ2WUkE2kknltnJ9jfAwiOuk3kFQqU29RHeJmk7CpQ93OveWPg4LMJ0604SmOuhBplf4w6cnUCG53SdGCk6Gjilz+pWrlO3HSqy4Ihy9bGXjqwjfRNGhDNnjOsl1dQdxS8QGwNyokAWeQ92j+F/e1AqF8DlMfUuMiteSHzmyVXDIq+63Fm6+TOTRUimfe0tkn8QP/yk+6LJTo1DZOAsEZYkivph2gofLPWmr7afQZHemV8HA3dxIr3J00v493+0Hf/8Gol9aPDtpuXq2q1w7ZQRhV5PchhA5OjXdw0LfTUkPifE6tEN5LGj1iN4NUt6cqAW+L5yG3RrqHOvNhUID4aT94mnQNc9vBvKirBZmtQKCom0L/lfrPPceKs5ohXzBHS9LgNreMIkLevGtqbHn2t+t6pQaiwiuKEyKI5DcadIupGbLndLh7Esc+wjSkoasweZI0irjP/07O7bvQN284lmUbOCinenfMSyjxLPNO/EcDSjPZjGG0edm8CQe78ONm2F3QJK6OwLMsVknTWzTRXYJnpfF5rAlVkY01zE5NiPAi41yGw7BMXKm140KOkldTokL+Dj0ue2Sba1mTmNajyWGPEOyyOJW6eZiEfMZ6sMvfyTElm4rZhOkt3jZ3te+CuhBMsuuyWvXuFxYPNIMLiuf+0IiNfuSEaK41DX0PzFK4RT0NhqErqjT0XrgwkgDdRmSWhYEZPRlYBPz0TvCNl2U6mvItDQnFQ7H4iiOAprDxtIHK5LB5dGi3VpKOq6XfaF/7VqactDUWhNIUsaIu/SG3gx4iNbeKJBJEyZffuIbkuO40KhiFIQQ5BIqICwjE6rgwllEOI8Y5HcoY3aRyVEc9/E2PEwiOp0dyOzrTZFKnvyGKNK7uEZpxniha6Nkx6L+JzZvMZEwXuVJ3CsF0rtGTbfsV85FampZ9PkvF9GEfjP0Rptul9cOEXmGZ8IltJXnOmonmlyHPAz0eNGeJKkMMxrHCYe8+sgE4la0b9Ya3FdJHty4exUiTnGwB0L3maVMexJ0icFIXXjORSx1HhgLQXDsK90VMuyevTQu/ZezEbCjBJWYMl1fng2ZZ2a4AiyzaCXM5+oXaxyVRIh6jtLoneNkxNn+o2Spk38CiaiUIhHbsZqMemc25+5HGW2qLZr74jiVGCNL93dydYTpUVNSuW+Kc1Nil5o2wMf2WFkrqLEq09kT2lilvMu2J0XklCG5lEohkG2NyhmsTZdVBZYVA7jb1dpNNDktLgmxDcZanIzMBYMbIn7DcRPN+eJ39A/XNMa0msozCPxrhGc42T/Pl45P1ETNcq7LwJgi9lpZf83mFsfqf1vW6xMI6CrPlCCQX4R/pz7SuhODoID83jTPESIiXRnptJAUWB9eZufM/xOrTbjqCzI/AT7QxCewoT/xTBSXGxO4YvK4K+EIcXtNmsiqT/7ovbsOKPJfttWhl6A==","merkle-array-index":4141,"proof":{"hash-factory":{"hash-type":1},"path":["qCjQX3AnqkXQAWrvfW8j7aA4UpgSj2Yp5PGZDKgjnbWG6QbuUBhr84BHOAj8cmclB3wwwgsLEgZnnZkxlLDxNw==","yUjYHrd88/ZPPMDO/Fb0oT5+EB+sB+cXpreJsm9SZrIbpHtlTQzQXLggmwWntJRvZSRfU34RTrJjwBOsiBMAiQ==","t8GO7PB9TYOx3uXpjGgOdmnpKKJGSiVTowKVZvEqZhaT5ERbRQwFCry5+SfePfKKr5iWp09qkXWj+YGNTbeJAA==","V5Z2bWeG+Xlu0wI05FTfiV/B8dBE7cpYbyEIaa/6pqFFqIoSaAF45+ryIk3e1HE66DH0bc2S8Uxdw+F+ohIvtg==","5OVqC1MKjATr1cH3IweXPOVMO1/uob6jv8jrQqocZJqfekpQgri/ChgjHdcCSGJYBgBsK/d1a+SYH1Hzsu88+A==","OZHKn8//E1eGLYzDAM3fcdWfL5Et+inn2z6tohf6A4YMdTj4moxLcsbgKQPBh2kjsfg/DKtkCbj2obxyVCONOQ==","v2m50fnRo06fpePqTFsnfPj/b6clnK5Bje4IiFxLvUBVrQcb169UFC95MHDt9gHZL/sfkd5UgClH8AxYTC6/dg==","zqshsa8tACMxa5WRWw8B84VLbnnu8rp4rEDTQ2MflO5HJvtDmUp6Bnbw368LU0PjEBseuiR5Xx8MKa5vDe+fTQ==","y+sxfRTlHJvQMn2YkMZWVw6I3r9b6eGBkBMxEnwpMzG2b2uYUc5pBeieKhruNFMjyuOyHc8JPPgjIxITiq7jIA==","xNiPo0rfL+oBwxRSQGbPL/sGnJYvjzEDutRE2aag7F6sHl+FGBYqFYq9xqr1Z+p3lUVPKNj1D88y1BCi/FFfvQ==","XNfd4NEyzRVDsNtkF+33vtRh7es6PQ9sAXmHEcdil22PR4NIzTFzdRZqF2YAto/2IrFKXLjgFAsR/bHsm3Litw==","QxQuppgQS7hmrbcnqx/vtPUGQUZMc7ll8xIHMQ0ubSt29mD+RDWJci9e46WEUga+juhezQm46LXeXgng0SuIfQ==","+j00zdnQUpH8HrQHgH/wJJpUiQ12qKgPntN50TlGEzao4dcDTqirztD/VX6bEr6un5UBJE2D2DFtvqRkgIDBZw==","CtWBNK0RAQnRIQsNbsx9ioqbQmWQ+kCY4FAKgb+gB2wuryfetRJWn2gNWvk+8hnSayFAZs/dgh7zAUQlP2sRwQ==","JJ4qqwSduvFAvvlbxXItVgfZpiQMDKy4v1b7XPoLPZXJVbVa5MVmba3g/n/vRJIoiZf646kV7BKzpraopQi18g==","plukHVw5TvrrxFyE2FIx3XkQgUFJODZFklMuYRfzKpwpX/ZTvOFSN0b63fQ10n+gapHAceYHAOULIXUkAdbzPg=="],"tree-depth":16},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"Hzn+1ZUOxewNLs+xRS/tdgA2r3xCCeKQX8hXiIFqieriJ7+BwXe81mrFNn7JwUTP/HRjI3+Hbf0B4qnq7cz/QQ==","key-lifetime":256},"weight":506298118547901},"position":9,"sig-slot":{"lower-sig-weight":4556683086933089,"signature":{"falcon-signature":"ugCxbxWPkIRaijVpfKaz2Szzq9VgXD+0rMJnklR5V21MR3aXg9KRVn0NatAkBMlKKhQH90cqIu0XRbLpzHdWTU04hhMpXl0PR/HIbRzoRmUTdB9LAFy6qkavI5eOLqfwZ7t7fVxSXdH1xNuK7FWElS8bLd53U4kokS09rGBYP++jjTLZ8xxOiaHRmQZdCUkX/k+5RNnUJYwwnedIQNXXfxnTMe3dI2n8zPuiBm8htDTmPzRR4+jLLOVhGZ0vAnPLhPPhuUGIEFdBLHBzV5z1MRa9SMvfla172pN9AJSqHAz9iy6m3p8nPp+futwxTpvMz6czfGS+cPtLeC/P78iT1FaEGGwbV4mPIzA119x6U1n9HwuVk9lTRtrtjznXerZaBulTo75p0Mjqf9bsHRXzpuqoMAZV46qoE1VKa5dLzLI0gN0ziA3iNxRnmvYkq/HrcP5UZmXIojIZyBe8eXvKZs20jh6ZarniyZgW/LWecwMCukvndtqmOx5KiTRagk7bKCzu2pDJt5BTwt995jvflFJ+1TYHh2eTayANQceIPLEyyK/Kch6jrf7EkR0sRc7mbDJthxn5VqYQh2l+wTEsmYtHd/bKiwOzicJQmZ+7LkRVttma122WXpNtL33m/K7Dptrj9E1rKFTSHezhVmC1j7NizISJKtDpVd++r0Zkd8tsmTXHMtdu8haL7FTPnDlcl7jRLoRcnaRKRUu886yupDXbZ8o3Jj6UJa3H5vuqm4djeqz+PIlifVZ6FMphX99A2arcjmBQiGT1TSUp31DLz3ssOx9GJvL6mSUgmI29ziGwQdvJnOaj/WH9GFppDitqOQbqme4kBiI5x7Lht09Z6T4Vh/PzcIo0Khrv253/tEqpUvUXZCGRePvFLdWf59OIipfDUWRcBnWQznT7zJ4shyLX5MmTPJQRHchlIYvPO8SaS+mPdKBzESg6hrhNGIbfPB6IEZ1ADj8TxxLOoY7ryWvIMTFJ3PzGyaiS+o5aUP6tGHKRVo+QMqujpS1l7JI7lAQZBcZI2mc52P3u//iLTPKlmNr1IqWYxjMNZ5kVjk96WUGQlUVlDY6Cu8HGlR0wqmZ0STMKEfttpldHn0QdNPs3DzFqS5qou3iFdjWN4dx0CQTDAwYRizWObmGex0Ur0XotOrQ+hMKnGUTlEcg172ZaZM1Ntaf2CH21Ay7NmeSGTtHE3HvZN5z1N3qvHnLY4secN4KpMjMwp2ddMtQ0UimLiLOxf4UdK3SE4k5R1glRYZRzN4sxXrTo7hm+i0kcxTaMwzyLaXDxZtqH687AONeqfpMsiqeseYLXWNwp0jXdwZIDKNB0TDExn8LSKenvlBCvQJVokHQQi/Sb/ztnBf6eONBOebEag8WJ0c8qMq+uBUe5553zS+9I8OwStyLCQrpMs1+4TngEhZYzygbQ1bC6ElPyp2+wSl13qtnrELe2GNR8Mpa72wpvBJT34E2bp9ZCZXat7iahx2eqEFQpCIfJsIkTOlH1BjerUJQZ/Xb+n0528151rhyP99Bti02pR88w1lElFCo/W9a/aOs+R4oU1/82MRjyPI9iyM+Hgb2wujFra2M0pyjpfcLfQ2fKRyEBSvI9aYeBIjgUn/4uewo1iTO+hYp7G7aDVPmxBA==","merkle-array-index":4147,"proof":{"hash-factory":{"hash-type":1},"path":["SqJWX+aKVg6RBpWIl1rDsj/VlmpdL9Wh/4sxtSN+97yi+zPvKZSsCmVox4nonwFz/ocIehcCfocYKYEARtAr6A==","SIjnAhlOI6t56iTbUYpZ7itkWXUGnjDWVqPWESAsCB4nT5P/nXFhA6Xa4qznb94odyBBkYR2OBB9wr5wQk87YQ==","UhNBN/mCUrmNYUjuidi6+ujgUkezRlSSzGG+ejbd06AJUfxRNKAqWMhdDAQG0+SdZUw6pn2B2cnXmBzBD277YQ==","UlgbzxTo/P7DO8b8We3xdxrJ7M47VtUv7TQ/ecOxMdMh9AN43V4wcJiykCla17X4MgxVMzEwP+M+2605kLTohQ==","JGkGbsxNUexJj/k00aFQ8oSQkcCtTC4ztlFJgTI2ETyapeJ0UXqhYpXxOi6ZRw9NGArUWxxtoo9GeVQgQ83KWg==","x+PM6rlgGBdxCn2oYbO12ydGJhuTJLEYJNunc1HmzVsMK2GGEfBvls9CFQNGHSDFjOaOv8hL4BUd6TS6omOP/w==","kz6pERmf9Vhog5JCDiKBXvKt4s0/9UKRIdrs6JcI79P8bOMo63PFZnORm462N4enRBYOAT6X7B/Gd/rS75L6gA==","zLROPrjHdhh8gF0UPo9Edt4PkYxZVsZORuVQD0kYrXbfi3Uv5GPyaxRZlzFDqCHr+t1FxQgIyTa5lh2ZIHY77A==","INjbV3Gspdm7HiBBvcJaXDg0eJQpkjrUZ2LXhEsNh+zQdaq2qzBhHpZ/NRjRV5hl8ufFlmHIaF8gDn0Kq3CJ5w==","Fv9mZG66ll7OkKu5TmGOML2Pnolc6mmYN/xsvkO0Gnr4V+CetMNCrqemIB3hNQ+2rTvOCYVv+QQhP04D6RdTpA==","v1eZ0g9S47Y+RImpPjVJfJHU6IhDIuFlzdp+4hVleTvMyLgO6rTWUG8ktO+0ivc1wpKOzyk1/Zn4cAmfVsfY6g==","Y6moI0H7KhYtXgk1baNYOsIetnLw62ilRd7ng/w3kZcARt0Bzq1qn3OUFzrQVOnM8mnVmtPLup/TMBcaBiJ2IQ==","2wS9dmhoJI206LOPBCsObFvi8azrYnK76jyHiKatgF58ylexDDJMb+M+3dXquMndpr8mapekuoOrD7YMo+b3Yw==","smHidc76v6HrLETGrPOCcoD9BboZNze+QrussDa3C8CV/3d76D+l1xSorypi5u6oX9CPg2anKOVpPsgl0bHLQA==","6w4xke2X1EK4HyHrrqa7Gzb9WUJM6KljY2yhMPQFNAVU1QpwrAdc4vm/kSScjE9N+fF9WRnroYGjAYNUasIAuQ==","EtxCFZ/nXSQzQSr4xwJK5gA+aEF7nmvFSz7wulvA1BjOevIY5o5yQrjHmLCRPqTLuKVNWs5FuDpmJoTDkdgUzQ=="],"tree-depth":16},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"uLP0Wh15Oius/ZapZdR4WDmq23cuj23B6CxOtlAIetn0g7wLr4dL/K0uiWLm51V+arIavBSXeEV3UMntEFzacw==","key-lifetime":256},"weight":506298118547901},"position":10,"sig-slot":{"lower-sig-weight":5062981205480990,"signature":{"falcon-signature":"ugAFeGjKYmZwEGaqeMR58g6GfzTMNe6yPH7j6Jead6NnX/p1+Q8tstQGdkHTPn4xxYI1KlY+v5I4rVsyKnp4NuWIkbkoZmhABTpitXJQE+G3cmjYyW5GI5sj0HwCdpy1LKQBQG1OdmnFmHxwmAKzxlijDzsExKCNBCkywPKwUi8R1cEYPQ4I01Y7ekwWGuufhQi/I0r6kEgT07jDk9gaHINhlAVU1eAZ6Glap2QxqHULnyJwCX0tP5Z7cm/rtcuPwh4NKYb+smVOt5z88jWGx3WLsciztwsM/w8fSMtWytP1xbfKVgmGF02U6E+TuGwLKnWMOxopUTlLrjYPXvZwy+/p8p06w1Uyzk2CVn1of86lMkdQXepSWV5qTTqe6x0+9eDLjRonsXZqpv8KMX2EDor9sPROWxv65I0yWFHwsjoPf3GYMI8NP1g+8ac/jsiJR+q44rJJ3l+JZ+BDVFhBL65GsMO9QSX4poUX3zBwFBWwIbv6n9NSTNGWNPtnkFGEQla8GzZcNpXXKoDm8ea5KwosaBEkCNSYj70D7TJqnaUxyBX1ojM4vSf26E+la1CxLnM2ybknhYvhpUgZkePGyR77REPHSX2CIJ7YHnsvYLgarok5VJT6o3aRapA9Uiv1WLn6Fw9pMEe2HcNFryDpkqxuqE+UGg5juCYxqMywx4pQOxKXGMJc+RD1nK9F2ddRu5RyDiQVBmJTun7+ZrTWvwuTB9bushzUvLnns+irtqv20cVzINJi+ckVonbqynESxAoTFEdZxLPGi56KNprwgMAn7pN1P/yo8hZvSKldLDB0Vv6x5AZ1kqpPkb0SuSRHGqwfuTgwZQkYR6r+Pn+WERpdUDnDrrlu+XALwtExSOPqfR1QgCiQZdY4TqDp3iNWaxv/IpCSL3QHwX3dCyzKZxn10Jq7n2KxGohtObCiQtvM2zR6F/zba1++U2EvKf9Z1AqjHXLYEZSYvHXMZmojauEz7K22gI9v4udIdzdaplogzlKQhnUbXeBU1e1vLTr51mc3BSEa6VIhuG9o+3y/mTf78akIt+qqgxza7B8aW/D49MEPaKjO6hSWFQ5f+lVMwtgmMRY+cmq4DImwRC0M3hz1JaoUAq8/xkpfybwErqAv1SK+yLl++jVjrW/gMpySlORCcjEdIzrCaqNHPykVsSPPU1rcS6TwByrTPj5KnMGpwr8Enh9jxNPhmEYVivTpItwU6VxExh/JrohxTpuP14R88EJImCnWS0/5KSguTFt7wo47f2qGcbH1e2rMtQy539GEjQW2fZ5IDO5M2E7wfnVOdJbhmdNa3Eh5FZX9zCXbTrGzUohk8JMz7XOh2fnii11U5LMyhiHlj4p2UctK6NPJpuUFUxt879KdlSdGQhsXos/F4vRoub5YjKUmzdWx+malJCQIZNe5JsF8kexXXZd+USe/Cs3WozEtb+PVAUFxU4Md8slJ/s1bq4MxssTFCcWv/lvErnMYKpjKI4CpJCyqDQRkaZEHizT9e6x2cUGQ5KUrvdzk6qLe7GuQlBx+whsIPBo2Di/FJcncFVRAMoZBnAkaCKJPbfeas4UpIpP59b/QnhMLz09zwCl2D3U6JOXjNFV6REmEr2eU4m9i6ueE2VKDr4xEocZH8bfrEg==","merkle-array-index":4150,"proof":{"hash-factory":{"hash-type":1},"path":["yudCH56Q398CCJ5r0wjK02M8dMEET2IjNnJ8VVDk3OACpGDv79pPAeIf9Fn74NtVnJSnWy/bdACq3DkjrQg/5w==","r/XNgJJhOGU01OJ7QMZ3udwriVZs0gsIQXA6uHxpAwyXg3gCsCeFechOZGujc8ZglzxrpWnPzQ8UbdW3qKSWPw==","L6ByHeDTsdC0j5o+Lb+/miBWsi6XFnjwf2IUgfCUJGWjES6xVqHZYscpt9dXVVp6V7K6JFoY0WaQg4rH+LZH7g==","p2+UhW5jx0DwgIf3PCWrOQG1IYxRteVSoqwWn4BpIT1eAQmx1qHsU04/wrOpMpE1GAfObbu2ij2zDBMex1vajA==","fkcFR52shPfmiAJQdPpcnlLwYvbAtldGaHhst0OdcO+vw0o5ujxMtAd2miCDeRIeCHP3KuxmIuu3cx+ctY7z5g==","lEtyljlqCL1SBEcqGHQoZvuXUX5ScNWwiNNUrN7TJhSJX0cuyWkpHaI0tmndX9VgYwUSnZzHAZ5i7OcRLtfplw==","hEkvySimRMQiEiLvD3q3CwhEmZ+WTafEZUSl0fGZ/pZSVgiIZeXsekFSRiINlnaFSxK2b77n1QUXoAIGcnVg8A==","exuRUZwMDuSyv7XPbKAkkwT60DppXo/BQ13qVl6ui+2zzf7ZTO3POH/MP48oyWok/sAOGaW4Xdz0iXwVWi87yw==","cfTXS/QYuDnv/ZnM48YnZH/b8RwaDhxtenU17jZLX04OqZt3OoSHXJ/wyJMGJeOIMS2/oQnlJyhKtgePGlrsjA==","GvLJTt2r1IKPZK+gaJsGPiQ8Vp/ZiinUGGGGEKpACuGBBt5Uozub3OUmFuR2RhDopq5iumTTRT05GKxdZBK9pA==","cbmMgFTC3PuwLwNI5PHHVvKsMgsWWBqM39/SVFy/hVrr5+QID8aQ7kOirsXhN8arGH4ZiL3lrOyLMJ/JAJNezQ==","E2vZYE6/JoW2kKuLn+xU/yFZiDNLYUe6Ipl7zSgl1Rjb9Nt72nooP1c7DnUc/fq7awKZT+9KACHu4Tycq+XUyQ==","3ZqMC1NbVLLTVWZvY3lEp7eNp6NFbe6EXmURdwoksiamJGgnefjvulp7ZZevuguvHfyVSkemzcoGirj9G7f/sA==","QA7afDWxjzlbPCINFC+F+0SCQcHiFUsriCfRVe0bqQM2S9ZJ9ogTJzc0IUnU7Ks6BK0sXqGn0/aPRZGN/FY/Ig==","2kOtoCeKZzvu/Yq2/bsrGjw+UlYE/62vTbmZUwqgDN0nmij/o2J0k1XTVC4bU4K7fwLOAQQCsnT+RXBxM6X8vw==","r+pHY+ngqfRKNIVRA6yDERkLp6OKzomI8VHGzNWlK0jje9BIXvW9IVTN2jNFnPS2cUU+32s971ViG1WjHIi+dg=="],"tree-depth":16},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"mJAjFahp3+/v+LRynew2CVQyd1KYqM43csK+kPATZg8viMGtfDYs2nef9QF7wltHuQqS9Z933+bgpg8LLgPPtw==","key-lifetime":256},"weight":506298118547901},"position":11,"sig-slot":{"lower-sig-weight":5569279324028891,"signature":{"falcon-signature":"ugDe3h8+16audJMs1PkMxxhs/bpO/0X4GPlCaGVh9H1Y+/g0d+ab+OrjX0hKN83CW6Z4GSZC5bZkIkw/eklM7rN2uHuXHWRKGkzSO6wghaSJLWYbkta1WQSF9rro2d+RFZL4E5lMjED9slr1MMXieKVNoqFZZ+3/NMlr12i9957EWKBmFQRtGki8bxc0d8nKL9mgfGXcpUooj6nKw/P6/cYMR3yiu2Y4g+FayPdUmomjwSFVIeS1mHJnC6vhjzpq3GDQOrA2bYZWqxxfIrbSlab0RdAssM3sjyUA4DRHO7uY9kviUG1PD1uRrhSfwz/Dk7eSLbFF8SeY9KFywirZ85tyjMkQepzVOE0Kb2TDm3w0kE0QXETbMpFRhHUdJk/exnqeU2b9me5O8MRusDvHtQuHJOVqoOEOUbFM7/RdIiUG8DH5EhRRXEy5cGZNslNeeRfblnuKytD3UiQM3e5/qz6PVQt0PBc0pwtjMCjRExuXTGqnBuoEhLo0q1W+CzTkpMNVFNGTSGpThc005V/BqRfoYcFCMUkLwVSKvxiznXNNaKs+4ZpqeRF25G5MQbu5cdQIUfNkWSVsgIzZS3sQur/bZ/8gr5tn3elp2HjHzniopr+5a2aSuv/Fhb1KqTQo+jhMP4y6H+PuMs9rCnYnVSORlkor31XGGX/H5RH2uTNE/1tRPbJ2pTaoX8YWzI576OiRtT1H+ExusiIwy7FlPj7VEBI1QsEd+Wk2xroKRNo42SsayLoOr8NiojpmZEV44CJVZB0Kc30pu3CG7ZTu/DlVMyVH7KlElMyZyhtS0dVU+3OYznMwQEjrKT3W/m1sGdq91u5RPEqPfYuS+VuedC2RhUrxnT7vi1MUvnPFIQQY9np59lZiOvPAW6Wb2TN37eKml6zm5w8lKRPKtO0i6POuSDN2ySUyEQIzh1k4L7/KeifMlKJkHMGPi1cc1e2sC8r7gsy2Jvp3NWSkD3NfFqXS5GgryTpwGYr3PXpk8dTMuVD+c+dUVTN/D8ZLbMTqGypMG7hPWmmHgZ00cyVcS9oug5U/gPEl1N/XQ6sRO6hpmVk7fp5+8dP96maohzcTHIRpCbXOx6FH1WyDajvrv6Hd7mcfGPXKcV+niwTeilQ2KHrRgoTheY//ZZc6PBcptIzyGCUXSrE9lAk2rfUzBa98sCtoXHCTOD/+XsyCMvkmWjSCoE0nWZC5Mf7NHHDxss+mxvGetzUS3U8FOGs1iuKXv4Od8xinvM5aVtYc3ETq7v0pPWUOPCKkWyaw8eNPkoknjE1hTrtktjBqWjzbFWORckIU2ldTEHMLH/k/UFMFJgRqT+PGdaZN5yVAxI1W4SCeqCdXMo9I/FgYz8oAyHrpOGnBSoUy9eUQ2GM78akD9rSnSV2GKH43dnRQ0jOTgt2XSeeDBeLLwCjUpClrbxnmYeyTS11dns4Mn8YWnjkhna3uKspTPyqXagi7prFEgfGtPhDmhq9QOa0iarrvYiQqWYMu9ebQlUDhTIxf3u3881L/ewBvZ3YKBu4DTPkTZ6mlchTZNz2pydduet08nrzG/J0dVn0Sy/PiLXx/2bX7pqmOm6qXzsiukr0Rh6j2LA3KzLeppvuMrvjorKS2MktYc7chv2NgiWEmL3v6TFTz5HUNUg==","merkle-array-index":4146,"proof":{"hash-factory":{"hash-type":1},"path":["++v7WBj+RwQfVPG3GJGup7ev4h7RcbRohz+KXmVZW/sGqh88KXBUScE2xp/1luW4aWQpzEmi95yg/Iaxv0yQKQ==","wDQ2yXdra4dHSxHXnySzlG+AnGbdF2Hf4Zt3NXEu1A/H5T3pX4KvzIguNw7qHfwy60LqG/c8dS3QPma0vPsWug==","frAW1MPv6MoERx1d/X59CWmwtPICXBxKBhHAyYA4UeDH16VmXoHP/mMD0egLGT0MhSHUJCwVQNzaPRmn7gKjmw==","iw7yXjQ3S736g78KTobwt5DLNhUhvWI2p8P2X20lET9a/+dh8LseX0HkcToDijeTV+kMFKVzB75bcq1uGWZOuw==","fc6fzorM+oxr+ZwfQ67vlsy/N4R7TqANKQ8zbkpBwpa/dhKA8XLayqmiGgwCEZQR9zPvOnGwZLKqMPsvfxQVog==","VWrrGQl2O123pNc8RBqA8On6LzSg0KIdZS8N8Kp8UPBAVO0CJcpOyM1YQD7k/TieUPzZtANvjVNawYIY5ZoUtQ==","gObVBehTtrFSZxhGGHz1x2YfuWmweYb6f4u7pr6yuvDTZe6o0u9XSidC/UF/TOo+VmvHP/ZDM4JHdxMyL3dAJw==","so9JSQU9gVvMSDTRSxsRFQpUwteTFDb6Q4nboi8MNQpzwNAhL8/GQTO2UXHig7K1AtS4B9nv0f0HP6DDrsg70Q==","QoXfsiuf+lxANLZuM5Ft9g+bl11Uzy3/DwU19BbWdrlI+4nyBTx+WM+h+p7Z/PGRS/fmfTy63DMi/cxABVGCdw==","UBV2v+edNICK6MloOHLup4lSzJw2N2yQzR1UviBz1bJsySgp1jLs1YE9w/zeZs0V8Klr2YT3n1gRdAF6bg6hhg==","GUQ47XPBii3Q29Sl9w9pKfK8+qrB6WXRXdBHVSnjbFVN6bQKqVwMQBSjuL/+4pZPJ9aPIIzlPgXJ5g33/qelUg==","nAAsPwKVZrxk7vpeMB4U7PI6opvXPj2R3YOPyvTOwzLo4WiomvCDEiFH/3g3nS3H5TDh7zXz+cXtXzNMOu+mfQ==","PAcqu4mEmYCGrQgNzO0LlbiffCOPX/QAR/NHxhWb/4zaPuMjpzPFAuIAIrEaQeus3AMLl4eo1hck8uQktDYliQ==","LhpxY7SeNQVEn1MHWEyLTFEUsE5j34pqQ/OnVeHxFiSjcBAXNn8pVw/9KZxfbrGfCNoe4FlNVxwWLksOvsfDIw==","UrOtI4rpfn03DOA/FHtm4+/HgzDfEwcmR3wOU55ZXVyRAhSIE/AfAve0yIxo39y25FsS6JBewGEWbmi1j9YTWA==","YvzfNxusruMhVlUId1kv9a1feyj0SplZSFNodCmG8lLp1X4yvRFKok2Yh70w0LzmEaBRMi3dRpKE0MAqQ1GaKw=="],"tree-depth":16},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"0lYnrGG1CcPObHxE2VmIn9CDbZB02i4DzVIhyJAT6LpNmiuutXJQbqJDRNFMBa0LBSJLe1rYM7lWqh/W2uU5KA==","key-lifetime":256},"weight":506298118547901},"position":12,"sig-slot":{"lower-sig-weight":6075577442576792,"signature":{"falcon-signature":"ugDv4/oSVgWnPEn/2hWXZnVhmCs/PBm3haN59eui3k6qdg5ka50IXBhVn3yPS+eujL8FTWGcTDsMuzuqfFOYwO3OrUMI+CpJUi+MwV6WmgfCHFS1dh+m5TxQL/J1T+06azqbrvr8yrBZOxqS4kYGy4MrNixKtZJ8VThqH4xdP4Uv0QbQkrN5okGII6s5mzJNttSjtYyVW0LpyfhjJKuhqYTBLcmsTxf7KIypl90jOqv1zAqUy2YdhrFAfSin819x7PDunOh7VvqYbmOGnJyONH+AgpGoXM0y6uPh/+aKcVoyBC6flYHD2CxEtalyMha+dRMOXpzbg2Dydj5I0hvKvKGShVibzvx5YRBolkpJnTeeOs0NhY1JIAZrV4IeBv0Vd5eqi2CGfVT6y/LfoFb9okrQY99HSyDJN+6KzXXuxbd8ZDjEzrkk1mtykVsNTz0HbuucKXbHOOrXJ1JXAa5X0A+OcJbYedJeagzxuLvoh8ZfV+3jVgWOOTzc/rCohpcez8BxqDSypShHa9W14EHfCk0zQOzC+pnxlW+UJB7XH4syIoG5sOuWmEE8gDK0KTIMhErY5jGC5KNZxVyGJTGkFs2ntDPl5d24VuKKLtp5FUi0qsQKQNc/cGRNWOPEkzrmatraofRr36Gd0ZZ1V+ChvZV5UhqBhEEH0mYQo6CaJW2LRYbqMY6OfgVD+sTkrbcNeXBTbPfKaJGzyOx5g9/S27IMZBCU9R2GM8QRjPjzkIKf5fd3F5cRmPlYTjbrjKh79PFIlS7NsVD4kTgLKxb8VdXsEfTGcjic2wVzeZ/gpj8tonObkeyolkQjsGcl0UIp/kaIJEdFcOxDXjlLqF3n6TKBBUabZEIkkSiuWmUcIEtau5cwiDggRjnQUjxJYR2NLHamTyMLrfP5876LxGFKlJJ/yPXk8ElSMOXb+yZZoXJURhc8k5z+tQK2i0L5rvwrdm622MRfgatztVoYLDGQ3Zg0MUN7bfcMLAsdElnZvgzOkek2c+4z4xRBVMIFRM28qNZ2CGR+UVjZf9VBEHMYPirzH4Ed/1F0scscuFRRe/V9TEFjjNwZvodyZpMr1xwo/CWIIxtE1y+7Vk32wh7mw1ab6Az2IwBpsjfX83XEkCCv6npSGrPZFGE8sQnrF1RDdvY2i78GY1lzbpPlCTYrJ0dvtVlPktmBuB6bw7mcnVIyff5sXY6+4mcWaJE+s1HTNaYqHWeFty9ltifxxG4gjst53mllaMUmIMj0zVGRNzVDk/7JsIpC+QVWYO/ri+aaVLAsfy5fNF/yvBQ2/x/jfD8zKjRBWmUcTVxvJzlVrT3ErhF6U6hRNXViNTQWVns6IbEsAPzMWi+vgUBEfLW8Q7GBYuyvw+avNZQeaQwgInfoaKLmQYi/N/FsjOOT58uf6HuSaE+tlxN+3qtcZtsJR3okaVyN9SWoMSdz5Iv+EozTwX1zhJjncJyoZdMtqH+o1vjdffWf6Ms+J43OY3XmePZ9dhG3ubZqurYbB7IQVTZblVLbL7GhiVnpmueusJW/IW/yutU2hIdm8nMm4aikPDEq7mGyZQ/UhoBYKIaGhkhe+XLuhygTBk5JNkKy6YpbH1iZLGsja31nxQJNyHVtj86GE/yzN7GGK1CVk1Q=","merkle-array-index":4137,"proof":{"hash-factory":{"hash-type":1},"path":["Sd0OASS9jfQw5pAnjPUEytX1cMrj62plGzintIrQepMWeBM+WusQIzYA910tteEyeb/oEJCBMxqvRZEZvg456g==","51LspreUTYzfDdDoHeAyGZOkTUVk6iM3pMzzO0SAibHt6WC71kXwMjeAI3gqe1OmBCLjVaA2DHVhw/BM9JstIw==","8ppktw+zH0V3kRUPa0V75wSW95kT4JqqZUaloiropPfqiKRVIss9uQ2nh9uZG1EMfL/OccoV2zP4K/LclZV+UA==","Xi/jJwKL28D/9I4TXNSeAPEaMXd6zbOVTgparI2b8hhbcnbwnxEAFnNiZck5PELilzuFEA0NB8hW7RfjSltJNQ==","azeyMz2eHf5Kj6vqh7eVvPCILJif/SPz0ZKXmVx6q80M6RsZNrJfLc09KKfZ6I9uzZ2UQa0xGppiAbIxQIQ31Q==","mtUAk+QN850sFY0oIRzrPP4DI68vWoG9k9bTUE97OpaKHFOjC3VEHwzd5viscDeGoCXKDKPWzYY+xGXtvwy3Nw==","ozdNBunxETSdDlJUrvPStjHiAb9AKuewkhbzblmExUSfQQTiiwvGV5p8UQfxRZuwDxF/5mkLVnGu4oBW9yBVDg==","XBKazfMNAwuTNFN1rMyiSUpT0EWu4EjUgLU7KawyQsyXSrO3PYMIXMmsc7Dr5fAyBKPeBj4rm+r0JWh/UEA5kQ==","GUxgZx2mbmvfjQ7+ep8thfG3ecTXENpYjMuknxRpz96aWeyTbl/9tF5K/cqrv/79e320rQJtPxcsOKgBufdctQ==","PYFVpECLluim8jJgapGq2wl4diIKGf9WLuxS+4u+iLOicIqYRShclrOsFZmaiPQaUX5HUp4Lm2NWz7XJGHBRwQ==","NUi4rR0KGeDNTOq6GBng5Wp1p+E4jgD3L+Z9w/rWqjZLBppK9K+vai1Du0Zd6HyLlW3ltdIw14EoPBmIozDaAQ==","1mr6tYhq6oLLCIwQy9mvtKAsdfur66qZ7H0ixwe19NVaC0FVxMg4C9fz0uzVjwBojoJ1EAJabAZ+JnD9gi8l6g==","0/kdzXye/dqDMBAmlcqLJljxdMe2QWy+wEKkGfOKjKzbWvRN2aXYlKB7subfFftxXENLwR58kbWvmQKfC7tjRA==","aOF5xivO1WsFwLKRlqqoOE3R+aqV9bm8SOHGl4jy/URRBFGxsKkepGw/BzLJbDckoeljyRT+CFZppSYTY9BhEw==","RSKgRuBn3tLqpGEyTx6Pv5xgkiEQXR4YhJYtMr5JUUimnIKb5XVoa+84VCN5bWIh7BbS9WGqs1oZksbnTjor0w==","k99Srfsc2RkOr4bOb3gLoZoAqlQubO7F+nlORm9RdRBoXLL7TeOA0l5ulMHsNOSaQQTUq+qiJ/yy8Av0TlbwFg=="],"tree-depth":16},"verifying-key":"Cm8Ya2LGBH17rLyjlZcyXo2GohZGmpNiJ0uESdotfiVqNFyufJpvkVPaWJJ+YeuHFuqIpurLd9iPQ1SJVK9FBTGNDkuSLFdFUlrY0lfOrEgxpQIjfLFI8zTM4ayk9pPoJdCWbwpuocbTwH9hQoDFAhCJATMEm26EWk7qAubUqB8MMKPAaLMLHXSylmTPuyYXOXEPLDpW/+VLWgR+KSsWodjMGEXM9Xss4ZPqzVGjRpGkuk6DDs2KgS17augrS0XePJdIVzhbpD9HVRfQvNHJ0FYWlSUVWVJ7AsonaY8qj1pGYt6ONpBpNZSyorDDo1sM6EjE3dCJH5zcwRAnfjQuR3e/Ev5h3ZK6z67VLbivwJJE1DLsEHqnT86HsF31gyTbHIg0mr0R8aBGO6p8ZFy3+JUmK02JRCHtBpJtRRSYFIcWAON5zC6R+a01f6E1RehF0miSLYNnmDQTnQ/Kx+i7cWhs6xjAw4L8mrtSSVSKJjmC8Yp1TX3QRBZSLWQ1yCHFRqqbcutIeuKWsQDD17qA14v9m+M2knMxuWzkDSs7M917NgfQuXhSyyocDc1OlhsBTlydkZGMM+6f31Ld7oJMJz+CVtxkhBR6hzrc5Pffirba3aR8ID8PRfQBLtDnrcXrENgoT6HeImQkgWqh7ZAzvcL9YwXaF2mI50a0D6GBKk8BiVsH4ZgYFky6AFNrcF/8tjr6neCFoYkiEogaj6o8l3zd4XkicmfYTEg/cX4ySMGkYHlx2frneAE16odu6P06bJor1qc/EI7lxMnQNFhEWpE2FBGmMoBx2+94BLTFem7N9iFSVMTrXE6lFImEotzetyH3RGDF9X5VL5NkksJQFVLguWx+miUGcu7sS77K09HKTRhcLtwGIsQpsnTOuopgAyrav7TqQBSTdJp0Qwhac7EmplAFBz9Y02NqmeSFlalRz9Aqka3y+ywsKLwsxltIJY5AhkpKqYYZZr2upCiYA7x8aylv0bEcjAWROh/1FYobGjMchn5dn5HjLptOuTxC6YzgH7L5NbNJ1Lt57mdNlwpx3Ez4gGarQF77BCyfE0DAD3n4V/qDGKl6dZmRVsVqlScKXQakNhIhgGZ8uo0WRhybPZ7HgOgUDS+6HxhhjQSrBkqWVo0RLIFpK+wJviia+kapwV4G3Ekj9owcBDnSks7mdyjyygtUKPl+jcKHZKdhAebz69VtcyUhPxO5L/Cv1VwwB9KkvVbhebJl1lOBE5UirTNgGJAw8mCzCYih142PPjfhwyV9a8J4FWh1GylJW/DF84AdXKbSpJHkUrCqRSc1IODKdi7vAQOts14gHnUWCnqDupYWG1kCjgSpN7YoJhyheWHuIpdSOTBa04btLDBUuPta7idEwhVjroJi0H+VIurvYFaHlAfePDL+tvqxIpgzooYF8uu2UmK08+HDGJq8PmhSK49Y9pBJgqincy7C8uSFybd6IHTypyAevg6HYCigcOgeedxWdTpO3mCFR0KleDjk8ZnRI1J8mPRb0SCKWTal5hUjTFHztKP7qE1NB5nTiVV4dTqHSS9N0LITWNn5PDQ4Vuli2qtmrlW9Dd1XRs5XwgyEl+RSdi4TrHVBSXqvz7akqNaGP2GYYBU3l7TfUXx9JgbmQtlkSX3hdYfxCl2lpIZYqYoaPkg9oBCZ1N8CQCaeFqUNxHQonL5NBjORAni+0skmwVLzjTBQ0nmZtFhwrknyJ0Fh1Fy4haVNVbpO2vmvakRpg7OMVAE0FSdmaYMZdsiXAxPpAEKe3nQnjaobmKi4KqRggbGsJrmXsizJecZg72MqZGtaSEzfheBKJw+B5qv+ETicjKaaJR7KvWBhBSQcuvdDAXYuxIq7m4N6MS+z+hiyOG79a44opbRoF1itIgQGIkn35ye+L/V4t3cj7z0keYhGoo5BaeoHyuvBIPkTBb9J6W6lplAznT4MkDaIYV+uCpW79qQKtHnSGkYWodMgHjtqs5FHIQlUmDoSfqukxEjQk1A1eK8bLm7Xa0jko+QLGXBk5AEeDvEtQB27758la05Bq2mvryRIgMumjzIu6Ix134ecsigtNFDM5mE9f9SdYvFS9DgKHFoMIO7nOttpKVxFajvk6Cce2NeTY4y3kkj/xfAlb52kKdLVzQF0lHA7xhKAuep1QpMDpm115xteBqCZ6J+apMEVYF3Psc1oJY/opuqG7AQqVgv6dMJOrKSbKAHlLmJ0U0WP59uupcdQD5wfRnnTsTYXnia8AtEYZoZBbczmQeL0Gy4yYqCYmh8cArX/TIdRJcDKO6pwnrW2CMiXsnYxkoTQ4DaM7MgzHq1ygGnr9rBC5ZzJhjRpURCo5N4KtdIWUtUXMvtRlYaCKMvk4j4idks0fdt7UvG7QO0nySfsUbBC3sw="}}},{"participant":{"verifier":{"commitment":"C1FZB6qdSaglx6ld8H6buapmU5e7yCiXW436csw8643fLlqPdifbt1ECEHoB9JehNRcPdVPea1KhU+6FoqspTg==","key-lifetime":256},"weight":506298118547901},"position":13,"sig-slot":{"lower-sig-weight":6581875561124693,"signature":{"falcon-signature":"ugCeDJ5ucd9E5+hSG1bNoLP05hxqFghniwjNJiTli66QpRlYDn5i642qxtyUymGPgjsQJlrHy5yTRMjQXh6Mu9kK28ZvDHcsh2qalSM/BvPMvLvTOzfCh8K7nCQasjjnXfd1R7easHAkewOor+ytGi3U5OrioQulV1BiEsQ0iERMn+it5Hv8H5UVMYk2NuwxUPe6eZafIkCiEPNGumSQeLTj9qNE5VYuCXCT0ohKZm1U5qEeN7P0viFSmEcR8nJlkKdaAmvRlGNK307QksK5fzVI9pfMIo0O9ZEySfPF/lQf2YI1M3Kjx1SL6e9maNwShMVcjVEPBQKExraRWgTmTIkltdIZW23eKANkk8pM2zCGxy6NFOSgRxLWHglMhTKNXcsPDXjqMt6mCkTg1HKYXD+v4bPVtkl/V53We7EbOS1VIb4rPu6qXqFRGWSK1L90elCmBYiioOUOwWEZdIYzCSU0V0izy8pr/oJR8AkeoLxjvrtMViOmgRBFWxZaEKJ0k6TaPTCyK1kzVKRyWFisSaRQyPONLrLvqPxj3WuEDcuVOrP04BFt13+wxbk6heqIvAsnzXNH+y2m1NS6kLq0kgwlD4YAtkK9mT/8Tr1Cm6nVuz91AUG0zg4VZ1xiVotj3tLs7RxfrNsoiB6Zxm1sU1Wq/0eVEG6dG9IfakYxLSEf5rtFI0bf6Q8jGPTaWAdxkelOMO1bricGk0vHQY1eUj6mIbWs75qRIIBGNXfpjF5sbm06Tn9yZoowZwYLPTBSm592Hsl6k42O9wKAIrwXra/3atU0eVl609QMnvkbKDvNoGKVKh//QJvCkIYppkg/WPIwLGYm0+O1RyIZfgtY08ZJ0dSeNzwUk4LrNPo2zcKVNVijXwNnmQQLf5D46KKHLm/rNBlmDqxf+7e1FiDxomxLQMqq9bIk8qN2KeXI2SJNuJH68wv5nIepdmXKrIZv2ZxrKwJzZLFnCZBf7FDdAuCFX6Flg/GLn7rQR545o2+c5r5rVfA0c+erGxM5Wvb5pIMePQbbJ28RCovDjM0qMkRycuN5Jk5ya06hxERU4Sf3bWlnSzEpbS99lsG8HYS9COsqi1+pHXV9Y/OJO2R1i5k6JkMWtBPqVcG/K22TBjpfBgyTIgg5PWt8kEWFY7HYjcl18kL07Q77Z298sOoqNyKKolkjez1t5eYOQIcQF7eMp2NHTr/SSGdy/5vLDtu5yMMaWmuaRl8C2kT+UF7kVzxsmau61kdb7OovwrKRcoyRyJGaGfOmsDK1KttgzQvMpd1KjJI4qPX9HO0EkxV7p0/hsC4l7xt1iZSFzg3ReHrR5G+ZQL23x4onapP0Mm0hKY2wqBMgg0o11jl8RTzmpQYgoS+4EhyJKXpkydPZIAV8ono6Wmb4/HB9Md6Viz0vMgkFW1dIvOMk9blsWwTjU1w7vS4AZGkZXoEwWtOnZtp0MVQGWaLG5OT+mGpFrzUKla/TaWiJiys8SBBx4NoivWy2TRpWZjviQQFBBbufcWpO2S6FsVI4vOmZxK0EFiioEkk+058wy19qEBG02b/Y0K51ctvcDx/kj3Np+HZXh1ISKo5DQuq9HM1Xsi4+DrQeo0edZqqqBndi9PCS1BjJ4+45TKsGUh6eR0IWR9CfbhFCgA==","merkle-array-index":4150,"proof":{"hash-factory":{"hash-type":1},"path":["c1aQAOSdHgfUXduoaMLsibWjtaWysz+2nT/Ej4zIE79qlwSDfKgMqA46O/vEmuaspnYjdDG0sJhyTrmUtfuDWg==","Rps9Ulr5xGU3exvPIzMwNv2hvh7LOu9SITOiGcc4E0w9nGVQ6TsZ2os1fprE6qu9/NyliLog6Oc3KwNbto8MNQ==","yY3T19n7b5OADRbIf4N+z8rWe4kEGKxH56iTP/bcvjTu/fmZ+OHyWc1+K77zH6JbvbCgiA9fmgNOe9WFnVoIWg==","khSniuyWwiED0ZSAm/IUFOiJEdAaNcVwwhKJz927JtP7RkIcGvzRBcfHSGWu4LEouT1LIDPVA5vVRfEaxYmrfg==","qWCZEtE8cJ83ZHBZ2GeK1yG837KRX+G/gdLxLm+W89l6PVQYj5aNeYPd/Vn7YQNWHpnYLrs3x/FjQAxg8x4RZQ==","rD2SZaHcKno2efJRXIO5X3LHTS5mVMvI/yxcZNLCvJrPxQ1wY5Hi/W/xu+/coJiBI3G/+AOce2i5/P0IMLhMmA==","X1mHgkng/Dv42gE4LdbB9OSWgpw+x5F/EYfPJP49UezkOjqMoeLoNyv8c+s5yxr71o/+KwLNcjSrnzE3+SH0Lw==","kJMujAxwXuaW9+dHvz0rCsA8W7wdNr8EKr9eoRab4Pm7WRBrWUv8G1eAW6ozGyo5mstqIDT/wAM+LmHAgSZGyQ==","MQGdzrlw81lNgNswdBmOF7fGENCVbKbprUQOZA3QssRduqcesqrUNXSUf8EUcD7Fm2/0WCMSiONxUN00i8tLlw==","HCoSfMGWEOKqKj0ycIMKc5n9lJLsuSc+6RTowGNqVHl1wtjEweKQfy8btIMnPgTWeJTTKIpwKVDFqg8gmeW05g==","Dy8yMuP32rKaVbgwy+gjP7LiCGk20i1h7cIX42Jqm95ZGI2HOY/8DJQFAl/BMEucnkK1U2mkWcFJXcmwidRR2g==","KIdUsn2CVc7mpTGZ0+3ENkfBHmwrytcYqHljXZ/VQhv8j0gwtgMmTzztypRKGWut5LyWxxwJOfb3KVYmDfgFgQ==","itY6KYZ8lPTKvWcxHXuPJpoAHeReM0ujiSacebJo9hH5KIRI1o+ffbRXvwekzXUZx4M11+o8mQ12h/DPCQ38dg==","cUTpd58CkXNvGhkhuKepe18QslZrp2caUAWxCrzjhn6sgbS1nsFfxmPASPUSY5G10vOKDjlBKQo702Tw2GMlpw==","yDMDnaPenCFk0IenGgY8MimTp5c6N+Ow7PXhzAFAC0b008Q0pSjvl2Z4sxACbR3MPgIuxZxoyqq80kpSpe9ApA==","qSqWICchLSk1srDsIr2tFgCZ6Ro5msVtiDYGeH3WIaEIUieHAL9sCNwKGDsqBWXbG0KrSuW3snsRID4AGVWezA=="],"tree-depth":16},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"vwnhWrZlzaPtnlMic+HCwJal0UdYSpngWZ26un/cXmRHYk9STnT8evkbrBQP1PPYiXtMM9nANY1jyNT7zp23ww==","key-lifetime":256},"weight":506298118547901},"position":14,"sig-slot":{"lower-sig-weight":7088173679672594,"signature":{"falcon-signature":"ugBimpbvBLj5TG9+jX95Gcm82Ze/7aRc11ZS+SCGCZYlkK8YHYo5jSz+r9Y2CP3TIJMW/Qlmo1ZdBsFL3N7n6O8Ev/blnAEa56kI5HSDVmL23OzPoWeLr/ARZr5pE9Zf9a9PFhWGYjRDI85Za+Wvoch43ixW4x8xruGP7nEDS9D7sqevY/HERbZY6ilkRJfkSYosKrgrJn7Yw9TgMoQKTZTSFGVzHQV6IYjGNR7hotAG6YuT3Ed/xjiwlFrzPC1wUu2qIjQYmsriOFHYpFiLyHF41I/tPyCDqwZmtN3V280ciVOUHJi3LiiPRfB0G8t7EPX66/ZR+m6gDasLDVHgM7TZ9GD9kF0HatMM0GiiruFynKYX/kk8frIo5DlcsDq5agn5EBzLu6CmZbMRciwgBDTE4LOMRG0/wBjIkNLosJkSEOdv9/1n6yiGI6ThhEAgzgQ0WmTUv+6ZNxB3ih0G7c5n5AvrW++XaC5c5xDoARLRcZMI/AUSRbhfAkDztbD24RIxU6aN9GoPVW4PnUA5XZa/Ss8un10yySBcmqvuRo1+iXqeKJEsM2J/Aqd2d7w/MYZDJM0e7i2hJNMsegu+suKw1CW+XZNN+u2WZyzzf/j0KhtE1G/zpOE029J4MLf1S/3X2U/9eg9e5TaoVeqspj30qA1GDV3tEh0QjnSis1wM+aLIXCPS1CUby9kS331vRe6P9/YmQPdp8o3DttiVW5nHXZWegoMjUamb8/WnIl4dXK8I7fyRZtfnqmKc3uKZhxoCIu0sfhS/Z8i98/9p8l7sYhiZfN3WfuOc6tZ/DuBDsCS/HuWkWereOfNVUIoTIdZbNXyMqxJ3tEiK/sgnijHwSZRGPgycwVkRqzXwX5c27EHWtBYCR2JYiJU1AVddXPMe5zbV6IP/nYU+Sy63Z3btclxYm8leoDGrP+23UyTsYkwtqLt50VBV235lnjps89XW+slcYaxaGvzyCMeaVWYAWG1ePUYH/IgwbT7nNwZ1nC9q2MRhdK3i688z8WxTa3iGvNqU+4G+ryCz37fvNo4gBqEmmTPZs4dM1iX9KO2yEl2J0olCICxtv7X4hDKd15zi8/LeT3wLgPrZYRnXhnTuf+pmSPjRKMVDIKOyF7nq7mg3/OzfOyitbvejsb+4mYbKlbz8QHwkedOwpbXOxGcMibTPIY2vFhXHfIrLEJnDRwpv5StpyImdd1mIfbtN9kDeZ41puSyYOUQJBsIn81rF5bZgSCRl5Pbqd/OkRl6EUNseNyMQg8zNK9NGxThMqgvpx+l7MC9HQndyjslTB/oTgprkEx/yzVx7x0fUhqLLDIQ36FlBT+aWKOJtg2m9Y3BLm7TbN8YhBEYjw8XAtNOfbJfbTv/zNJVE8wj7V1oUU9mBDXp9ybFhZFaefLrZ7cnNa2qrVFLUbLHXRSvUP65CV6y5S3Dk4d7Wyfb41GndkWDbr+t7MqErkulLK+EhuIg2wTKbVGBTCkY7KG1syWdlZEjYiVV5bKT3LHRnpetW8fRYrDZjxu8TtNMOo0zkk5gkC7XuodhT23fOIQ8yjESRVMpE4ovvKxasfZXM3tCp2mP9Yw556W9HeZB7aK9nTk84lamnYLeo1vRV4GxQNQ/HFrneec2XmzeGIA==","merkle-array-index":4143,"proof":{"hash-factory":{"hash-type":1},"path":["iavmGyn0Zbbdcx5RVqCdBwOhzdYiGVjF6x48XPlvyckxw4h+LRa+4ya8X7+FioI4/m5wkt1OYoDrWaBpIKs3cw==","3GKdqpjpXrdSXX6AUs8UnnYl2EIA/4ouvjinBOrutU9N97tSII9p8Z+sTIadORNzdvygQQSOpQIgdXz4PGM+JQ==","jUCU5/H6S0YRUsxBe9O0tlMvPTVg2eJv7lmkLkU9TjnjeWBVxXBjC767WbileKEnAJaYSHHviwu/DzqXwC3N1Q==","v7WervewD2VCnuWbYjUEmcJ+9J0fre8Vg5ZRFpYVxwiDKd2ag+2N765rErcejWYR+oPTFuu7skO5cC1jWPE/1g==","l2Co/ZmzCuEhHbtNyPK/MW3Dk53FxlGYoc7q7jKMxN9jI76CfFCpHVSL2eBnI/Idl2nXEnDHQvwv9CWHPAyHAw==","bRL3Y2EhH85ZWav6uukLOUNTsH5JfTFLJIBZDv2spj0JqNAoUmU8AGj1kQY9bK6CSUyYTLqT1U23FhVnLaDcTw==","94tyzLP3NNlenmbob7zrFVwmflBaDH8qYqI1EK8SeEM4l8AOwhhlM6lrUerAOUt+pZkvqWeQJnDe2pMNVLdYCw==","an/1DnbvJKhOKz+/XthnTc6NpcMkGubF//n1P153n1CBg3ayrl1+Ez7174UJgF11cHQYZ6HZSkehKmJNc8x88Q==","qA6M62nqmJdWfYGcNrdRfi+Ux49ihbK4gSObIiewQsn/4m1FQ4imY4A97gm6O12iBEbHFD1t1ap0gW0Zf7ZnIA==","e0jC1XnLyA+8dtPF4bpc6M7jqoxWwRuDDSm7IRwtZrsvLCS/Ai1mipuYOMK7YMDPxZYjZoClHnWULJsF0Ioa1Q==","Kfgz1Ri4ogyaZhzn2/FOYFZHeC1Z9RN/rcdIfeyzo2IAayERyRU45ngfEq3xwdEqqXGji+t7JGs7LS17/H9K7Q==","leU3zVur1S8pBLmqMKr+8eEbT+PHAJVGzbMlOS6y/E0LBXYPDm3kvWMrq9GNEdWX7D5ZCTredOzHzFVNzdJkFA==","tfBIzk9fqkKXKDCq6FYup5yxwy7GQoIUrEY58ZwDVvsJhiu+S2NSmBdwN7dHI03SIiBkBUUpuO5c+BvtKXOn5g==","7WSiegFyuQNJVr6QevZQ2Q1VGx2m2+gxd6JS41lbe8FMIPm/qEpb8WHVw1I7tallbHi4/5XNw7jUcO26OGBP/w==","R8TkG3A174Tksgm6U79QGIqGfk1v28nQ1dZdLe2cPAOWWNXtEVCV1NFQKRbRWSy097QD4Bv4OA2Y1nJvPXrSjw==","wVj8HwaZzXLCsyyEHKv1G3u72LtRv2Iux/4rT10p1Ern+YzsaZCLC5g9E5zzpW9m+2GKUdHOUuR8H1g12k57ug=="],"tree-depth":16},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"mrnirHO9w2HRkbH12cVU1FHPKbEQqbRxhlsTBvC+giyNd350xsUqqsSVdhzB4l9taSiTUtn7+PZtDhuBlZT7kQ==","key-lifetime":256},"weight":506298118546901},"position":15,"sig-slot":{"lower-sig-weight":7594471798220495,"signature":{"falcon-signature":"ugCidZIWaxtv/mkxU7f3LFno44d5blptwbJCPVoGGkCSOM+XC0bltmyUXoUbXSgbia7cZ99TrtHv+DhmYYtOokTt/ktattV/YellS2/eu7Yz5is7IuXyp0iV6rk74Dt55mjFUwxNmzxgFJ2eYl6C1nBJ0mGmwZ6NVjJrAKxe7FrzxVNZREqAVj0mWKpF04IhFM7vejAnXlncYu1S17sRTXCjcr8W1NFbHTo7QJlu/m28pjOGY9/I0zdClRQRrmHd6pe7IpbI6pS0FYNDldMiiJAeDlcFj8hw8SNfm6ny6VwFf18JtTFvDoiyej7eBRL1l9Cm1tmXBRdHm6NLBFZIB4WNLC9Dw7RAIUc+hKdDU+VL1XJmG5MqQljVZ2x2qEtbIUxw5ZL2Tdre/tOea77b4td7Z/NkyXEsda6DZKLzEPtwnWKonlzKHw11qHHpV08yPX6/xb5N5/zTHj0Nqva8Lv4H4ibPlWhFXVeDE+iSxMlZqW/070Bqp3GVr/mkihB5In3Ek3kyjU4B+MQqlT6HBZLFV/Hq85/KeOWaLNUh0u3TIbaY80Ra6owfqeFB3niT0Nwpk5MI/iuRGTuu0LfN2jhpmactuE9DjIjG6IWJHYfBCWCpQHkQeMmMu8bZog0Vqae6EjcYhaJuvkq9ayebMaaA0tq6TEfuaYQW+QNAp9UaG0bZHMhTA5Cy93vw5sZwRYXBki/4R81hLQVrM0tjmfJ4rVEJatPKivR01uN6h7oiwyNuSVyrNT9DjktnG0n1aOorXmq9ybYJQP58Q7I7Gnw65Okmym/aFmECFOZNfJHBxnjSGFp3Q+jeCQWeLbP5PpE376yr9ewz0yeyK2fZRNG1KCqfKDiqfqazKlN8tUib6VluKbqKbS/R8sRFSPLw3iYGtsijIJh5x7IWtPybL+qTq3+2ySDsbkxMs0UnFRlFlTfWGXz2/YARbgylHnjjKKqLPGWd2JMWRxRuCiV11So+pysYgzFtDCWOZHus0lWDbo7LsyLekjYJW5BFpx8Pm53PXREXAO5NrSX+dTrKsfKzhork2tPqwPKyPtVVjXuRcndDknKyTQn9qQ33r4MJVfemcpJT3RjtWQvMYhFV3gZMDfNdeMW5vBcbkpvcSWK/uPzB0G7xQVIxiBuG6krNROaHMbl8974WOncbQ1vHF/ItHB6EMMP81iPAclHyveDL67MPe6aQGc+NgElK6sVMzGTTbcsxh3Fk7COfaVqRWm4H8Y45/CnyepVzXGWk6PxjDcNruhppzMH8kLC+tlNgxfWVfX1NkHRUjooMog67eNNgY1gFtlSsKCpmw0pGe7DFjYsR5ITLlcgiWM80+v9sZaRrW9r+v5ZHW6alG0KFJEdfaMveUdv9km6jow7iyiPPzV9Vnpmj+sRi9y+UdyTuhCrNo4Olh2CsEf6mauyvebaofBy21KhZqSM5AHfsSCne/T48ZU91RefR1mhTH9GiNMp2Gfii4ZerXP8jsMvq7lnGcSxNizZOhK2fOcs/+Z3kcdYbf/KUNIJRkqBjeFEN7FFHgq+Sl32c0Bb2WyEvyaINmYTL0i3eQuPPZml3T76iPkTTnZUvZKCjOGjNGjbgySgeWbsSefsYdW61Uh+kNg0mvciSg+sDG1UcXjqVOuwXn7dA","merkle-array-index":4141,"proof":{"hash-factory":{"hash-type":1},"path":["ABAWN6GE5ithJTKGQJNGM70YkSTr9/ifWDURH2SXRCaJ9T+TUUHc/jF6tMhpYn2uUs8PGqbaW86TveLg4+Fwmw==","0/VfGLcY3kdDOjF2dnJiUNsojkwwhV3f5HXX3CjtxjrOwD1EMLTdF0nJVqpMEg7nm0QpIKpDlUGnH1DhkgwTDA==","i/o1gTb5qRKb0sT262jgxVV01EBCvBE6awzct0tw0szZsYbPSKz7351AuWS/ej7KoYAfBmBmjcLbKMXLmHnamg==","UWmOeQJyVfYWXLj3xmpoNWpI7qBnYAJ6BQjB6p166JRfbAUlmZyC5qfYCaJEAnz1iVfPD9SmN0aexCRPB5IdDA==","xArcjVE7R+iN2OV5Q8cDQERt0EWt2jf/xGWCPCEgF3PLu6C9qdFZu5ZpCVydkZGVrOlTym1boZrfKzdF260F1g==","q4HI/YCzG6aDmjwEYY3Z8yLcfgekvSP44O2NvV/+2ah0Wd0dZF2+12rzTPqS4N2dp4aP5VgK9XEaAeejStkpcg==","M1g80gapAapEYBlIqXD0IjatWgGCLt4SACPxxsHatbz3nN5Agi7Hg6bYH/V6CYKp+YW+nnVCep2FtoeFdYMezg==","0rBoWIiIluunPgG0eZI8GP1OM8mlFXVg3YUBhoaKiWgeQxQ/++gxMmWOG0wy5Sbf6nU13QX4j1H2lYz2AtLkXA==","c/UqbtVNmu9Og38tWwSUFewdbEqBTCnU7tasWWemu8N8Wm7DOT+7jULVycpshWy8ITP7bDMwi9PB90Z9tAi12w==","za9cPy1WppJKkTzI5WwSTnPVzYY6MOgDIrIKNy2fW93l0ZLXsT3Qn5vzo4wR/ln1km6w9J3t7jXND2PHBifjXg==","PqqkFAjUQdviRLViiO9KrKGN6vGvZzGSfK5cXhUHqU6Y92vUoYllk2Xm0W0MebQGoH/fUpUH6TR4k9uAY6nFag==","DhAHAePeR+i9XKxX5o8abbB9WY9jcLVUQ21V1XlG3dP1/RvZyId0lWPHgYxVTJ9PkzWX1EZJm2d7FmFreD0Jdg==","V3kDmI3lRBfsMg4CDWBeD3WDPfyvgMbBCilkWOk+hU92VPsQWzAXBFUwotHUNqQOmsK/HpgoMVPrdBrVsB7JBg==","bp1yT3p3J6HgDwKvIKD3Pd/sqZf7W1MRCqzEktuHlZ+cRZja9RgbHXBBmkSFdI5z264X9/iRW2keS2HJ1XxFoQ==","pMJ47VkvRndWYKrAMb6wzVOZMB7ucf9wxDrVJjbwoLk8DT+zVBJkxItDY3Mj2MoKEHNNwWNau6pZHNAzkTnP/w==","8G24gNvspA1Dkt+8o+lSr8mtjP/BOJQXaCyCL+FR261MTMYw3pt2SJScfzP38CFLDCISst/TiZRoWsosdjOU0Q=="],"tree-depth":16},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"Vcez5YSL8U1uF3VNhFve9cVNTmAsQ1B7feSXiq+DaC7aSnziNr7l/HY7DLYNczPWtD685Luh3K8YGxhfuz3EOw==","key-lifetime":256},"weight":505298169561751},"position":16,"sig-slot":{"lower-sig-weight":8100769916767396,"signature":{"falcon-signature":"ugA0ldlXqZ0eK2FikBFr9L4UWix4qMH/eBKrDlw8enJhhoUVyhIy+n/is49tKqUoMET4gSAd6dTRn7hzu5gtbD0Xgi89l5++XM5dUDU+B/Kpws81S1e7CG9sDZtPcdBz1ZldPf1kNrUTa2Bo9rfaZZUuyPtkvDfU4CdtFtdDuMHhSjRYl/P9LlwJACibiVINP5jUpoHJ7DdqoYnO5L35/pq0/+nYMZXQpXja+k+pRUyVKTKz9WS4NJ6snd84cku8FnqVhzTlLaQQ1COsFusbhfRa4PujQyiNq355PAmaed9/z/YwM5Aka3zKHFNXR5Cjz7w0ujkKGa5zu/U5Qh9GKXgbIVkscSkJUXqkb8QFB3kIrW+qh92+5dEIOnZ54123dPX4rzIa46ORzUde/jdvlYzRmFuThdNhWXmdncfrFcYI8meZeOlNjJPkkeuLEnY+5TIWQ3KlzqPM40sXyXkMH2a/rd1XXY5fPlfDWh4LPcxkWYWmG/ZpmJrnF9mIy0mcrb2etaB247koFxmpwChpzL0FPlD3JM74ZJVe6khT1koUS/uPVbhdDr5WD/5zYQuuE6uDpjXyTPpw1iCdTm3eKMXxdV7EDY3SU2FYGSkHxUfFQ92rx7nxvOYz+wUjKCNbtXYN3kMTnkJ8C/tiyyCnuxipuC8u2YBIJo3WeQuC2n5YjA/hVsaZffJjis0SZ/Y+uEPZHe8FlXK5a+SCTKLGooY/YRFQzj2BLLD1IT+sTKcUUfRFvwqx0obvEwNUImfJarvvuVLUKdxuiwdPNEeilvmIlc3xMeMCaWpqSltl25hU1ZVngidlhSey6ANamqWKF4YTq1skbFk0257/H4CNSsNS1Hp+Oq+Od1eO66szNiZLbFPM2o0lPhBJSizFwqkPai60EY0cD7f083sxJvzO4z8y3rwss+GmIrdtQy255mvJfmMMobCBFAKhikZbhWllbGRO680MbtvPmfY98paB1kdMEauVE1Tdsiy/7ORchqcbObf5ToDu3xrgjZNUtkZTr59Pvn2fhK3UqkO+w7LXGx8B7EmKjjeByK9QEEm+c17eyBnT1cg80p5rStszKqYUhnI0rTNkjHgpFg2csIPmu1As9Dn+laweY1Qc6eYpwt6S7bmU7nOIERn7fziRlBzJL7AMppVZgytwm/Y1bJFNSt02Zq1zmU2PQ9aFN3vrJEk807yq7S14sKJYloSxNw32/PYIp5mk+mTMRlYNVEnYiBnBNE3spWZOrck1A9TISTFn8n/HpKGT3ZBEXUd7CHGgzQQLPojCYG1Dn3vd5lz0PdPjSawbqJJnE7QnyIYhNdEXjSqzB7Ck2M2ZCbXyGQbGqc3DqgdBtnZzL3pBWHTc9gtNIePw8c4mBL9K3djqcIr6L2fb5SNu1gY5qaI0Bn7I0knj1BhECdB56+6a7z3bY2MkTapU6lukL/GslS4tRGgo3okWDtfddrEsrq4BVHD3OYPVYnHayWGgim1hMoJ8udw3KDdpa3P0cycSatx51I8VpyhIMJ39Vkku570HpqhrkXPOnEWSJtzwvHN5Vlzm5fGe6noXBfiirdb3c0WubnaRyONgq7GTeaNS7PRv8pM6k0HfKgJ8nzGEnkrsmaIDIpB//JvYhwLA5fBTFTXS10A=","merkle-array-index":4138,"proof":{"hash-factory":{"hash-type":1},"path":["Zuqm/wh4TgdUja9WBnOeM7Xp/ZVa0DwqRJUnb6ABpk247379Si5YQmTlyPaBe76jBUqIpSDnyasa1V4WpHKpoQ==","NqjqskjZmhXCAjP94obEJHSIdhEBXxbX8J+Nwo1q6bLdiPoc8WWdLXyIYkOp5yVKFgfEBdErBPirbpPUCAZF5A==","TaDY4DP1mdHfkIJitlUq3ur8PoxdGmCyi5K07h8alQtTFNSI4wUFWPSkHMU1E29Y8yzhUQezXCdgRlGYKvX2+g==","vWE7OhY60N1JwuXJuLEDhZCL1v+3HOg1T+4MwLjuJ5LZ0watkXzvk89nqDFKGYZb4SGb40isnjIcCROuc4c7hw==","aABIlYIDDQYmAiQmKsX3/Lqn1kDiOJZ8WflbVX++p3WIUGOaVpAkoMNS8GFr/rvxGEaeqCk20S/A2JoENNGb+Q==","ALIoP7fwcTvIecECNOHT1J3Eyz44ComXoNKJCrqh4v0xUWjFxz6Xa1uyZLzCbGa1gUmp6AjJsI80qIbiz8KMqg==","uAdVFLQPiqu+U2JE4Pxk5HhyfWEyyj6h3b1zLkIUpObYme4W8OvPWZ9eRoymJQPghDDAsQGCneoRLwtkyKQHmw==","jHeQ2IXfbhOOoREk4raTahHDlRHPtmVbFJoR9BRTK5GcApZ1gT3ooraQ1tU7vrXkqjKYafLx+8ZUtvPq5ZfxBw==","cje+Xdo2eLryK426Xib0Kk9m99a3dJaUxQdzckgy0e8FCU6VcpSYaZbJMyoFmh+om2Agqz7cV6yHfWkQREM4rw==","rcOO7blwOUNshzVw2Ii7WTZrCZZ/OShej1DeB3xjRWq6YSRvaqGBZv8gTzQOD11r83ej7jNB1ZUW1XnN1fl4fw==","BGHoHGzpaIIuP/SkPHMAUW0cJN1AxsBbWTPa0kOL4HcrAW+4pGjgkmvzXDplxblpL7nHwqlbO/+mWFlAoquCQg==","XpRBTkPMGHo+iFHjDZmj7PcuIqf1YX994aKHSbWhsfXTbsH48cEkOO9jVTv2niy4aD5EGYmlBNRj4jpFEcdC/w==","+TulBOEZhaczdZyY/y4FMib4pDBu0qcr2LsIdOkdpD7QAXfK/jwsD23JaOgu4dl436mkhbqXjCLhIPkWhkmrOQ==","sZKm9eGgGxE0pNtsoJyEi21DCzFjT7O5IhI37YoGYxUdEg9G6yrQ7B+JMI1J1seIAIo10qwIG0AqTGUWr27d9w==","VOaXbXmUxS+q4ILdLvRBCDQoC82GjMV6L3ztsOrpbdu28NYDmBSiUaU1vXB6DpIvuRFEMDCkjZ6WbZ9QXfxGmw==","wAj4nwCAdw1Nn/fhqtpDGTw8kU5luHCvRdRHdDEpkCeYnEaxOui+D84vHYR+7ezbzdWe0xyMDf8Zk05qDWHDww=="],"tree-depth":16},"verifying-key":"Cl11bYJcnYKE1dqSQsGYFPAzC+XPQqux/QrM0aKoGE2Cp67HJ4gTssoW0JjwFZMSQjiAKfgarufvcO4TYqfGYHPc+BntVE9Paf0SWAT/XyhqY3UOXpyeX/csKy4Robs1UJQfeWgymVibWjRRbosrqLFWldjwJi4Lp11DlRgeuEZt7pMKbV6yvhYRY+7SAQDx2quJx4EUTVEzVLhk8rXA+hl8E05XRefYQkF1nWSf2sALQE+Yj2hYVqlRKoWlpIbRKBv+VZwIrMzrK+txU4mimZ6ENGOmxAYdrAdaiD6mXCarMl4Hd+puqH2xYLM0CqKQLF+kmNGcCfrA5ybjLlF0jYTMENR0HWdnqmrAa3zi9KJdjEv0pZhjKcoXPlapVRgMdUDNlarJroc5inaT325qgJxUJw9hmU4gOLPmQ08pGXccJhs9OQ+1TGyrYNCPeBkM87t4RVc3Iy9+4OOZzsXqdrXGOOgd/0iSqrTA5V2DGuoVBpXNhMxbhV1rJg8h/uGlSPm7IJXTbwrJcNSJtben11Z2FxizA06LEsyC7gIeqmUrucSP/YE5iEp303CGyGlCLgBiIYZNk3oSxlHYHholUxYClfI4qy6GG5Scd/tC9bS42XNsqLqzlXjpO1cwVnSkaMVHxyaKN2ho4PiRAnEjoeNGbu0u2hNXpobgymX53hqoauhwpaZBlqWwljxtFkO8JQQXU9EdztOwscJ7hsk40z+UkjIeWWIUHxMYscjn6xnvmiiwB4YcLr5x/0GXLcmHdfbWygQOhEAuajsnELdBIVZ1rkGibvJhOwS5EJ4eW2FS5pFWS0g6hV4Bojp672VoeKxBGfxCTwatqme1JtsPYQ1iowo6gDUAKevvUGUq2IbUW2WkkuqDpK99grzKFRmIua9pgrq9Gm9mWhjkEyosqxWVFMtS15KJyrXpwXmjieWo2G5lIMEzRSsFpwFoXDVvAs0G2D/i7oGerF5hShsGzUp0JgTM3CuEgJhFM+f8Zp09YiKp6XLoWBjSSrQ4BAEV7tgHtHhFmh0v3D7J5/QLYooYyH67TMGQItU6cAAQSKa41+U+bCNKTXWlRWQ5QumNW0QK5ZJUydHu2kQDySG2rJb0NvDkqBAWBGN10tW8iTmm+TWbDEP1CT1EonluRZKVGCUbyN1iblk0B+g/Kqy+m0RQsTloruHSyYqLVr6AghpdgIhUiUEIXYUsXtvwAlkIoZInf8IBWObDm/3PsY6piwvciihp1rQwzuiFiDUy2qbh+Fv1BRqdbmNr9epTTey/aSTZM1ptxTZa8aj6QTMhpYC6GK1MsdLgxJdnQLHk58aBJTqzcRr61CW4ooxWM2AGERr6x2dspAFeTPBzUGlkbbn+AxGCzK8aKrcvYuak2F0D+mkTc8wYxzbGbQOQFGYbn6esgVp2td/0Qmauw0YAATHerMZRqzkz8Yfp1t02tcbUqzrcIrZQ3lgoi/iGNQ4EA8lnGHrN5pcrMaKCfZlHKh0wfgOTZYYwLSYVe3fE40Z+XbUFn+udWoWVLiOhsaL2Ji3t8SE5yBdfSscxKWuVmO2APSJLMtRR3GictcFkSbBnbflBKoftlHbixd4J/nCuUFDJwaickUkRtGdodUKvcrtkDB+mDpZIZgWSMYqXkSIbYSqgNjqkh2qQQgEFgNF3MCJ6+AeQmq2EGGrFVYXsr+WXZqyxSLXTlGSnYOAF4Xfkun8BzDrwwbIy7GQXky6lUpTYVPAL4o9MLrn9h9y7AZDqTxQLTGFhUkgcCFGgFpKBXJ5iLs+R4QcMMrylNimGBrSNGMT9QelwDh2VehtOO20CSu0Ilj+W1vhPL4h3CIzwcoxsmZWFeHTfthikqTETJcunKGoyueUUbpzzEpKlYVN+lsdiVoyipYeJ9IJOOOU5pJIBMGMlkKF6QBwnjfMaW8xldmyx9o+SoB0cn1ZNTN8R0iSHkEIlBuDoAxfavbApVGkMJzB6yA0F/GdXS8wTAuRU+V7YupIxBQwdbLJkH+ZefIpfFFoA3xZ4UQjCCCoXduCVOh2tehkLZZcenLwJYSAphXBqQRaA1gIXH2KbM2+a+iNErLaWQDdFIqXax8qRPTWkVfYnB0v4kCBWRf5MVhxKTwacoQ6B4LjgAVUZlIHrZN4SZgEiViBSSdAJdqEuzKpGYCEEpuluhhNk4GjzCj25t3oFp7+YLIolVU1cWNzrxm3UVOEb1LpRw53h2Sirb+9GdqGQZhWrgH6tOPYmbmURZXnRGzwNnidz706jcvFcO6amcBx2B7ty3SIctFwKTQ5Lbsgh+CgjFHk07qtvKgwElTKI6eQ1DjFRa3/AsbYCxrqwlq6JJQaFoKm5toq81XKXlzxNs0FD0J930H0xBNp7rGjDKQXCwFPx14XuQsw="}}},{"participant":{"verifier":{"commitment":"qIQQZx7YLbQ20GILGC3DM7VPOX5F3qvfVnwpi0wuDIoMpo02STyKNC8Zurlchnt6zGtbjdQwpTDxCkn1vxvCSg==","key-lifetime":256},"weight":493966017269345},"position":17,"sig-slot":{"lower-sig-weight":8606068086329147,"signature":{"falcon-signature":"ugA7olEUOqalgsfpEYxcVSmq9BqnB9TuJSGT0Mf0kggWBbyGY8hfw13ZyiLICwK5M24WdKY5OQgWaZVEZYjfpdJA3KdZQamvZqWEQ5SEEvKFsQRsuBbzWuXtvhjW+LK/qn4EzrKahucvL/2xmdW2XTVGWSJrcyEoKnzKtnLkgQdvVSnTsFCoJ6S0v0ae74FYNSxg3DAvFLk9PLzCNwEYlqjDvsk7IRpn+43T7Xp2ptuuDR2W1ucZnPW+X2tviydiFso5Bd1hnLRUCd3XNwHEN7AJ0qWkqhhDG8vxrswW8yxiB11yp/x/GS4Pui5aDtSH4TSeoedFQp4Nu5jeEtaFFTbVlLJNaGVn2ZHPEMOPUG1phj8v4eU5CGU+bwy4zImJbJ47GC8H/hUUISQjNi3zqLMaVjvxNvJksF1abTs10dQ/lXhyiSfbtE1kDPe2e6sPHRIic7cSJG93TBNkcpPe7h3raFLLRHf07J4myaBSdRwf9Zv2yZVdFJ2RubUnQUSCZ408eSzvU9cK59saVeBoR6lh6R8WaNLCiCmROsmCEQMw7hs5nCL4XyTIncp0VBNlrXtqBVGkyVU8brs6OZUzTuRDKWQ5L/TepeMaj6eJYzOKabNqa3OcI/e95BYc/Pz6fmUpxFRR0yVNTDDzYwKlSdl4gSpTofgmf8UQMVOqVl59r7zqEBsi1oEvVYkDFON1YkTDUX2DlJOatm92U3/TLnbcjmIWMbOrPEmFHMypXdyrkWkdAxOpMM1RiCpRvP1kjDo510v830S+vusngdvXpB/U5wfd491SBCMZC2AMljvPAGTdW+zM0DPMI8cgy6LwE2Ge0EpO3Qc0lHcc/ezr/J1hIS4WqtHNmjOkQ0xz4Ct2+N0vqrKdBSvs4MKobWZSbUHZyeo2DEOvBxbkhb5CVPWTn4nEm6WiRxx44lJV0ZLMox0U73uGZKEBGFY9yDwcvnwSaH4GLD1ycmKDelxHb/iVLljr/Otc8NF+Hzs2talLIDq2aMay3KYdfMpMMfSJO0dlqmcMQSmVnViLgLm5bR0DUZV0YllyU9lvBGp+yDeVOUktrch65E4d1aaIo3NNaBd/Px0tQgV6iZQwrKK85cvlEdyUv9155lh/DcP3om46LGxiNz+oN9bclPEoJpf18jc39FOWGkbtjNt3KFi0ePHrxwL/ETNRXyMYhbOVeAwRh06IS7ZiLQlrruhh02T30uQy5oNUkKsPPto4hSTEo6PKZ7U27BZTLj3Gs1USc1fIASYYGPiF/eRr9C04VF5Gjeq2ycsqJpRLZSsU3pfH43wvWBoC2ULKUlgFSltNQZWWCNe0dGgNH6rWtAlSs0Ad/CQdEjJ5QlPfduPaRL4fEpjRDGJfgVoohMbJrph7dEhLBTlg0nS9v8SmvfwtWsR1WljTs5FsILptfowjVRww5SaT+9whbsZlTDPpYHyVK0Q3b053vxrCZ7b+IBNSy5htcgYjnLJNkNID7ICMWrNFyprcnOh9enXikMypvGmI+PX7X7Y1SmG0kWZDg02CE1IebrMddyPIy8AMkTxYtIknjU2c9DsIUbqasmgd6nqaokoCLojlDBL5CPv8htP9G6AnOo4iAq+mpjHOVedZlH5mrnW7Mbx37ts+10AJ7t5cXX5nPmSLOmUZ","merkle-array-index":4138,"proof":{"hash-factory":{"hash-type":1},"path":["Anet3UJxXUSYZw+MvgKOpwQNZSLUwLG9gZtmoEJdkQ8YyhFUELOMTc6hQLd8oDAHwblPQTJyRGji20BkP3qRJA==","CC5NzlU34Cm9aYZOlBdSvhEBPLOgWox3eoZXH3JPZUTa6BT8jvGHWVn4X8xjF3MyRxRKxCGg2pPUf+fSvrqSrg==","ldqTgbtRhwq7wkbX3nY/lk36EDsoP6UZTW0GLIGBxOLsSB2mktL/t97XSnrutSiC7dA9vaDBRm5AcVy1KFKUUg==","b+YgECfxJf31AmUPsyTZCTMLbLgGImig45vLh4Iix0ojVSAG8/Vjo9Wm3anPbfrXq5lQTTu2DDufwQ8dEQuy7A==","FnobaIQ9wE8Cs0BLdTUxDaC3Ud6YgowWUUdVX3vGN6RhbFAkwo9yP9iWaxsD/svFCZlwxasTriVE3oHnLYdF6Q==","OnTpNGBrihDEJjb575CL1CO5GlQp+q1yUzcaWI4bXC2CVxf3laJAgQpWZ94LXCrcQC+Opi+MECfc0vuFk3Tl2Q==","woAZPZISt53ZKDB7q17GKkrUfJyumexg0/MplU0NWR5nKkVxYhwlIY8xGwD8DeQTvd0tf1+9b/ypO5lteGci0A==","ExXehk2U8dUrq+Ndelyw2o45UpPwS4D9GrKbfGBImMdsA9cets6mAqLZpqsuuhRbHBLJkXhTvCUWUcdvk+Ks7A==","wSPUMTLsI9XcJXFOj4OuhzEG5ExG09zvTHZHTM3x4Jdpd0NHePQxTJVUqJED7kuOmWlG58AOHdRqgKJANPq5Cw==","Uj0e1mRZ41f1Nu7Expuru1td9Zpy3T6fhFvXOd9YRu42iSX9Idhagc9vDQv6Bn1NynomZrGaP6moRgTuJQrMtA==","IMgvK94rVqQyIMe1qXZBpBl9QX0tHQ1+R8U/CQlHj8v61WjJ8gc77FtVqs/pqWK9/hz3L4+4NX/0ToIb3LDrSw==","TivIPUNYdVD8p8HnG04/1n0TcKMuDApNW4uwpiz2YxQ84C09CCmrB2kW0QBSQmlG9+XwLs4p1DaZvKAfUEYtcQ==","dhjlQT49pJEjAg8bozC2+CWqhQK5UIqBlKiGilW+e6qZO/5xlhC025R26tcPOG5x/puajh+5M+IaMM55wPh1EQ==","yxQE3QEPJ6ESyn4i+DCPbatLFxAT+V8/ppRLZ6r70POmSqVel9Uk6uTI8DFElsgEK8wgdLeUoSHiqsXdOUCrOA==","EalSHa9xchgYnRGAeIy2feZg9xe6De6p0H+j+v7p7UvEvLtbvr+o2yqxjJj3o0/mSAd7z4BaL1t2YkNwJmR24g==","kwd0NaDyAw1ohiXkLO3uCHS8Koeg9z5QS6q5Srk+manM8lnJw3HD8cLlKIaG5oE1Z+DhamDYIxyl115wUV/HTw=="],"tree-depth":16},"verifying-key":"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"}}},{"participant":{"verifier":{"commitment":"PSsVMk3P2dzv0TfmNYClAU3zw+S3Znukfr93Pz67Sce0fpeHZrOg4HqS7QLpPZzojOWbfDk9jIkmn5CoIiskag==","key-lifetime":256},"weight":405038494837501},"position":19,"sig-slot":{"lower-sig-weight":9505072598435993,"signature":{"falcon-signature":"ugBnwyLTxP1BhWXIIXD02h8q46c6b828sf/qOfTyfddX9MR7FE8ZpwTArtXJfkCyxlmNvNWMhmS3aWwdNCD28/3jxaW/9qirMy6byryymM/q4SmvNQhHQ52jeZxbXnog6ETYwxLCMWr+cqrZfFMldVvwajPowQr6jloNZuRkZNI+mUOXaWKJ1yiDFBsL/tdVLo+McKeneDe+HS+FYz3RGLupHHYOjScQe6GPKeG00JpJvBbf45w5WXHJs7G0vXbq8xU22VxPLk069750i22uHYLaIY05KMGHonzMUL1b50NfwmbvfPW2dpFKWSY/6IoOWVhaGxfNY2fcBUmqNE9G42igHpF/Y/utg4kag73trcsNr+2y2fwaATjB4ZXreZNFXV6VdxiXqPpplu2FnzgyFufMmXVn2nK99r8zRsny1+3f5gky8r0YTwQFjnl/s17WHQ8OUta//+hZ7zcuZaRmTs3177hxpDmi1X6t6e1eWqqC/1DfiSKLVGuSJEKHFWaZ/FYNh77f4ckKNqa8yOtxfsxG6+yUYeYTJEY1I/L2+4r7MSWTuhqM/nDOFSXXXNyxjTEb4ioYlM3pPq6E+uC8vBjos/8Pnkop0LZFmdewMvyfKj+v2SuoHGSUQ5ckNnuw/uoNk7xRzaJ/1zKuoQ1idHmXNMbq/rU3os/enXC1N+KT71HfDV5xWGzbkqsAbuD3E1kdmCrbpGWYdDmy1NdhT2YqbGNYceG5Bg93Lcb5c63NOWPUXrcKQguqfOX46o7SLxbqL8m2QjdRcF3E0nRGcJPeQS+SxLKYekrBmJcjjlPJWk+oLe+5sXFr53sTJkRrlR3c825YO34KImcEEkU2Ntg/qF43XawkCUxFh8SnHUec1dgjK1dTMmDMr9ZWojm4lAtrcKk08SQvq9KhnolXIpCAIWWugowlDK090CilatsvKHv35x5Ocy8WZs9TukFFgUo6rTIH86LKMJeEcivUrmDJQNUH33fR9a33KQ8stJhiy4dtGK2Un+fJ/bsNdzpiZKObiRYXLc/0YufNxvoowxG7KqOvqHQnDX/LWvvbtHnTkV1iJFRFkbaJOPO/Hi0jynf1yBVvF8VCM8uHaGIN0z+MbDKU1u7YU71zufYBqmqHq0O0EV4xs30jVo/zMFMd2TweFIDZEMi3WrE/i2m72v9Crr4zci8evW7rUOuc6Cs9w0FRe0/XefOs5xbZktSx8i1TnBshM4N7pLLEstf8os182nh2IPnuoXiCyoSOkz+L3Smtbv9po3qwWfXjOD5kLWv0eBGO4bFUsRTjhwRjUdltvyBLn4shFSg9Voci06GFskSiUzvRRT9kh80xP2xyh1ooVXRi15BN8eWorCKWZOP8jmSuuGSWgFFxufS5gERY2hzrH/Pi70ySOWursEuduyN/0saq68d+oOuiZPONuDEk7P9b8l7ontK94kJJSpko47M2uEK/VWGnqY6W3wMzi+vMtpNjl6XUpQZw5arc3IOVrKksqJqzV9pAJGPERQTCuxCuddiyrH+lvTcbRF7cZai35ZSc7/IObYqbFJHB423cYwlQQ6IOqueE7m1frp0doZ9tkTdqfs/L5tLW1tNmPwwMvUuWFTvcdIO1p6X/5+BIG2re+bA45cJXwUA=","merkle-array-index":4149,"proof":{"hash-factory":{"hash-type":1},"path":["QpOu9yy/up8UyEYqEWaRlBlnSlNE0NjIVme01F8kgTulpag4x8nhUXLk/b2bmNwEtl680CxqcikfODmSA3T7ZQ==","vU+ZIJY9sYNm80pUD0OMOI4vYgIpYGWwJ24fuWpC1geK0avipa8buanKu8ReigpA6Ihx6lMQtq99oxMQ4B0BmA==","7q28n4qwp27N/v67vIyvsc+wSa2XP0uNdL6edQcouRekWWPRCa2XcY1I/GNP3TWE0NZTu/QXU3tO7tcV5ehiUg==","KzaBfdNPGccTUE0ZdOwru9pMyRrMvTpyMTYXjvhs0QOCREFoWy5g2ScZ7I1s+pKPaZo/+UAMI1QWW8EJ3yaPJQ==","rNkxD0+Jcy7+kuWBcdc3zQNTWsw5B+herkex81qnXQfh191uE4rt1gQS88cfVqyx17rVOBvtotSdzNIXJErHVw==","bxwr4DmV1pXNEF3zntZBXG4vq1j9BQBVCYUzMnMtbSaQN1TUrzrjDXPUKQ07T9ag+NwyYoAg4XAa4SSpYqORIw==","H2AFRE0A7IY1HIfoFDWz29b8BeKHB21gQNYTReceYhB50YFMjCdzlctK1g04Me/HQY5ZAeuK+s1SAyXuFNRonQ==","lIcV/PfpmZMr2oZ0F5R9nH0Eh8KubqFq2lPkkU+fhTmygY1eb7U3v9EJLUY56dd2siHXnFbY8I0IcHfsJh+71A==","ruAp6KPgfkbd+KJkoc4qLMHfDxdCpbQofiWOzbVyw8B1eh0ia6WbY0PXmYWpbKZLadkcRXT5aW6WpK2rUbc6Zg==","8mUgNicD8OgtQvjnBxvR9n1aQvcX29EysbSRkB8YBB1iGPmLgjSjxXWlkkQUvt1mvWh5ggwtHckP1MljKNLLfw==","EIzYz6vlt3OjVZUTbZz7wbNWQSV3Mr2CZDsb99U+3eGEbAyso7IssXHZuk067021WH7K6XJryF7AJIFuP/4X/g==","l5Hjr4R4/iemMgbcZIk1yr7na/6J5RKHsDaDWszCPg3jpwRqe2NZp2QKFicoVldcsESQC77XnE8Vt25JZ6TbLQ==","CZyT4zslearYud4Bm509FrJKKeCo0ZtlDLgI1qIfbe2pIgoeFu3p5xP1SHCTOZ9tU3SvktoEBquaunZ/EAXAVg==","g1U2sUVmGKGes73HdOot16nbWqKL/vT5/Nah2XDd4PCVdfnOVUNfLwl3ZMY8/7LDJjjO5IM5iuPi+iNdg7BJsA==","ah2hVLNa6bx+aP/LAoNt2/DcElqU9QUsugT2rLh/lZzrtJUJJGsm4rHjj2jSOmIoz1R1tGwp5z1Stwxde4qLRg==","XbxLixhUpWhqjhnOkeKxlP6yHHaQcQ2uKk45m+8ljqmgXogBRKNVeCZkSMRLks28LfrxxyYaLCju1AwD/vcgaw=="],"tree-depth":16},"verifying-key":"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"}}}],"salt-version":0,"sig-commit":"np2e/PJtsO1m4qOzzZxZDGjqKaijJoMYKjgvmAKfDDPtcvckgY7XDEgueM03AijKG8ixQRRnl9DSPN/eXS+t4A==","sig-proofs":{"hash-factory":{"hash-type":1},"path":["waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","Pa0RvWKeDEuFBOZEUXswMCR6vwY8vssMD4L1YWxaKztu0qsSHI+OG/JxJfCVS+ZHMpy9oBd6mFBRLFb4su6G8w==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","mfQjaoIWp3yF7D/UUrPGP1968ye8/2seEHIq4Xh4j5A/I8E13Y1aA2HNvhvbJ5h89PAyixNPXCjsaxzjgBDftw==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag==","waNZ0zpeKHIPcReils6xnVxYKPmMYXQ9Q8XMf5udh2MZUCmxT4DuS6zejH0IKksMiyZgXfyKv6BhPWZsWZ1/Ag=="],"tree-depth":5},"signed-weight":9910111093273494},"state-proof-type":0},"tx-type":"stpf"} \ No newline at end of file diff --git a/api/test_resources/state_proof_with_index.txn b/api/test_resources/state_proof_with_index.txn new file mode 100755 index 0000000000000000000000000000000000000000..31cb6212d0bf0973a98dbfa9a2f20b66b5764cc6 GIT binary patch literal 82786 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
      =BO<349H={$W%=A6bH+>ZjW~z zob)shkzI);sK8{w84c%sF(>r6j$!IiV_RhPpGCsd{y>8yqA*+fYQd$lmsx_#9WCfD zyoR^R6C{zD!37xnDs5qbaqCT?y6MKMD5DXvXAUu2W6_(UE2|f%m@hXHo3b6G!X5Zk zrM%@F=!v>=JV|w9>VY}T(N3oWu&VRi;~R5ZN?N5p)!9g)N-9?SnZ%n zMVgTg=?5W-E!3RFj1bYo6Ih)pJ(WHGux!cW4)r^UmDWDi60|%xbLEpxNHZvtTjQpNxXMLitNT%TXqDV$NlSC@nGT zEWCGYLY?JUFHSoaaF713$NlaaM6MFE^y2<}hyb z6zwO=G!{bWD6U~0D}4E8OLvL30--cS+{I4XG4hoRB41OY!G6~MOqb=;U@4}OvOwoM znPN;4@h|qlaUvhPGRMOT*{-k^3|oLP`EzKAvtn*<)C8OBpiWAq5l(eQNs24jFF9=U zj>vi{#{)SE=7q-C5pez9eGIg8lyVquszk_Ion@WnA*58OrNHy|(*sUq7RseCmWUgd zQGoS_@LL3cD}mM$D-ern-vk?KhBh$O&V~F1x6LXHO@4g!2c!@+TTRy=Qbis`>Wz!Y zc!;YN)jtdG2G;V+9B89bN0)Q+7A}Jrzr)fMOzpS3e)f>K7kGQksu9uY@{YR2Fgl-H>_Gs%9)3d8#R+V%@}h zCF9T1=|Z`;S6*AuhTEF|)qH?F+Dq03ukhpGv^@Zu}^3W6=bT&GRqh5{`C z(w-PSeqzbek5Y5;?;)utSDk0^@5MX{shhtHw{}emx-R1PDz+sFkiv6k!-l% zUqY=AIds2~ymgrbIwy9fzC&+@Zwm#Pt2@y=xvJ@kfgz&}@F>V@{pvLa53s=Z@emV3 zG6IhSrY%vDCim#YmgTOh!iMO=(DeUqH^&Zan6_05aU{R1S<}C<5%W@F%=Ei@-oGlg zp=%!vqGXCi>Eb~ogN*Ow0QJzOLOM?^9@#g9H_xTVWQNJ!YDvH6Cq|^%@E1(~taVG3 z0#mAj{1=gc7hxA_T*%L*ydo_JU7Ct8)gRcR?P*&Fk~0fUdp_#HSmB%EYOO)KBr-FD z{Yr`}rJCiL_Y^VGwUU^Y8Wv#s{}Tylb32+=wuk>E60HBVNElU)I}plrD_fr8FWyIz z>h=czQ-(gb(@|2bDr%9|GNh$POEG3#Wo`vw7@O{E;!mY2T7ML#4?1_a5JwOpxc}2! zuA}1T5g{Uj-GvKR@Y%tLh|}iIcb6640x!Eq6HZ%bdB@6Gv1f(bn29>K!ut4Eb?45Q z6iZKso0Jdh_Ppm31Uwwyo?f^jsiTZS~vz;7BC~}_yA*ws>lG04rLR@C2x;FmIrBq z{3}t?qKa|J@}9NqEFI>k1uW2vEc(1aF$@jGwi*Q7z3~XBSfl`_mmeYV>2HZusG-`j zHe1DS>xd-eSV5@`iM<@m)C_Rb)kOC^x2JGFtarD&xpZX^+YDwwU3+8&0e|<(ECN=7 z#qsndg_azxOR)uOA6%sJ{X4K~rX!R6KcM!}`gcb!M82cuA+Kn~(WM?HEK1<079g0z zw*54I#RdWWhrlREbfR3|#&uM6M-y@6gWYXT*{B~5D!zuZtU=Kl6wz@fKj?KXnZZGB z-bcaKxZrBR@1{AWrz2nJNqYZu-L$ih18cfHX5E|=IXabe=gZ)^aqZKnU{PtSZ0hyd zhz5$E#aBf7I_t1KTz{`dT*CW{AC`Rcc|wRxq2gabP6Po7*c#rQ^euUQq$J!^T^%kg zEVHRJZW~;6*$L1O(-3@KOyN-L9Lcxjx0iE&7 zK?p}yV@~FSw9eDqvsn^ci6suA?pZ~P;urPr6)d6%=Do|?4e2Sdp*$nk=e;K{Dh6%d zCvT@o6$U3c|8#ng?kyDoT1Yj}iB9=h-h7lCSVAT6W^@kVJt5twNoQKoXRL)5whGgP zNc0|}4=ozN%0t0%B+SW(=qM%QxUf4wK*n{yWl`R&)*5jyK#}r9ciJuzs63-`LfzA5 zn!A{aI`xqd?5b$NMauDwCMEb$L%(vm+q&at?3V!?&9$OHBnXJ~o-OI+`#8cOukWh> zyovavrbC~yKeYA_2+2O26e8-)ou_pAqfsrsP(xIQ%UYJ1_Q6a-^({h*=0H%k1{Ro*IXP_i(FXM2l7AW7*=&mWGiMxFc0Z}?@4+%%{U+zPDGY@icG>x=SL`CavtfhfYQg*mARYLJ(-DD7dEZJm_)?TZ~ve301>e!MaHA z+7sT@sEN{Al)4!sY1Z8n%VUeOgvw5*p1^v%B&e!1)sm*ABJ0cje3u)2{W#-%Ywx$b z!mr@gVJm{PfY3ki%{?a-3FSBmfj_UJb>N!pzYYHiRt?if%jh7ekg8C-+Ek36x4lWO zXdEN>(>r{6#THtG=4Qkom{jnKeG1!<;V#u~^_(>fyRLj5IgMiplfd<^uvN9L?hYSY za4VyKUlTMwpV9gC&H>H5R~`=yz$h9u{D^rliD9U_O?^7iI)RhKK<-7ReAFP#snSc$ z2>Gm$8BYW<&@Xm$#1DO7yPYI}fJPk zBuip2u&fiLYPZ7y0W$+fRy{=yZi(Z39GrYZK{c7L)M^8xQ9M82p*a8kx-9ycml>Cn z4k(!w2n{s1CLlyWiN(U2WCBgnA#XzpixiFhZHI)AGsjw!_sp>Q^(>4iWQ6RhZGTH! z1z*or%?Th(N9TvVyQJc6i)7g7^j;f6Hj>M6eVQw6HLIdN7>U;N{QME0yqI1U)DMtRRn}sF!Q5IHYt=2ZO$sdOn zO^Nu&q0W8{gDG9QojV&kFG7pV!{OMCefOq?iDZG|!!tc|b&x(F!;UM^YQ*e;)?iRb z^|hT+rq~DQ)*g*&o((Ox-9?~ zqQDe6*d{P{MWDxci_X5tq}I+D^8|;xqqHI*LbTUWFi)f* zUn{FEX0TLu%2RQH65-u2M%S^ChToN;9pp?L#7PDGqROJH6pm{$FaBh+HV> z8M$$^GCgA!6*&U$LlTUrzeokXtS%XUbn1rmbkt!PVOaAtxQm6INa`)C5M|_ zL~DM7P!;0?H3>&!5~;A0dMVmg3>|yMT;1W*+OCRYrI$>LVNW!z^{98|o+Vxlj*EG^u3TFL3ZL(;ywqvG-8ckD&iORVfL>uNK1cO!fSxb4^K4 z>ssBGG!#k=1@{fn^d4c`Xako_G?Nvh0$a5h?8fCKRK*Y-*U?qXAb>Yd_xKXY8Ezh# zTbWQ4u0nKF3Nny3jZ_Bi6358{upBh*95FcOGEZnwgXsWBafm@yPr?&J>!`ApR&FBM z>Xwm{I^TQI?8Zs@&^%{)3TNGv$PSRW)ajtaqkOJ#4%-b940-Z!WFgFKofZ$VL1BEV z<$T#|O-P+hdtTY5tQZPX&7%(5S&Y`kEzMpy>@X02$cURdBgywEF?ynu3Lh!sTzewE z0KnAR$+eSm<}@+{oUQ+J-e#=oEDAC7{6i#oT zXf)e_@oKzJA%9izH_x5vqp!$#B>jst(={%kaj60ZlM(h?gm-*+47Dwz^i}*r>0C0m zlbXPAziam?b4|OFpuJt=9(3n>GPLnxc2A#n?Z#~S=F{H$8RLEa!5nkmALe!3=XqSE3{-xg zu18F45k}{XB&dBR80MT(-k)k1kCMmf2oJ6@?jrockMu28_1dSn8biewX+*O6t2Y24 z?XYr*Tlznk%VwsE9_2DLJ?cIk0aw+$85fOqR?E1qn`Otg0cd_no-!vi;Lg!>t>Qow zP$z^5nXxki6e|?^k{Xw)^Y-;lQQ^35|7JJ^SUd>uT?qFLvLk43BE0pffk`yTL;kbS z5sk#4$BWuSN{eDyrX$%5I-5HFke)t`cycw0QJy58qaKfy<^~Wi@bZ~N7Go%r30$E} z06>?*niy5;E4stLc`yw-?!!*e8C9aJb=i8zu>}*F;Tv`mB*2MWSO^=mdZlBfI1fKo zV60`vGfTGNR*H3|hGl!rZQC;O4+Rhs>*6Wgz7I&CNJDe&T<_HG5-QvOlqCzIll4JJ^KY#TgaAyQWN=@u$tBg zYX(Agb9dW+-;a3-oz-tMwGm3_gU7QE<%FL_27DEM@sre4yyH zQ*!KXZ2Bei0Pyi=E+{}J;$PAr@J!Bmk4P@Kd9P0&8^&u6R3cqjxAF;LQ^5&+s%3vS zy*5_3et0>k=ORcWhu4JBy>ZhRq*l#V5z_9Y__N@v`rHQM3x@B1(Jlilt_%EebMK5D zAQ*bRuQ}dn*OE4cBM<^ZV3Ww*^DYQH3%%rORxDxpCv)j0ugq;lSX0|7}egUvJ1W z@@hu{PY(@qKgM0rjEtC2ZQk`-_}ezsghgh>tqo&H@@_Y}zqaox4KA2oXfH7rFM2z+~7=YxOQJMa1*vhIa{8GBmN}Wln3qR>Gg~mpr z(7JmAIsFs9&qVbg;8tY>It-Wr<cq69P9} z5(CwkS_-ZB!UblE6A@AttD>Z^A~A#8dFADgT2@V4@%~Wg&v)j<7zVpT-H>YD^0726 z47#}#CIPb1eO)Y-=8YDJTd4oQ5y%vTOy4S1i?moObgu7OOkAHE{pcae)c;v3V+)8P zGB3%;#ON=&3W17H;YpWSPx30>qRi&XD!KxUA+-*^+5a~j0n2*4!@W`eKRANv|BoXM zGdMAcLTiAZ;m<)TWJ2>#@;|#a-ou*5-3a)bZo#x=2aU1dzxugRHX_4D$jji-MOHO` z^LcviNGj6?-y3B?fX3^Ya?VMmgyX1-3xoQ#AFdO8%-fPn*#ou?ex{it+N$}}jdm^0e& z*mV@FfA;O0;#M-ENDEavf#Tt02wnfs0~W2RCK_6*`SzQvZ|-?P089>SNz+`u$eu^a z-^o22F#n>Kp~z{!nKvIZg7;BT>%q(NAu_-N9AMMu>=7I=CDjx4yi8|^rXix2A^nyn z;6lE4OmdDpKtS4wKeuo=; z#0IajgiAzG!+XB=U>40AB)=S&403<~s`PRtzF38gj6uzKqEuRuzd-WBVLEkJA62mKd_Wg* z&Cg%Zn0bFSJp4YP%jz>q7)mLe z(>x|+e-INMk@;>qJz3qBTz=yHQ;SKIQOEi z)&p!YOqz0C-A!uwLsS6w%Q(lRg$#WCt296Z%ze}Mm7TM%$PGCOD#Mcv5D5m({AL+v zNz(>qlCIl`yMrm0VBJU8p(?%ejcd-=YIb3UJnji2ou>ZSqV7|h`Qy%D7I^yOJM~vs zMYQl2pJtV8%jx0ZK78a{>LbnLO#JIb&Vqxb58P5$lLX!Yi1nZ6?blyR5SO5?VDQ4Q zhd;m$;}=h=eir)Z|Kf;=4zQU7LofZ@2zUy)p6?GKSAusVD7LW1J+~duWT~m^>@kLU z>Z>^>mB67sS2PICvrsuwiZc$4gAMyU}}Z85r^9#p65IGiRoY4m=my zJSSiTF`lj?Fa-y$pu^d&K|=*$T36Yu2c2r=sG5ZzLI}D*+fH|ViDwqmetEh%e4gw` z6FFRX=|#HR6vYBmMFhLv2J@rpZY8*Sa=n6CCOn?9bj3uunF=Rd5YGFWYk>0c=VQ+5 zfzTTj-1HEXDHZ8uZeMb;l{jKR>e305?{FO14;?&XW^YR*&NAQB6>2ggX?~*VE~Sc3 z`t-*_Rk-dJ6u=@cvkzXs%m}fBN>rt$k~Kras9}QQ<&oF zFZ2GywGO9m$$SSo%~r9<9j4yC>- zbE6fzk@wHI^xF~UGzLfU%@2j^s)*EgS1c2lRs$^=lt2GDaN-(jlCH%UO2iI^35sTL zTaZ!0Ol-v%j*SJMcfk9M=e!W4i>Fi(jc+SUL{OrwGFCDh;d8;4NH+ONI15?rJ>c2oRcc3wbE|{|0-KDqPT;LW=T%V5{5Ch!uktoXQw)y3TCkT z^IArU@`FgCRyvUDRaA6{TmI-hS=wi5Dujn=TlkSz!6XAYk zWxd+~fzTOmN?@?AC_$=}|-} zYs9Qir5`df5<6I=?x~Em)+$MGR#TrVxeG*Am1rQxPZ#F{9k4SEmjCA2Gmg7*{~h6h zIwbvhi%h=`q9UA+{-E*fj3&QY#pgNl<|wLfiLgTEsQp$Hu4BeUU)Y`My6{ccLfK|X z68BkbmzmhCKS%cu6NX`_{^9~b${%F$&IUr4+m~3?D4LkBJ!U6oNdeJ{~)=t(jLRXN3mEnU|75(kbo6c;ePSqdaFaZSfL}*|y z)?`(%^f-TMxNO||vW36@{aseKMb6_%c?Xz& z>^atR_cbYpwgu2i+qTsg#5-z5DckLy5iX?bT6tR2sE1x=K~xuS1qNkr{eILA%h4ZL ze3tkMWby{48R;52?8fNG;REEF=Z&@{H%wuavujeP1X~`(?W^QbIklc6lNjtgB}+ZF zVT1p&PtY3uNYvIr+?5@Pq=5C|#m}`nYC@w4kB2@5i^hapSMdVpa=skMovhv6T26$p zMkO>(09HEJ0!PLmk<~3rxYJm)wn>~fsSB}{Zi9Y@+tNre!}b`M*`Dgds99qteqFRo zz&_ZpQKeYefLmxVy~QuuSgNBhX3{dyhb#9EnCR5lIC z1|#$*d3$ZVMAWts*=t&_6}Dj=y(2%pQv*N}rim~p%Vo}QtbO>2v;$bMsIYeJ+)GA* zNn{puWYT&BJZjKZLlDwl-%6k7Sov3(-i{^ZT+n_x;_od$C@am;ol9$_L{w~Hlw^g2 z-}?n?<=e^Zy?{2#^_8K<0a_7dHiO1E+ga;@t6(C>iciqM>KI4Qr6XdA5^A>4_hG=~eqW92m{S zA}xgEDfQ-Yah-5s)Fhaw7}V&skHnG!_N|iicF_?SdW6rUWY@5Uyw(tC@dz3WFxH@t zf>#O64V&S?ty1{l|0LD9gC(l(A{4c!sQb~`hPUD3WJpfckp41C5r)S?;Tg80t&H*F zCOM)KH(Xa*eX}@BA2JqLw7y=x5O;EEC;;{!XInaHHSrKMcN?}oA-n8s)hBS1nE3FmhlU~7#(&QlnMf=z`)MX;J4Y6`kID~^RyaVn;=yZHw(jnxrGaT1T1jpt4#3>viT9Fg@%ffKK zntDnuI=( zhCOG1x0JZU12(S1UzAizVR1kHizjB2woxGzQVT_cPBkT;QSVWWttb;hzxcQ;@2)Gb zyxnE}qy-KJ4_3B4JI_F(cLTMs;neGA=7aNYjPi2DU*5<)KHKD*hAQo~JBDI7@Z0sU zAtTrL6{tMOAWir?od)E4YDRRhz2c({mj>SD zbe%5(`dKd1SoyGtRIt&Id#>|=#M}~f1_p&(h^kwzX>?0&nDy454$a9!PLcD2pTuEE zku;dBv`2zKka>S5y@g)S+sE=+JK9&gi}^Y5S0x2I-A9jY54N{tOPc$yd#xkfsq#rnFx;JmQADvWpGbzwiJFXDh_tYLTsC3vn$1)0Rj_*?WSv0I*S&Q{IpQ*37ORa> zQ8u}f>u;fYjfS8)a(cOtRfuK~Kt;0nduyi07ArNnZ4YNj?HhM@lZUtX1zQz=essi? z7?HvGDyl|{daOW4&tePRL2?2U!v^;5#_rzkn3%bi_SnO{c#=O^L6^HBJ!n{4ob7^@#C z^qRHYfO+$@<5Zd`xWFH}Sl0{%249%~StGlH8*+d8*dEjt;v7DIkn*y7f#t5l{RoJ& z^=j@`GAe7$mPEts=T;#!_HHXDm^r3_9wszfXP%g)dHKvF2*8|g+Ybme^LAOYp|f31 z&*nOJUGJ)tEw(orSi|ld+nz<_`Zj_oBP#s zIQT0p?X|h&^YD$3gjQRaK2`E~cfFsSibH?^VcA{EqikA0k*mSz>?ARPXo`h&1~;h- z!mqkdZc6HgUpb}%1jt3G;)3^eYe6E3hspmw&AF58iFfbT+It>Gn0|$5hn(wVqOtuu z9SN6#FXLP$dXUkeKbT%H)1KE;!HAF#0|NxmCcC(FFe97d7>|^?Y~p_#saRjPeYbJn zQuV3lfUF^x*UE*yWlU{_f62M$7{9)-H`IZzU9>HO2}A0ZR6BqWB&+mEfuv zn!&v+FJ~%&Hud#hgQgG}>D6pksFp^pZVTKXmRp$gT+-18>*_|H^IK#e9f!RZ6xH&P zH4xxvgJ)>Iu&|PbsbTy`|HzDdI=W z_D41oY2v9HCVH16-Qw#!ObHJga{^OW^J6=`n21^>8&qK&0--o5YU22%wSa(T*^7BI zsbAt!SL(o{nMEyuWgRppYEAy$We;MM`|=ne5TL9lEbve$Ls(iax`boxWrfT*j4m-X z@m;Z~cXclv_0v`rA028(S5KrveM%v$R0aJiHs9*Qq|X6-|7ZDf>=)KCXz{zYH$i0z z0bhLZZQA7zpw3*m@g641$-{ZNyF`RN50a=juFSkg#R*z09zGnFds6_22nA*ql}SNx zAHHUPfuYauE#D$j&pP5#Zs$=`7|TLkuYoqB*Zw~S<+ek7&X5b(U@46*F0!L=gy9oB z#g4KjX8XQo?`EE-|i=envI)<^c%U7F1lbVlMTwU>3w zt=`c4VlN1Ei@ED|GE)%V)j{cvQrRVPvf;v}mGteu;tvM38d936FFZ9$dH3C`cF|=m=P_}w8nd~v+n4K70Vzb%$3Jz>qTfbe44)^R;A$9>_f@qkF)H#JCexRu z6nx5@4xG~wUt@h{85vc%bJpJfj3>^Z*5abfTPYu|(}h!?Hna{-B0!AMurN|&r}VY5 z|Cq_{P9Dehh*~^Y$cRktS~_LZHG@e<{~k-+^l~aq+))nr9WMi(PBt}l}B=2BGE8UlyI(F4PI zGOg9KfqI4==E%nPzKF&HP2QWF!;;d;LlTpO|0Rwrj49J4_9Se9ZFJA;`I`6h*#(bK zRUx)vGONEL`gSQyLlwk~ULK;KmHmrnB&0Bn+aWe}B%bvQo17^qgPp0iO^@bnOy90} zcxrf2sa@NiF}vvMzUzKaINF)s4h30%^<{;)y~dcO+SbBscjfT&43nuuF}K@xYUp^% zNX{O+ZEQ9k_}m(i8WrL;)9kAeAR#`^9l0IZJe3sw1gt#Me=>KWWlxa{uRI;J@^*~- zjA1U6GjuvO+Xr~K^Um8X?+c@QVwk&Or)6HX6!2#{#hspP-o#XLHx{rqhf)73dR%~e?{L%>oUvL$)RGs z6aYfU*N)+8jPX2n<^AnwziIU~m$yzyciG4j5uE8GgGj!5X|l<#Ex(^s84kUqW%w1< z03u+rW;^+oZT!A1mxb(-p@qYt0GaU!eB$kCbWZE^g7z|GGAI6|5alWvdf%}z^_I32 z)+HgJXAn7-#1<7?JakIeb@eZSWl^zsJms^zb?4$oB4)omzaM2s4EtAG$EGRWirfOA zjLJ zJDaUP`wyWdVr;^MOlfR98wCT2+B648i_PH}zFMgx09sx@^fFuKS3F<&xQZlKoGg;OWK~aiGMx~vd6&hb zY-KWfewef+QdzKomD$=Jxa|_HSBXmQhYI8Ms0Td{g|pr4akByzr(t}0_2yNx{gr6( zrB^hHtbeJw;_AYpU1f0Ji$b7#Opra#F+CG~Qu2eIp#kmaRiUL^hP-lQ>JQ_^bXJQo z`B@wGTYbmIYh&8bg|>2(5!P@si^ghH%u{3^=IniAr1`Ig1Y>N~B3bbWzo_7m*v1J3 z>BF?Oa)evc0MICcin2tohx@5?oA$Glj(sre0wSV7A6C>}+dQQZ|3QP)E9L8#PJ=`V& zQMiT-w7>5hqZ8quZR?fEUE9;1taaFZGG_H#<|KG3fNu2tnQ(Zl%u%c%Iou=p7&H(Uch+V21`7u2RZcU;L_w&^@7g&h)NYQ7E|Ad zs#U<4`_Cl?$N^?5hP->W-wg#{x=Sy)v#eS*5!8`QcQ`CmljVHz5Qu~?!w(&^7K*X+ zO18mvE24D$;LlJuveO*PG^XZI*lE(hKV-K&yB=m2`X_$xOVI`aHAv)t6vbicX9M*r zL^eK+F~Tb_SAr{ASd_-`wOrr)LLx96;d{V25DgRo-8gTfxWP$rcnFCM_>@W6UN~_v zCa3pH#B&tCjJaA`)2a$`QqQ2*`wPeI8+_F{$_W0!{J=9RQIXdu)cdRcjfan(W)}Td z^lCGMo|O#W91+=XhZ=G<#0l5()rpZ`bE=of3jUo@r`6 zBq8e#JKPyeiqL~Z;Mrf5`P%UL0c!@tU zDqbU};rDP8En@kN6!1pyX6~C&0IBzYm3n(dOvokw0!N>%oQ~x#GWW1;;YHpUTr;rb z0C-KCVroeoc2K{!b+Z}U39~iLmOfKG(^_1U9RNzAhc2K!3Z$J>kp)=~L*VLfaigmQ zN5r*sTGw~jBy{x{u23s}_%v90tlHPw_gvNyvUygexh2Ho9_^1SDv0N9)v z!jIe3#2J?%$${%rlTVD6R(nOVV zqsY4iuMhF}G7fUf=lsoJ74hez-~q}#g12Wz`d=b{orw^F#OfQ9k5-G#snm+FH((qq z<5xy>n&VL-0#aOv8N=uVPbv)UyMEy5QkGhRFvH4yYNFuz54+Ho zH%f3e2eCBs2iyJgj8=Rf^KkDWf}WppfU|G z^37nkQ@puguxe*q@s*;X6r=OHz4kW??0*-p;nN=tr!|szx10Uu_7g<5vrrToT+FkY zxDl#;s6EpncJa3gXu_h_n;_ForwRPAeDqv1@sAliNaS(G>j{)1eDH@by)L7;xe$5N z+mhk1r=84sgr^3>5@0qzmRCauHk2|w@o(~N7v7xt!p7~tPI>8X(AxRA@&__l276!t z0{95{7-ug^wwY~FBx*r-q8JQsJFCoX8gsVQcg!?ISYbmX?&~uG2XLk}%5-O?0nU?% zI9zWjU#bREQH*6aHv-dH@RyJI1_I^W{ZvX!vT_di+y>DBaC;R38DHx6a`ozPPkcOd z9)X2kWwcnVh2J~rD&#mXF@qOM-C@0q@(P6lABq{PfN*>w+;@?(oKQ5F!5dw3m2-yv zfGAf#wjV};gPrtQeZoJe3QaEcA22pRm1e&d(iBX{V?7ahn0ErQIA89utpYE3V@zaw zDq@veF3X>TVQgq>1_KHtv|7hvE)vnBHvA`-_0+VVC{^Of7k3W6pNt8rQ*yCIqCrZT zl~M$fN9XbH5?1;!*d=E{Gp|y9GVQ%Dm{W)~$j~UQ!u$u2h^eaw(@>C_PSwV0JF*t@ z|3t0u)Wx%vdOB5QDBlP}qQmjJNRA8H%S*FaiF=+ro*hNd{$0XeD=|t)+V6|m`rm*A z!uYxZ|96J}0TT58e<1PN)3x0lI~g|P8YoC4eE$dcc|+Rs?jO2f^qAdu&&-kzms*aG zVe?*dHNg_uz{=s}Cn&#F#PIC2g zWLOdepmf$v1w~`>vW=PlkgbHy0l5K_i31T4F5<6ZxBt4QZz#387R_LYAgDYibQ z=}{;)NxE}GsVUpH5%q3-Wjspr1(gOXhTIOjn3rrc3d57avb3wi1NrC0O6_DKYNLV^ zxZ(dq_4e+{YE9En;~-jBF+)fz-<1&z(EokX`S_AQ@H_5e6={k{NE=b0KLqw~O;T~< zloqIrZJ7LAEX1AuEmCMNl+u3P77$3!zx_>~6Nx=+Jinw=e%sN>R~xWT2?A&wtTSo_ z>~e4ND|@9!*qr|MELOXx&id9mmSbk9X%rQX$8TnQW|_H&kIh8O+eK2Uvxt9Ze?N^+ z*1Y2difjP^Dj)h-b|23AAAWxy5kW(?hRjYn4Xx$SD6&QP%l1aGwHZ;6M&S4_`xer= zS!%Rn6}Z{F)mlSgx1zFZYI?E`j0wTt@_1mOXu6Z|D%( z#Pgm#=l5| z;fD<^Nno_mdk8s>M;ogrHy_7v6{EIbzJ-0u+?B24@Y&RIx7^+zS94*SB(n=wO%Nbm zTxbAHsq5wx&O>ujhswMZg)g({42tx@K=yR}@^(eaN^T>|Z^&A_8Nq#yT_ zLq^Qk(h>4L&`1CX069^l4^frXyy#+WJV1i?4Go`9tmSOT&%$l1c0zH#&xXDmuZN5^ z14WYFi2mX@>b!VTE7MaV%>eCtFe_OwJ_w*D;r5WK-GiTrODfYAdaeiTNY!p!BwAvi zKZSXfa;duOVE5_Fdk?N`LR0#kCDsv7tzlm+~olcR2>BYEPENmadOAVRx`r+ zp_G;4CK44^rNNNL$$mC~*=`+shdncHwM*l zeN~V;wrXx6EqGR`nE;L(Sm7vluP?vInufFbmRyQzn1^Xe^Rp%c-m`P*DB7_4^>2CT|6z!z9?-0ZJzuucKDvO!*(x%o@abn#=D3n1KQjY<{V$N1?f_fUBQY=8qt`3OFvBMKrjYZ; zYE__{O(9fdr=pr~^Wvseg&I$JPc2Q}O>CjMjJlREHI&u=DK~=boMXZ2 z^qCH5e*(`hfFm7EKF0SQ)j9vSkn2?h*YO`3xr8T${r$c9Urs1LsqsqS8OtN71I%RN zYRb|Tb~}<8-@3*N!xYr`pZm9!z^EX9Cq zwsx`*0&&=ui6t2&@MOWqfF7ahvcOZa6D^_koP4nW)Uv$CfyM#2Bb0SA9}JVYdG&@>0*Ru?<$N%k0lH>PM`_u{T)z+ zbg7(*6|FU@dN7hOww^vhmqBxaI{l7-ytyaBNEios0uBToXY8~fi3r;lcAwcyTyN54 zUAXTUkq?%v_`k~WRzT8~UUy68E zW!NIpFn2PJ(M7e#_mH$?dtEciueOol3E6zw{xw{+53;1zqPpb6w<&ue$8vBNgSH*D@ zFgF?0`g0dEYZ>?UIaF289fEJo-_B_=i?-ZoNN2;!w2ynFfqfqVQ5Kq{PS=<7gjmD{ z;Ux_FbP-gRSv?Vs4B~U0B=XIgR8~sPI+~`KivLoMloshQeoW)9(ZmCi%)Y4wObPo{ zf*c0($n0xKb`NNqxqM7jtedRjjNTQ~8H>gYMKaZF)Hl?|L0<;I4)oRi9pn}d3;K|E zwUdPwWp=nEiuc;ZM?3E|w@g-Pk`IH1Z?SvlXLeR0+8e!><3=l-7rss?w)3xVRS$L( zVde3O*-_r=YvubHWevntgrnjARwF8yf|n>0)|^zL%y;-Rnb2hNlTkjI(_e>!J&e{k z7dw&_)I_Vw zHu$Rk`u60PjpnQU*ud2{>*u6PRpDl}pOie26HT{|{mxOSF$bcRC{IyQrwg&;^-6q_ zY$U;V>iHmZ;>Xagn|9t0Kb$zfdn@IW-w{%Z*X-y^#aGOQU~BRBZ zz7DHRnoee-Ar>$E3cm2u?2g;$C+ zkG1$pC;w5~{Btq>CROZe%((Sgg`n8pI1wIZnPK{+ zOR_+w)>sGm}PJ$z3eiC>@#|0@MD@IsT z;hY3hJ+6~Jy{RuTUxLh@py&2p-L3~zOZ4JCyoK}|i>{eTZ-M`qggG#gLuc*irr(yX zQS9O^DwekY<4J4~$7KH0rF{L!?_+Msg80dH?KGV9XN{l%EvPSn-)&nw`!Vr6q$rn8 z4lILJqWJAZUbd)mRjaBByYV4n0UwKi3qc8sMCnp&GC=1@B?nH*F*G$QjY1$j5=jjz zX4!@slWYRR8S2SX`i*~b!fLvbvRG=fA#q{|qGzW_MGKC177qgfhSi7njx_iRZFMi;)%ii1`KQB^dTlXZ%{|DBnx^_e>CSsz*e`*O@>|1ujOmL!g zW^<30@#p%cqs~Sp6><<})sTr;j3bqn!`w~&SiRX(-De% z{C}}J$B^xellV0JD-}1NOqO$VCP@aci5wf$swNUBLP@(AZ>{yxsb1%47LoqX?dWH8 zc^{_yHmbe#Zg{y^d{Ms{`hRUOCBoM~d&sQ|H7tW63!9gge%UA*Ql4LUGvM-uIP`;~+?KDOHA`Ug=xe^yHAO zup_T>I&J!F@Z^`r16vs~bj*KqX`E9$O3ew8DgcKH9Li)rsaKm_HO!2u6CApfT?Msm zIP|=4CGuq(1o)@DmU6<&Aq#CmA{Q<(9mb^x+TFemT*~!9RTIJJyLl>POgyrl) z2ypWfx^_nOsLflSef>nloVt$l)Lbp$SN5{&>*gP+6MrV*$msd|b?F{#c9*3&7#x^g z1uY#G9W&R0S!Wjmc)TCq#?Aw&_~Mp^ma5~eC2X-|^1i5Ee33_NZXjc){R@bw$uvQX!NkD3H{GFo>W` z@2t=aZ}iR6esMpLIAZ(PL=HiCBcN+?r)2f8+Lg~wmIN8{eIq2&9Fr|zu0Fs1bmH~4 zt|b@hh<*Sgw|U04+P$yZIPS{ZZSjosC>(p)_X)I>CTee=PyNnav~@TMw!_$1oxzMx z&hJMwIz7*jw%BF!T8-4xmsn&(RUAZ>jjKI@5-=T_UTJ~J;YPLhfS=^wGCg)!(*o;N z8s>FS$c3c9_EK_W1&qZa*f|TE`jd#RZvewQI(IVs(1|QN2xrVzgC3GDk4f4Z2buJ_ z=$HZHHv*=}4#6ud**7QV1f-#&!%mk*{%*B6s{sXe*(xo1kpmIZQFYl{H7CODmxt>K zpVp?>C&XsSm&8~}5-D>o+|7)d^*gNdVCw@7J_4?MTRdE&r(}KFn>Tam(1O}VUT!Q{ z>|EakIxUS12ifdzo2BFUgt)nxvH%4ueu@E^vSONm<#YLt7ln<|@0Yw|Aqi2!nQO;bVv&28;Cie9;vEJdfXJT#?;Fldw`A(J+%5(NR#;CsYJ zmR2I$`gTw%oWBOZ6*Z17)}b(bN`HCiNk9E!@EWZdJ@l7eBBP@@02`L!X)^)V69v4?D){KlRt$`;bDrI+i~TAnItc1P#&lhmoPDSy57zGE=& zh?Org>4M>!g*)>mPK&Z(dnr=x0GyD1aDmsw0aEC1$)12dcG?88Q#rR0vvEAV_Iufh z1dYmv&IsD1f3LHZr5ddYno z?5Uk8;``?ie2m5#PyxP3Y*~G8nusW_aOlW<+*lmO(eXSdnLbxLscvZp_CI)p0mrr2 zpxg2Hvh2!Z%`{)UzHca08XeAjj_mMVdg8JA0=WFTByA0UTUkba#n6Sg>}mWq(zo2H zF}Eq^EJ|*8_-{M{DP0Y^YxU%Rc*K8^M||r(^x_@qnl$k!%7=S?;lcdpGDemaR-k@t z@9y^p`4ZNx(v2iC>NnuNRmcex*=cC`wJn6mK95&MXHuZH`a1|PDyTsSzh20oi%G~M zv{O$a%au${ojsi1E zRMrzcPhQfM6z{M7AO;{EX9Ii)6=Qv(3<_Xeb{+Jkvj4Ov;3>2p4t*{8FsJ8-`Gq#N zkqHk*OUwE^alD@*NBHNSqHa}Z2Of2Uj90ED&5&|#*I(~Chz0}Z2kJ_Vnqr7!*X*=E zG*flR*ChXBHn9uHkc5?QrG(wH+OGc+CHTECw^#eqpF(jtq)VsTB9SM&Wh0u8Dhw~B zAz{qH>w4+aVgS9imb)1ZzM=)j@J4@<^arRHM}RnqCNlg&Shnfx%o5-CFdYyD>Dg1p}-K%5UZuJFPTEAbbg-(0f;CaX6V!zdGMdm<>SSM#sfWI zHp>*YQJbcE*L_e2g!v%^N#FKtlUeWqsAQnbG#7SMhgbJxxRR9A&m&k;00u-D-`OlNr$!9=sx--y2mC%%Tum?VK-t6dPGPvd{5sLznYXxu#b zF!=hn{cOLaoX3B)Lq97_46X@Fu2_cH!Sy=Az%`UNX3g+VCotr?Nb)jeXiPeTaU4a+ zn1{pXrU-VqF)43=%drFY_%u7b3}5fTnkRRiuINt>tvP_$lN{2F8m%rX)EjSun|%V- zpTOooOB|&B?E|8Y(&kK9lQIQDX^rHk0vQAnHN3Dlm(%*!c{oVv*%@#ObajIOqf3A+ zL&6R=k*a^6m+waJ?UaV~=hTIW$Ijg6*8X=`*NZ{O3n|If()maNLHXVd!%pTT0|H>F z^f}ic(MQBm{SL!#%cEGE8K3DBT-*j#JUMkopCm%yT`19`R4BrT%(TlUgO_r?KZSq4oGGz95NUgUpy#MjQx@GNI&c#cr+ zNsjVoR8dp*QA#a4>Po*l?Br&m(EaotR?fE+am3$!G$Y;+@zssEd90(s^#koxAI+G? zhpoG*wa((jq|~}ErOlVbIJ|0w{B^;iS~jkSD!o|oxvj9GPNK#~KaC2sczQNif8bQ+ zXrmWp`r|7eq7v88XtVJ?HYsw!w3qd9y~vy1@D$T=gKRtb%3ucIcs zQ0v>(oKNLc%-PJjn(E@|9leXQ%(373MiblgXTGdmNKIx~`T3+|d-_!$KL2HOJ+L$FB&&xHKn9}q&4XO}|f1C}R7ZaoInGpGW#5*NRBOrtIxf`SC zPWMZW&J%ojQ)4UJvz!lysnYOLhKa?Ur>&Q5 zy1PkfYISk6SSaL0LSKieUq#j0^+{3|r>la)mCBo{Oo4yf6&THJL|U8$ie{HOC5ZV^ zs%gvxd%|wHc_DR;&nAJVDf{H!#nrsBnl}&Ups9X0n|sb)bZLKqo5?q>X3;o2Md!uf zS=*_L64)YshWl`7nvv$d;jwb;IXP~(lI&((HF3JaiFlg=$QgGZLJxnTTSUe#wo zaf|{c`GKTdX8sRRU%cs{xmvx-L8NjC$OS&1Jdb$|1*7tEkf*_7+yqerB?_tECJ&;#d5Zah)P0Cy&XV`Vgt!B*d(ISNW3-tNopS-YXr~D*G?O zWrX-fvIEmtK$RP&P3%;MMbz<~hwc6b(d~4{rF1?SjL^SOi>%a?KPGpV_o5=flBvvY z(9ktokDZJ%VZl=q62}Vb+4=`3Tb8fpMtqNoiA4|_9wvjr6g-*;w%$jLWNbgZvragF zv-c{|TEpw#V<(e6zNL9uuG-%0P_cBeT)YR3xD}SEm7CN&ZY+@6x)7DKgksbDtQxwv z?!oED%~Mu@9C;4QItx8u+=gJ4=QNiaJfb z>(?T)i97-ypMp`IB+HIh9gC|xQ|ShU&gYYUC5B<`llBWaMqvmx&0JI1rCK6(R3ur0 z%39re2Vm{FFizk1PuJ{(2phNPQm%XOh^(IzO4VdSgMs*>Q1C{v#Q%#VP%otikF$jed|~z!7*$n8*ubZu z=NZA&UcOgsD^Xh| zZfqWdTmm!OTn{}y;A`BA_rhFa5kB3PSThtSc!SfQ$=DWE6uDL{E{2`ow;zmK(EgP8 zNa~umO6$X0!e1${!@xui7My5t(XOl^IMk!k4zAi8xwY&q|IacFbul$EK<^t`0ZqD7 z4NF zt}QxHB+kRLu@?}wkx=-E@bBIY2^$v?Zxk#pI!@>qID3`#A=#V`PE6uXM|(WYXyaG_ z3JkjNLY`6~ls;knPZQ{_NWqfdH;asm4V=pg<~gbI6|)ij#^QPhW2YNobS<>s!WdKG!sdY8+O7`-0>R);V9Ky z6soGoNo2dXny^se#7WO+%d`v~t=vfQ{!6~2FyG7EWC(DY<}WGMtV;vM_>Jaq`B~094W_4WatDGIJF{`^=LxI>Q`X ztj}U;Nr^!8u8Hb&Q<0&v6~hjE$aaV+maM8!{KQZ@#aI0f5wql!!Vs$GMYrOQiuw=D zYD}bVCt(}*q#=CemDPRaKQ;JDV&xvx@Wq@GFy_{Kkk{DL-%{Y=d_+?6eK*Mt$i8N| z5}mPxKp?z;Cm1d{PK0-;d1+!iUL*TuxprWLny|S)i5Tq0A&uips3fjh!x_7oERH9w)X+t^-mOG- zLqPo24#Vh$VyQvOPnj@0AsGc2rNXO1#y9#hZt_7Ma_kY|^2M#pVVANhgMP{Vx;o6s_a6Tg>?tjG9v z0CfHco#9+$xq8K#Wq*@g0AF{)@*{z%VLZ*Gj3kGsO)K zreQ9kbdB-oe-W*1k+*=Qd@k-QvemvPHN+{a3oLVRL_qnKE{!-TQASvWGrK`dFQX@% zc)5@X(n;ocielEofU*VRVG{Ld^NOk?_z`OIuJatL>at2H=NavBI&LU7Qju#y&`QSI zJqzPs${!`9s>x26>X){$jy9*$Eu2B=C~?FpmGJ7~5TwPsMvN*ISqHe8r^*bq)Q}Lo zT0!6)`#5uJq@*ilV#h!zcz_~(KzQjR0d9sF>Lzi=3@T=J8(r*r4 zh^av!rm5!F6|2pVvbD>n;p-%x3YT`ee`Y1@7RO2@tYzfJQ}DFJpO+35Qvo^71&y(E zV)#v7Aq9stTT(ff9Y@x?Eggh%SkUAVzTb=l+lD?A?nGGXUlurGfAE;#=yxY_beC)= zYKHnt)hcs9f+XRO%vd|v-#(n-yLez=|TxM3x(baH;-dRCAi6b7q zG&mIC4#SCN?TBlo26DStsEfiSM7JNS5afS#!v9ouLz?CvzR)v+5tl{M%AgFP^~aRd zpvF)zV6?a3W2*FhB;K|&AJ+s^y8*OvQ8Xt6wd;8EdqEu4BD%T5zltqP`AO`kUXrQC1>3h8Zy6dQyD$7N^Ztx~nVfpRd1w z$uAB5A4tM6fM^uoA3LJ! ze0Ifj#5hxmqx%f#a-y7;&~vaGd338se=&COPe(J7Ki>3%P*8|qW;q!Q$@TZYiHiyG zHQYAu#}_&7{+UnJrvhGIc)aRAr)Z^Z5sh|=rj1y|UM4cobK33rS)gUj$#y2hdP=?s zvW-UlNY&v;0Ke9~wt?8IJ0F>#hMnW{XmeOsi*xcqQArY|BA^u0drDK(q$6Q15ol1z z?v6LI9iE5Cy7bgCIm-l>qPKt;nYIXkVScq#R~xg?HxJuIAm$_G-3Yyb`#It3Np(8{ zaErS4(gKn4NJMi$_tT39LYbW<2hKBwC!6WSdug4aecwVvy4GR-qhm`bCCF%y%jJQ8 zM1Rt_kEOZvZVGyf`o=E>E3u6;^E@Tx1Kax`(TQ+Yfy52f!2qnO{<&BkrQ<0)Hr{f- z4)b#)Oy?>a2!(IwElQ=D${))fBgazde9*k3cFr5s21D1ZmTEQlIj z`Jk(eA=+OGx*e5?VtzFkeHI<_Z}Ua6c_oJz(pqHRuRnHWB-ynBF*o4h+EP9IDm8zw zR_m0J={)G|uU`Py=|1ohc9i`o#O|QgrD^+Ihxuo!2pZ~W0Eif@QWCV_03So7Y&~us zI^C=J7ln-Ql5fOFKZG(QJ;7Y>cI%*&gbv}ca65@T^zfi5YVBZd^M1Q2{$4WpARl9A z%`y6<$B(M2!G`bjX`Sx}#3L~vdQ&hlwAxvvE6iAcp5;O&&Jl%tCO#5)mOH zMb;kT5AzSN#T7~J(p>-!AuIBm&eDB=Wv9}`F#vZi39pytU+Grk>V=@AQldomj8;CI zUAU!)$dRu-!_6`-!54li=>57ywO6m=vhSC}+QDmz z4BH;?0Rj^2tRjg@v<7I8l-U$|FG}6Ndza|@_7ls3U%q8Rzr)ENfMX~E7h=GbN8bNN z5(}LGlkKG6#VH;+r|HIp!7+NZ6iNvC#;o)y@8o0Bb;<0gBz|edJZ>=~C6^@#dO3yg z+2dH6WOg0n;)pQH`+RSSE*hpLYX3^WyUN@_*1LnhZDwhW9|U8!(f2QiZ8AGIz&qtz zk6Geg)-yN?u~ePbf%Kc0zI6oGF#_`?I`~#iSU99DK~m1YV4Nm|1`y3mlH+BH6FqFQ z^NhTq2|3T%;*}|t>=bYgOq1#>gtljTj^ly?r^sZR_bFmK;Vn|W>CY#Yz-`?m<^z)o ziXyeYODvDM92Tl*!NcgZFx)Q&+2)zeg;?EZ8g+C8wiNFH>)9xY0nOt7nSZ1GYXK_o zhE>8-JS1#63Y)P`(PpIls2RzsOX6Twjx^g@SSPy&{+X2Pq)t9tVwD9Nz%UfAE5*q# zc$n3+{IGb!z&TI3vuATdq}s}1?u&E#5ZL`0C{J67gWa&zt*KmvT^B%CIr>Ks3@aPs zW&cEn5S>BZbLh$QGpBRz?YE7j;U|CfXUs`Dh^T|7yYKp6LwZv^mgSUIm&_ z!=GQCCHRx_KFc!}*_273M=vI|u*cdKO(?k2ZDncg@zQqbSprr#NEL}h7=FZt=^Ryo z(Rk|I?u9tUJIGvIP(|;N$Q;=|`y)GZ-8IK%$DV3}#ZF%4`72=|zo&kb{S*V1WLl3l zX!cm|hWOKUcWAn%Ge=w-+uua3DzT`=Jg*aIR&wuA4WW_{!!ji+6Mjc{s2w^~FRfkC zawr&^sHRjX_zlZL>t&o}rID1rQZ!)@2Y=Pbp3>=&9_&5pS^sx;f`KF}ay|H*W{1_S z|Wz{f3zmJ%j*+10*sW3VisYojz3omS~g% zXA*t8*il)G=TjyQ2|Tt;%#n+8(O9vpk06q{_68x-A(ve9Y@Ok(FJd}t%2*n$L(vU# zz`1rl$>sy)F+npk)rVJVp8RyWkIZs7I#EEDcc%wuII!;33oV$&|VQumnlICM=TU*PMZtz zpNMo9S)B}2pUKs*HTeLEDRi3JX^^SLdM!W{^#+6!$9u@e7>NQQZc%e5nfp2et6%v# zrSWcmp(P1;u)@JlL%9piPxyax%mtqEedF_w{Is1=gQ?~rr|{|)Q2YmyAClvJR#kV9%2 z5fh;P=y+cJmhhvmd(Ic|^E5*ZX=C&tALc&B46EGZ@nO<40+V)C;~gn@Pim^(qen=? zd)~@(=kOpWWYaM?G1@-f`D}A-@ZK3dA6pF5uy}ZysHY7vDC(cpjE+aX;fqCE&cLa- zez|4_h%0irPbE;2(cv5P?pnxKLG0haRwHH7PbZ!2P$YNSb&I*l+5cn`PV;=IEL5(F zmHS@zo8t)@d|}dX+wg-iASOGv+|i!*9$NtZuf^whf=piNs_Fs*N`eK?is6gC34zeX zt!n>5gC);^a+exBT*2z6%c3q)ENFJl&|yAFR8NQmYP#+qG*xMI^Vmpn85+Yg!T;0+ zHRl7>pN6~^_{cXy(DJG^%L#y>Tsn^wdVt4#CRfM1VIC6$qB~WdRm70I1v1+f1j@M| z!W$^DG5`SY`x}Z9KC98k+{~a}C4^?cR>YdbwO5j0ds6%qtHNf>H(Wk9uDvnO1BPaZ zQQ`|aBPT~1t9iVWK|*y(2*v_Th`AfOZrwR8W5%A3E@@I81!F7%z^Y~FdkVQzQ6W-J z4E%!;K7>0_I*r51t{&$k;lhzgdcbDgDZ4jPT+#f@qi&a`z|^@WQnc2}3+j!|F_G_{3aCd2}bDTLDC_YQ1z> zXv9~XJ z)B?1vxm1l{3@KU8P{7e-EkR{_wV_l^I;eCfp zRH_2LInQ#_JKA?0C-<%1S^rINL!-x&6jG0+G{*`e{W1g-k*bp@CY!Xewouf{FG&;Gqv0Za7Z+eG zc;Q6C-{R@NHi3atZwZPPGR_xF!$gs|CX`edI(7uyID8%sUWq2>@0j5 z{ujkLviz5RGZ+Hq=o$qI^5dL9Zu6{A8J@&?Em!edKI|3@&=fm2@HI%5zj@3i8ZVO< zA_(FkZ}M!hS2!?V%hSLEIG$kdp~wrm(dhDOGj*JSWJYS^ei6g5|BNM^nC~Po8bkR7 zyxlnKYk(O542Oy5J(ObhDo_5x+D=F|hb*Kbh+i?<3WsF612>GJ(ljM1Y)r&#NY12jo5iikIg=KdOI1wmAnes7%^0 z%VnscC4tww<^Xq7URaRL;@K!lISKYmG!EiM74KvuIRRFM=3GYzbjK4`KrBKON6G2( z##1?tMbi+ZFjork1@VyaZ;+wJpsJq6VudC|fzhgziQeHJ9K6kEOJDTJ++ zO$j^PpugE&T#yJqV_CS?PbLbog!Tm*_zjT&`>yGkYzS&)nCv+~lo3fv#4c{98;s$B zf(~detTW?MIDC(7@3Xi?R);Q$k}jPEfEJM8Nug0v>WZfop$36L`nsA?{wk-+C+ad6 zRvK|R4^B8&E(vFZX;esrqhNNv?$Sf+lBJ0wk z3YIF&;kc*U@HyV6g>vC~33{V?;z1dv(AfnjSOOpPl=h&utVhM-x-2HnWTIO(N@)lw zr|Q#T>Y$&CMX+v00ZMgVtte$_GJRIS0fkacf<*jsB4L|$s9#P2oG!fI|W%1xR-u7WQgu*ry;KR@%O& zR9XoT8@Rba5oMGaLTSdo3q7WwS+dx&fF zQ{(#H4RhjZhD&vs?wXm;W2k{)k>Cl~eOs5_KD{xXLUXm{l@VHniGiN)kax3&Bfj}8 zjhH$mWW~0!g_Q}T!UFQ9UEz(oy)WD*zWWdJPc_T(wvV}@ zd;9Ak^Tr9g?!YBPYp9OOiXO|uNubxb?nb%L9T`1XA#0>D2$d6DzHf_+fP+u4cBJBD z;Jb2N{a&oEZK^p`m#lZ;;tTW)YHG7HyC+j5axR$}t_DlNgk8Qvwd3k3N>ST zzN+ozHV+BbmX+e;?6bhN)^N>0gxI}-5b((YpQ9=LHm3BcWh}rc9=7rdM^x~#NO&hK zorMb#?wd?+_#U8`cyLXPx5HjEugKdGH{Ui#{$m+TjGd)m`O0{;hsaYMTe}$MH>xNn z68NA*rO}08u_;pL9K>yPyt_0n5!pEn`eaK;0}$N?oT;(Qb4o_zoKrrZdazi|T>RUa zw@8nM2}bDp+eEtw(&K7wP8`#G))WUq1#7K!a9@3C=-73^9Tr|%x{2t6}h~Q((vS_TyHKe$h3_7*n)SQWWM3=@4(3=EJMO|+LB;99>Ha8 zX%`mjmxiG9S%s02bpiboC^M+?GNgU=AMJy;z69dzXgQg;dmjyq%YuL+z#wJIL4b~7 ze#9+7l)O_NVkQB~*D)Z;698Uw0k2%E5h>ogPObhW^cl|w^pjXe!S=EA`UKwMzwIS5 znlmEpoTj9~LkVlh)BnvRemxQmb|`W2!J3gQ7T%>z>(q}`%lg`U&DDcuiOL>oHqv6Q zX+aAKsy;B5bHpGMl9b4Q{)tf%UZaULo=>@{%E+*XB2nn-z=_?D+hCuGnjksjNdahg zR*KdUrNz>g-I;ZH`DiQZ%s&rrMqa4|r_f>1?6@gKkSEaaRO_qr-4?|#u0LYSMik6v zfayR;pnc1A2(K@ZMAPS-it{h8`e7_GTyGOud`^87g4q!?GoSD=D;%Evr9L*m$e{yr z`WyVX-yskVuO>ik@1&Of%z)Y>{&zQ}#%m+V2jJJY2>lgBTe_1+#+#Sdxy2xxH8oqt z%@huEz=mv=`9fTEe`)`%Y-%!I$cQnH z*6ranX*%5;i<@EDaWIjN`q`4}1Ps(Eb?UlN%7rT#!K@i5yGc%cvk^bh7Oyn8>vO`j zo2=-&%=#zHEXfKVMqn(QyMb}MZqgCAsOEb(0f$;-=ER!OCJf_EwG=+g!gqjyIwMNV z?PW3wxG7>#J|nM-R#>HVJ#*D2RX53o&gbN_cBpjY@JYssTzLWKYF|~qC9cVEDma32 z?p$TJw@%d9?XPtP%NXOT?E`AmmGW#hhjv=~JZ-RcPO+qjRQF?bZ86KH*(4h&Z!$^E z*vUs_R+y1z^*48fp^vI3@}z;@F8_MvR;<2!xbd?L3B|7b-&rqeE<91vhxZH;{PdWf z8G?F&&57)jqA!ClbWICbDoYNqi;Np$FhY*8#{D)qjdNaM+99qlqN$WCWaX6N0E&uHj6n^El^x zCj@fN&~_R0&|PlaaD*IwSU#jN#F>KF%L%J-1_p_(&(VqU#P?WD`R^KZ#{|{5c*d%t z5*m}MM6P5I4A4>W4Kt3lubZFODCvii^o?i2lJrp~7_$tNSUFD(f%p^=6PVb*u7S}M z9QsOAX9*@qgb$liHL*Nl9Oe%;I0j3p%q|? zGtlo`_BmOP2F#$5i1}Gc#=2Tiv5wQ6N2y!!yDP*t!a>1K=_b8)S$B|-RHjL=x#jv! zM5Tu^yLw3-x61WP__kK`C2z*mu1!cgkmP@RGFfFSf+nstH>3q)W|i>D6yRYK^$|#% z3eR9{Rr1LgU#{Q3#fFc%F16Tk|K@C>WGcjF=~om;kSY1JR{G2@dBq};SASR;&>y(t z4991~0($B@8LX^~n9In|eFk@h%qGPM03{!IEW!c^*^%?UX}us>BA9wZBE7I$gOuMI z{v)>$NctHzw%e+dn11j;lSTPee}0zv&ue@o7#f_H)$xVC65ktaq+DHZ%Yse4S8 zjoqy{%NvZqZ)71W-*o;Dy(Y*=BLt&YX+#HqCI840X;G%)fkta#XzUKNIP;N*P;U47 z5E?z_#1|)mVsr%vRf@0XVsoz5rR$P{so{b;wAHv??hdfGnlETC{^*|?Z_n?vs^271 zZR=yyUc@+8Lslf+d^`t?b@UZ)hvn6yZPj7?j5+s;j(G0z2+Uk%d+VgbzOa(TsA6 z1oz`0UMU3KGSa$`6wDEBFS#S=GCfFdKs+JJ;w=R{r0uFvRBaNr`)Q;El@LD$>qg!R z5D-VLf$k42F~3uxPcn(JPQw!a_ttN1_xr%9QgB|OU~;PHI=EyfFtbdpV`!>6nEIc7 zG3>=PM>u(FNde>I;9?D&@{xid7hLW-4`RVsG?Wz(JzTA36PrSZGpCGYNgyxO%iulC;iw6O)F;ma!}KG66xie% zpkPC>P8SN&<;8-n2!37$F+C?F4ohJan~4eqwXgG6&>iqatru?fL-p|R!O1PjSp`0*_ov1 z#zLo2k%QiQGcKW}(v0CFm);rEq4c%Qfe>mXhW#S8qa!LZD#ABHi_A4)wX+sT@M0UVw4YIRMHqwzWHCqA|@^2!PkC(QQ zS~ZuXP3);{sedU*tKc!OqI^eQLUcel%!&bWtQ-Yh@;ZbdjJ+;BwrEKHf))zbKnrS1 zhq`*?i{J&-rUxZcUaWEN=SpMpdSDZIjS(Amg!hn^~o4u28; z+LEG=me6TnQbka$WgQbkQ1WaqaAqFN?s{!w%OF!iRX=V0>s)!3_FI^1#w-X7j7eY=?F-M9}9WSp#_{wh( zd$pA+;bOIRhCc$Fq9@Drx3$%i|By72z4aUj$AveEx_H*Yb!E+q7mk`|jX9WN?wXgZ zg9W>xx?U+(agmGf=705RA>KwxbSPzsxCf$Bk(~&ZujKvD3d@ugVJRqa=(`>+1H-cK zDWU0#At0ac%1OGjWYE#Y4XB-@Kxz^Z(9~+O6(WlRR9%SNqkoPTnU;hm!D>2xwdWXP zNd80!di4y(vC1^>n#4`K96R8uI4b%6)qnqHW(C@U)kkUQh2B@XmSMiQ z-~vTn(5kZq2Y9G2xA!7Edv>QgmH3tw?XSDhGhcEdSH(mA{?ZfUcHz(Cx)|vqpg6QM zRS2sWB@#k0!(*avSRUc$D>+dB+&fdU2e4{(R7As-#(o%>YT(O71clpKRr?zcF?`fo zn*wDktgr0Fu16$oMqWUar%GtR^jS(D0(I43LH-AjXm5Jb#PQ&ys{Tr?Fj;a}=cwFt zqm8o}IHQ(rl?V4+e+ue`stc3)tf7rCJULbIwQR)fMox1Vag(38hS%P3`oDk#!sh_B zzzXhv0SVUs9Y{=`3gYF)@9qMD=UOd-Pc9m9I}d=!84|HNdaKAEZS4US>)+mP$N?VU zJ!yRGZK`A^mub;$Is;U0aS+vj^Zgz`>z=3m6Ajo+n3oQ`_($D3wx}Xhtrwuc1?)N7 zy)A&D(}LWA>d8Vp#$}DIikwFE)3~ilEM}+SkZqRR%8OI^emi&a9dY&+8|IqhGI?qG z`ZDoV8)?%}-S7Mikpu3MiA{meF@BG95ag$VW0JaeP3P6q(3#(D{{4EH0bO9k6Rtm0^Wcdc0Di{-3(ErTX zbhSqEG(jWbj%jT~|8``Efr{l+2md<>2a4vA?YwlH};* zmTvyznu#Cefrtz4^pEn&l<>062`{@P_VHwxKUvB#mBSLeM-fDf65W~H^dn8dSJ8gC zK73KRdS{UoIYLj2cEW-Jr;xeTVq0%n-v|^jCwmMq*YN5Tfp+ygZJ0k;f^LGmRCt&W zk?K-EWF7j(ozB z_`4q#qoiGD>nXw;MU#%}?=Zi^)2h@HdOOGMSH{%gD4DU}<~=qhEVhlO3(F0wl%6bX zMV1?9aF}-9-FOlh$zeDHOz_DG&8y!piTN-gyIr*u7-w9UZ=MClOU$jB zw;oBcgl-TDU&#--9{{$aT*Q^NbxewS zu)p5Btbj7)ZY2Q-ZuYsetB#i@hWWQMqoI_vlp7aSOzn(3gv;7u%8Ep6Zi0195ZoY% z8%axv&B;7oZ#y-;Ow#H)q3UoxQzXSorzgQ8+rO~de(Hz$`C&J_SsLOvw73ajkm*7` zgaZWz4p5}1!pY`UuCXeBS*2DaUc!;c*q8|;zSZ+K2`Y$e>+oz zYVye<&A4v9B3r+@s4%&C6;(lgt!^?M8A_1((A#90{1FEbjawa1DUSV`Sn=L4v4EO2f3*^KPabRi=#Z! zew(BD+JvnrQ5MmhH;`*~3w1Fdzm2S`#YnoheL7InsCp3`7szma3q>4IMQPKP|_MEc922xFQM7PIJ3|!GiE4vfyyJahw!1{ zOZ9TJyKMOzH;4=Kt2k~nk!{QVd|(M3bBSsgZ)$^r{(-|2|EoH=_&m}!sR|K_CX;+7 zm(*?zMd=dFg-M~nAyvx?r~6|6_xAiDhjU1UaYiOk)yLd#ri4*UUgttlL)TJdY~)w{ldKlj`%w&|y24!}C!C){I(-}rpE~b-8DH#pgxE#< zL8HWuUWD16(C=s^U9D*SP>%q~YiS7DF1d)}g=^nB`XG9_LiSWvYai&dL7 zWtGzZd6aIqX+XPCX>&2u4;xHru);e`*5ygzxo$qKt{{`n4(suk7`VSFN;^Pd5qZ7AwVGmPiC%&t7c2F!39j`~8u z&8bahPqfcXE4^MN13HQyjU~t;9LF_;zE z3*=N3SiN@@>A^Kp22@^0%Xa99dSM#q9qeb4N@SoqzEMfNiEfbEe7a@A-ti9KcNU`> zyFJG2#N;DEM+O`s&Oyr}F+K{E2BKLd%`K_oyFZkRyu6ax0~LdPAh~!(!;Aarq9~D1 z=Y(6x=i0)fcoVhZ4zgKstHIuPg5v2ED^hZA6y&thT3&;(Tz;0J4h_#5|CS35`t zyc4d}bkckk$oe3sSBe;D><*U!1ss%ua2_TkzNfXSf*2ZyM<7P(zO{yHozN-MCyD$k zh^Z@KK#VOC{zNfzIS;Z$~`wn7(b7Qi?(v6TzY@sOgGlmLe zLtugz%GvzOYzmCvJP$gfawCJBQ~icni4aa?4+H=f$|rT z=p^7{Q&05T*&E(Q$>}+!{R*425t*FJ&2v{$I1hJJ)fE&^8d8pCdu|jBlO6yC5i=3y zCUW6P(K8>|)Zp$NCI{#l(W8P7d81m&cVLX^b^4yHN&g&{qw3AOz>@Rx zdai!jbC$EK=_`kcpez&SZ8(a46&**k<2TsN(3$l1Tp~%v9zRb7SdyIvNSLwGmF?S8 z5p$W#x%+nXgENrP#*@OW;_lM>W#GA)EB?oG%Lj2bl(==3LhHMX;sO{WxK-|xZyd5) z4xNpHK+jl@0w6mI=LTd@A)#0SY%H$sV4=AeO0i56kh5(Ph{-hLP29?|^a&5FC_bO+Ah-%UsM z=xWHUKKgaSlL*1W7-^8el2b&b1MqHdxYj1($U2xoe;vFMaw*?OYYv zZh|`jdFF+jVoET?V=WM``Jf9BTa{7@A?Z&>+F)og?c*vp3~*^9>s@M0;%M4!yZ~;E z8Zh&v2E;kSRrM&?E!^b!DT)6QUx0UusML`AwD0vdecIJmC}WkyP7c#i!NN$aBmw25K#t3^M-D8*(&Vi{o{|m{k zDcZDW&zfX1?(pvX2x3f%Faa~Poym;>-LpRyXX|&d?HXSYRqM*RE=%oif0F_wq-4=6 z?|y%6m5X`BRsk467Z)fK#HG9^N=pUrh+BzzFrZbf)D9fe_xc(wgLEYh$UEhe3|R`{ z2w+*XZ;$vrxt<<~5RpaxH%h-%Vr0GrDNT*iqHemstnENkFO@FN@nvxX-H5omJ z(ad6laJo3w@?QqLMwZv@lMShYPfbuAtpbo1CMBbPXoI2!dkAKKU=<+t3Zm}+01;vl)m#LZYZvIf5{1v0Ud+D|kJ@#rrhbvj;Df|6Dz zz8G3**TNkVXqv&6VtGn0wqa#h4gTg+U3g6+DD2uD#}CGU=H%oA>*br5Um&FIm%LSJ zQ*ix`=2Yh6G(Dt_Z(M_b__*9)0(+}FmbL~0kVGgNcf>W(KgUALHXdB2ftep>ke!c3 zhPKR>I1`{$RY#GnAcVzcMLBR~51G7xp;50w=e@wLQNPYme$O1S;qEA31(uG%WXNDg zeW>BlO-|8?rE4h}cWG*hwa;ycQjACn+5!Ex<;oOJ7l7t>;TTT)u+~>a*GXypm7~y0 zJrX)7=rGjugE6q!p2+u{q`MAudje}H0^rELQu?uCz7+I?8!?9<9w6Exvn7LJq{2)y zhc`-wF_sRLCUDPm=H7OpoCnhzn+A6}Dh>P>c0ZsinF)M(TRMefWv#0pRvhS zl|^boYWAAxH9`IYkvZB#{ZQJOjNyHNL81ffJ7H(3n>THgtsc{c7Z%%;3%{BHz6Q@? z4gzE^NQV6oDra$sDg**Sa{1(ZP+;vIz<~C3*9j!w!UsbfsdXL*(s+msabnG>`OI^fmWhjdRSc`>ZnNU9tIiB(aN^@R-VEg< zvrW4Wj>L~h zUci9d6uesp71WXEN!=z!6vhhIcrWC+!;}g_!K!4uJ7GkmxD`)GF&&C{NP#NuL$At8 zUIKK|oveY=v78`cHvPWw^XNH}mfrfRtmrcAp9Afi`99X!qnbo+PsX(@bP6GXw_345 z)%sjsKt_lXX=;uS`yK&%2L8X|gUd=WQ*wVRYRv-glR&?b9-#gMNTkOTp_E(f-rl}8 zJLX)mLMSu3DW;dtusII)#@`{C!qJ5f)OfQ}Z@A?>19}Z=iFH6GKIggZp6r#vLD2%w zw*6l~0%?NtaL8}-zkmee{|+QREJD({9h%L<_#$;pG_*dz zD)G1}?3E=3SV!}oQ;*v%j47rh3jby2e}*>nNyk$R^Y=5ePPkcFg^5WatmY9nCENLD zn{J~S?Cxi|u{h8!!HpgBoa+VFO@-64!Cv5eGF}Q^VEyBEp_$_~ZSMX+?fiuS^{7ij zw`Y?eVmLZqzCI8Z_011J+Srm{2>lcO>zgQz%kiM z3Jj+9xgz@CJ8n!?6kD zzdL`YW6qx|#4(|RxvTV+zvEZF1|pf19iLX`=RNvj&z1jNZw9uDQPLa;L_f|%{?$_Y zpDcr(DYZ5znxTuLdq0nv;&oWmdxXCGMRk?-Hg?`En%tBx+^R{E34RIqNnh})T8;6& z2r&hUxgjyqx$%?z-pa>GNPzMLXibST&r4w;pg<}Qt|lR~z6(Wc7SchpKsxo$5zx(! z3j7X!I2;5uwg4@)|5?AC|N6t1KU6!;H9yQR7_!?)mG`dA&)jOulwk7$mzAcYJWKNf z2g>qC=%8lED|lIgHdxX z3#f3O(jRr{C}{=cdRe30NK2u|GL`*%RN^9gcr;c&3N^SdifldGhCJ{M+&v8$HEdK` zDcIhzpmF-E)ne7x|N9hK9J3xidxR zgW~zJFJljaWT8xYSP%VN_ir3mfstlgG% z^ccGJSEuZc$SeArpt*^`laKnxE3?~4*6VKtlDH(>^q^L$I|ixXajP+*G@qx0^i7j% zyH^^Hu_UJS0#`MDNO1&>DOTc2iv~!@OXu18ZURc;D^iAZH2>G{q(1$~fqRKeVS$F( z^$+ue)v9^VzuaNJ z&GCQAnGr<;1S$kaE$NPCP*wYJoR(YqbDZ_8HleCj*m{Jm3n`^fB6HOB(^qjM0DH`0 zTwUoeQU~%ja&TG+wa9rxd_zfXi8Ku&_hji$1&)K1>yKHE(G&2V*~{!QkaosHS>DX? zGVt2Mn~Vtx!7ezYayz4*xk{#A88@+ZP(zj1Kgd|{h3~z|Y z3fj^g_NFq8O1d6so2g!rlXL$RiJ`Y|{Hl24RG^%>(U{AijOfYdk+9OFEz7_zK!Q7& zt5kZSn2(BwRFLPB#4VLVrkRiR1}f0b3@3U9ElQ(=yG!qyEL7IK;zi@5I*su<%yI{8p^ z*@s>y-+XeYFp-E|RR||fWlUlz&Mzx}IHk`x(esO6Qt+&N+gM|4^sL+{a7)JdL?ymy z7kY^9GO#1 zaN1);{^Rj9zF(T^kpFf%RaRm0gBz8y9=^b$l*Ve8)BL@1&tY~V(U#hv4NBqjzb9GR zT@|WA;3~Js(BSgT^}S#Gx-cydWBcvWwt#4v87mN5whpr7y6h|1zA?i?f1Y&ED~kfz ziBx7K_nZ$5-uH<6F-ha(Mx$tsen2NdlWgEghG4CEW&*AAuBS5BwohW``_`QbWPBsl zWDd-iA=8NOVECTKw!d$jEgikjZDT>)mIGzCVu?IR>kG_lUD*I1+kPn9Cay` zIsNsg$Efb(=a!SHF~*61s-w?N0*rf}vs(;EhA=)K!><`}-B$p=G?z)}gp&KRxjM@) zFeL?Ur%9X!fgb$rCtoV2u(HEAF}O;S($UGCfzBI6&E+7-skxz?RN|vdvjp!dZ4eH) zui=G139Xaos3ElMyfq}I)Ci(|KAB75-=C~-ty zXXB}uShe-s=FaUN{mj8p^+EjmctGRrx8CwmS`nL7nKmG z`+8Pg+{!4W?$k!mXQUrtKuYKJF0K4{tb3I$cq~PvwUp6_IcKXL zRER=KGg?U|eua92X+Z&>kW&|fMOB4QR?##>#53iB@C_SN7SBky%7X}M11P6#jgs#b zA*Yqf@?%7hl!Fen(D^dk^*u4huwynvuP_b4fUVF&Fjh?Slq)J}_HYTsP&>oz&V=+! zTe@T#^>jfS&RqCYyuV*{(`rS+(DZT0Y-I(+-T4(l!Z1sPUN=F+9rFb2&F}R$C=5;C zNQ4NuOSb0Zh?xF0DLe+J%0iE9G+*IR#pzY?-ewcTm|VE0puwBSmGy)VPIFfl3}x@m zHcIs?Ie_LQf(qbX_fR_PdHv$;&cACOqCCqmJr2C~VRCNjj`WPMs}(e~W2sMn2TLVn zkVdJTz`x{p-htVsAY}^6xq%1{z1F?k%^cB?-)O=tO+O`zO_vi1OY%zt?Dt;8G$7w6`r|aw-m;xvRCEb zylAq36fqp=q1aJu^0%m8jwQmIT(P+Zb+2xt3cVD9`#cNTEEcxRXDp$Y&0Q5NJU?bZ zI_c2_SQ5|bT%in;W1H!1TDhDXxy|o@Hz@EFp%--v zP2^qie6{`GEC{t*@Ralc`7owZuyDc@l%{fOW=L-!AIy|8L@%pibrJ^`to{N20_)S& ztr=*DCc#JpcANbb1IrAzkY27-yI>FhK&6NrauF_kGmNS*Y_-_q^VA_f=GM}HPE2`UidF*0yeikB)U{zn@Qgr|A4sh#RJR|5?=HEe2}HMi zrf8`pXy|YrzSB$}MTg*}hTcZ9{PaV)5!H_|`WJ{mTitQy9O19n!w~JZkGHrbC|TIp zFj$U3;OqUgV^$WKw1QrQg;|I__5jX`xm(Pdmt>0!EWT}83&PBDde%AXHBs|Q$0J+E)L+IGZgEx`;rX+MQXyPsOVfn>?B@bF$gm#baZ+77V#sQ%%4J@mhnsjk=PoXHyEAYwdQ?4S*2oXu* zcjFBXXImM6DP{TBLPUHQiVW$Bvk#RykTS?v9k=F-COgU1Kunj>Na)F``1wjhXpyq$ zZ#QVdDHY+f=k1tCzJu-Xw9kul+%inB@R3KVvq=5rY{@G2*>6F8f5QG9385@-=@VLcJ8hYRg= zY7ZYp)L%x822x$2ka%eYWb<&SZTRkG9pj*=hx?#e#g@Rz9ULv4H)r{kaRVkR0txVmWgiTic4mY~Hj02-iLx$@4gY#4Vips;IgpqdM8ZPQ>OezZeB88 z(kUfNqZ}19@irU+Ie3yxnkI4kZ|3PmetH;R%{T}10*KPmbWOH!PQsBE%yFgkSsz_F zd;sy&k?&2L#|G}cXYG1&)GS7llzz45{)wmxo*w4o1`vr>b5E3VGCEFQxYHW;&jh8X z!BBBQChx`tSMA0ZzEDE*M8z~Iwn`4DmViJm=G(<;OTPB{tBw&CGw0s!xtxDHfcl;z zb}qDTw1zSUSViGg69waLhcCn%&*aSUtZTib+701sO0p;u$TMD~JbrvE>igy?Cp-uxhb%o)E(;gygGen(HFYQmdfQG0k;B8V-Y4lV&2Z~M{zNqSj zK7P?ryjVS=th-rln_C)hDfeHFF}W)h+I#g0xJ#(ljrRJ{8u?M(zvv|s@OsPLA_B*%G8C#a8v6@3th z$~5B@@c#=-ET~h}8nwX;&)WKmu4_dW%!Sw`x^6In&nT0OC!(Ep%VpEmfB#stFBTD< zmxZi@gCv#l(OzTgQm-aj**M~%{!dr}Bds+@j3)EHu*84p+mPBu1SRi_dt^RNq>6ol zm|T8xoIJR&{*Dq?v_{W)r(k-b320v+lW~H)=rOeIv3d=hA}0p1;WmgR;q)W&d=JT= zC|{O$q{_wqL6|!w*k#2@DU}m5JtyNToqqT!8W`1db!OPJB6iEl6-eeu>!VT*L3*H8 z$O-ReG<+-jn8WaW{JPIJ?LcZF67xvHK(Z0@Ie|!j$wJ%Bt~L`dE2cdyeL0UTRU@6^ z??R}E*v!IHg7+Pmb(+N3WP7E%-%3mKSNyI@WICV%i`o43?=c=tcPSs_4wuEld!{8# z9#*?HF6SOw$Jzb1;Cl+m#n^0uhfjDv<7XH$0s{27`W4oJw2l-95MaaA%*LNj@Fks4 za~{!=)_WUCpIPup_AsBEk)`WhGXsByhr`)yz%av4U9os>! zq?m*+S(ynJ0GeG5z;|!~0VP~=P-k~2?0JaFs`U>G?JWDC0|45S#$?O~d#%tB(E=fe z{TR4Wjci{f=sU5TMkJJgV=Fjyr~3Us^%r6_#BU7)YWByNX-wbg`7Q%A8pJ zuH;f++fSNWR^jOk>6Q-ukRQ4ewJwbpN4KmHB|A_8bUEjb6qW&s-#UzMBp_>OK~QdQ z^Cu4R%e#Of?5@KLxQe`?89P;4fNu4BCtK?>#opkvRbTpZvS#4x)5ov14$Mvvi=Mj@ zwChFp8?NvNsg(j^(of6pSq-g|syAUg-AQ3_{;4xwD!<3{N469@MrVpq>!!EVVq|4U zKH@6*ODN~V<(R1dZkxb%R2l>VI3zpk2w-t`XJpU2v2k{ftlcX1xZ^=yn2!C1|E^SX z%0OjHKQ=U2Gl=wv>z(?>q}d&{EikVJQS;$MmN0LC0s$-5f7>Fh&x5Ca#3E0vH?$Vg zyS>+3RA*iKk&Z#PJuYj*38?|cx#3nH7A}_)KrG{f-H^ewZK3=r9Y2GaD88TS#W#W( z-~7*w5N2e`w8t$=Hg+9&4e=y#ibVXza34N2= z8nVC&;Cf6%zxy`!yhiC}mu(<_H7BK4S8~hEzg4F_b@fW_jb=pNe~KzWC^a=!5tiBt zLbFcTa*-FEnM|O6{ZO|mqeL^AGeY~WwIwYS-~BcfoR=E0Di9_NI z_Dd;AmgffN9JyKA+;FRsdD$70Tw*Rf8CADv<0Oxs$n(-Ien)}+DA&E?uj3##gwHy7 z!WCtMRI4)DUXT3sk{5SSaznP%ZGM+K2wc#&PaV8uKgZATQ)7~UJ zH#eR=ATT(oQg?>+{9y0jakP^*D+FUfTF~$sy=YsNGb?7l8ycd1?q-PLy}N+q0^VeA zQF54O&g_Sm5wc~vv{W8fKJN@dSez6wl#NC(A=D>^M@DswVYr{_->LgQh3cQh(sL$% zBxHyuxUQpT+^$DDd`-E5vt8sXHqJ>p2nzhr_7}M{?ql5Nt5nJwp!FJaNb!#8YhDZb z*6??oJ*N?)1{zlf>X7j~d|O|QmEjqLzkfMZvNxAeOV}*8?F#*Ym16^34*ku#OLIsi zCtM|pVI>XfYP?9#6yghHZKYv_50zd!W(htl(HhYWr(h|?oT+GKJ389#RNs$g-0;GX zY^?^u0#*ebP31HXfGNDk)*Bl|k2Zgb^5)asGogUAw~WI59>M*yc|_*UnVV+TE;KELjEjlHp81Dr#=ycvjI_JUmp^K3yxkqurg3G z-!$bpFJdcw9`7X67-yOkUz51u=rBLjmM>8rN1eHIHz8fT3UKpS z=-tZ|$l&T8-X8j6fJV}($pPa}hqqG7%txE=lv+j3s^VCDDY;*5VC^x&Z}lH^?)L3# zK!czfmo{x|dX~iPOm-F#AG;TLdN=}9t@VER*`za0mut2IbRpFtNYRjBF`$S&9dv=2l<1pky=o2KwPRh4|6{A7hpVz+SmBb?1s=vMKmKPV!}@I+Ucder5f zhX{{{)pJhapUFV1nz>dV+<=M14d>pM4cINWzHbB0Ek-@8!mRhIIx&|Vugn;|WQ2WnD>hlfk*zd2t=P@_S~ zOK}P}pGE5sX=c&eklFZIjDX3FyV)hohNFG7a5aU~DW;{U{!bj?fNf(u3gPEd+gp;B z!Kxn@UW_T8onlNS6DqaA;7?)Au3PV$?U1Chp_%M&bP<7h9$9`q<*}9^q8g>zAO^`2 zhbWUwuOX(ay|$n+TPw*@21e%FB>BKTy;ocMoN`Jrm+k;-Uo^V-E5JxNa0CoF3X}~Z z$39eB{v7Ohsgekux#X8+3mk!KbGqs89!e}8CnS1a^?ye)+7SLUbeKhJ)7WCuPd@Z} zDd#gvCE`h?-SQ!bGtof|KGvsnGGaS?8Il^@I;DaVYFKl<^AmIGm}wLkTFO3PlT=m- zv@c`8rQ;v>w+ zr{jUj>*ggT#j;%&{88S%4wj`73|8MV4Mq2k;N3cW`4io~v0ds*EQlob2+BBjQa5se zyhg21v_oo29%Nl~mB`jN^l1XQfn^nWBHoHr6hx~48l?lhmx+xj+YO>(<7n{F&iglS zH>@a%6g3hzp_(tlcYDu^)Y)Q9R#MQ(pH*_O)X>Xm{qKnLGmJMIP&DL#*|{3 zJfw)ByxV2#pG^Vfe0?d?Ke;$RDTl4gxCKQDq-l1Y?T$7Cr`;H6JqMttxMsVG{Lpr3 zqAXX0gcj6XG_lS)3`?t0`aMURRCoVQPfy)TKdK{15f2ELmaYoNG4HD{rOpKJ^|hgK zm~X<5g-qfldcugt!)3z{_tz^(I$+F^@8T0ai`^w^e&cA7TI%t-wvfw!b=s1B4K%L- z=)XhI7oY)tA$h%O{0+gb@^;HgQXjESqk`3gD&<5a2{iZZj>8nk&*9G>3p_8H;AD_%9I549yl_8f~3!LyJ&d+b4dKMAKw{pKGx6k%Fn z1bX~%v25o;K_ZCO#dO=Stji3&P}--y=hbYsq7sCbMq0;ah@HrMZ`cA8S+p9LAi%XZ zOyOrUeJsbblB&(cw+(dS5|I*pC=t zNL}c7O6awv?#3&>V;CkOT;|FBZRVRNQ})e#)R`xa*5WKX#vqebdT1?quauL6&RUF8 z^K|2lkYbXXYev&tf8%54RzEY|s4=fs>qFSq5TDf;f)C9&RCZ@Xt928S@^1LuURt>l zE@+f#h{2W7`bWvvj}q!wc->UWZ_h2_4py(MG+eVP8dpG)zYsZV=?@ryG9R-H0q9Dd z+b;*jmIUV6zc4{LsQeJethnHn)vD=OFLh5PWVEE)8CE8z)-AvB)?h7a719!`3d)W_ zWo{LM<364Nj&=qjoWJ8r6<3XyS=mWjY8cd1OWBptOh4f@YItKpYigq{Df=gESDFeb z=(y$!g*!L4Jez`Wvd_>6k{rMLMFiBH5g6T*6XMOn)bba*ncM!;CZ4*i)e=jyjuZll zRO;n~s-Nk}v%`bzhM(LkQoJ}`$m$$=@?wzq4GnTY>dd~ZT#+qL06vj3(#W75Hm&Em z6t>lC0aqNeXpxxkr*%t`1PP34CNHXgO({@vE=7^UvjLCMe$__uu;dU9$ISXZikr zxXT%PInG8{=NxEt@!TkUlsgg5Zl#1=dAI}Hwt%U;jK%t{lolRLJ$1M*KojrC8KAYIzuP!uk$qDMcf}o z?F4tK%?>3nWN*;Nj3N#!BsY~E8|5OE>#*V)8u|Z(Be0Aal}8uV{tHL^huDUTdLqbS z9wGFS-e#rc&}CFxNn2TSi(q@6ATS|z9Bsfl10uw?6220V_vbq>`?$8;oy?V`wK3CK zzALruJ>=V;AfCgoto;Tw{a_d$4u`x-r`rRh#E`Awewq@{~WwATlk*FH~@8V3u zEYx{E#{w=>N3AuB=v9*5Kg~%7djmlWcZ?3{59{9is@MtXab6+YpIYxm;Oc}~Ym7Zy zV|OM1c*6%m6f+>8mOt67Xp7dH)9YSIH>AtJc}$McTy<*vAHA;W!ccGa?-2w?lcfDm zhr6Det-{P8GN*x8@LV6uu8+?j%$>5CK!AZ(M6lHE$IsUdP;Q2m!NEL?9SkKffNi7AY+@Q(V&=`SY| z1N?NbzxZ@|2{;EJXb1F*Fmra_dbE&jv}8W;Gy-+1+3;w2vZt(x+5i0l7hp8{6+|ii z9amrh&719Ve9)2$++=peiO1>~MV?EuEkCOhMKnd2YX<6dR}eN=FLAi01`MJ*3XJ49 zJZh4mMjkjRZnMWs$z*&NcF>~w4yGgTSJU#dI)=cyWPPS4Uv^OmoS~ooGO?V$poACe^_xY zFc@78VI3G-=j>=<$3^fYe88tdf*A}l%jD(@x2af_Y7I*1eP@xEls13>>Il_lzhJf5 z<1&`4#Va7E#2}$9-Q+5ErI(3b!Ll&kM}j1CJ2<5R-_>NQG>%Q(VQ=~vJ`B(E3ynG@ z!YgFZcX`SRFHN{_>f>ae1q*>s0%bM`!J$5zOi2`Fu2-|=Gs+uvsN_mQfnTe}0Cee$ z8_rk=$Lcv>7J_@k?Qa-_k8jVYljxa80a%iY11=6pXGN8d0dljtO@#%nB4iV6??JeK zZBT1l{-D9A$uG$#RFkB(g@=yc))E=A4O%WZR(G8h%dm8KzF!1arlDwz3S^HIl`S}}JM{S=O2c4@;^e$! zQGDt4N-rP<6eB-~cbg`9wjMl}h#sjk!Z@ZZL`s|6sU8;*aQjRS#FmK(8ycyX~N@SP$TK56S%I{FH*uWjb0jX^;Rs0j4UoZLL4;0aSdmK zpRVOPCLKf4()J86LO)1^rXKtp`VpA=3*3_((DpeeR zh+}NNsr)e6wh2X;O5<&L+(ofl4QL$c;te~G?1iJ6aglguC|_FYPV8d!a8nv@kQLFwZk%nxahqpjv zEzZI~LUi0CMkfB}42cZ;aYGZ@Dd|j}`AVmr3MxfrOejuYS)iPxt@b86i8xT4!{aPg z-`3uaS3bbmJet`83XY#yIj6v#aKbw!F8&29khB-8uHnUcncYjvdvOUq{|%4&=S-n- z8ZFU3K+aHNI8C{vpyoX@y*cILL7N0Ajz65{;;7X8Qa%?SdP?vG`(MtPp)?N75(99H zEC{%O#Mjf}2u6nsb{uoWT7&nFHcaBXVp|!&Wc5=s`F)8y&C&Qesa$8$-v_w2+=wc7 zv&q_UhxJ?=IxrX0CJUHEgG5e zx6%+oeyB|<2Nc+t;n*2kR#9i?120N>XB+to@8B&~M{I?Og#5sQq=oapoGHZ3uJK`9ZJTUy1F#Lz zFGc-B4L;kfn(h?|oy&8kq2?s#*rf5KY@CPkM%FgkO~V9TF<*kta?r%(JVh!hN; z3WdE!Mv5Cex2V*xS%i5{@A*TAEI?n!STvP&$|I{C2~AvMB^q&vG{*{$uNdEP85D65 zQzt5Z6pgp(#Ns+Jq;Ih|ueSN?hoc|MPFf5<6Dtg)j)r9K0r^vxtq#P2itf)oMi5gg z9Q~m0&;APY4ObRbD6Qhr!^5vkYq16n*tCX4E6b=DIzCBcr`-+GKHGLVTy^uG`$C{X zkUa%X*7EC&VNJ^1y=Pg#ItWbaN>nL<#RBFj18ZcI*7bq4xq3I}%`GIN!vq(rS9gsF zWmMXD5#jSb{27gAMghcD!V-x*^Xh6S597z%8TxSpG0o97j6&IC%>Pt|^m=y(8Ypnk+TdNV^xE{5u7#1uA8HvMX1 z@Hi-;wpsPl+NR!7_^*xdQFoZrISkw;!Xgc+-i-;w+Ui^Ufh4QZ!qj%cvT40n@4;`Z|BeAVxkz7#5FGrF$*uk{ykMLHVS z-K6|XeDxP;)^K`qKkc!h141U8znbE+XD*2pzc!1+G48OuaMF@}cqD0%k=264C6sP+ z#dz@p$m)^`4S%5W$gL7!KNY*8&0#Zgledb=S7D>h1ML*&sg>N%cuIs=Hv}g0(zVLk z9=XQ!y!9CZqF9$%p;x$#g|-V#FZ<6KAzs}p1v&Ra?#&;&LR$w3Yxp0?f=v3#qrp_# zW(Z_jrJ4nyOyYW1yXFCV9pn|9Y!0s_3!TP82A^(H(sy1-nk{pr?DnL7S?W3bo8$g9pW_!QB#evYs`qImNC=|$r6l;vpzyO zOEq6@Mt$iRCx1l)D{wZUU)Uvai_MwX!FG!kM)l8QI~&tcof;5)^QKr*qc&cFtqzl8 z7CyrX@vLF&K{&IKdi9IfV^zG$gJ3r|KmBO1pJyn5@(X=uxZ$(CN#zTxyAbBo&pJ2r zf!0S4FPy5d70cIZ1jKOAAf8+ixUE@`S|Ts;(wXhz?Um#zcw5sk|8!wZ?Krr6$7-#M zFFSWDB~Z7WJsQpyGIGOBk4oE88e@kphRv%*d*RBZp~{5xs|O&5CEXYl@lZ<<%>|;w z?Qm=L8EX;@l?0?KDai{1V}y7ue?oNn*Cn9RPrh+yZ{R_dgmHe7Z90@sMLjS5O_J18 zm$ISC9-PjV6U!#P)D|0M`6;x*rA4od<4+ZesW$guWISBoi7DbIl3zs+7T%pQ$y49C zfiKZ*+|7)f^21446H0niS;y1Vz;r@>h8og4H83fKZg#Eh1d%Ch0aXoJ`n6nG#ye0` zR-|borXZu7v)TnYM~{!@*1C06Skj}^`@9iTUZqdeO4Qmm{%o)=`J!vK3aRrl63Y|1b50|nID%A-#x%64?x7>hkfRcXB) zp-r~Y5D0@`oCuVjDTl{*Mol=jHF{fFY}U>1X0CLe{-e*~dYzi5_1$L*im@MWgig@` zrM{m|V{DLP<1n7~e6Dnv`KxWSJx?je0?0Vhc*I`JeP9D3i;gvV-A$`oq4 zboOS1C8qnETj&S@@=f0BG~0&29|MNLL8<>O?hZmKF<1?5H=b;@%M}YwRwGa8SEu80 zH6J7*5ln?V8h*0KqN}`eWR+co7elTj{~etq2ws2asRZKnZ_C~E1^YE4%L#Gr)Khcf zw-^+c{!sax81o+;)HS6TDwl}^wo@j3_} z2hvhlHNl^10H~NbB2pU))&_m5M4?(0$~9?pDUcNvE5g_r7}iHyXu0e+)s*w1 z0ra>Ro9s;H+agEea}9ea*L@I6a^m$TD`LVqW1K{@K+|Jd_Ut*HlU)K)2KRZOTAALs zs<4*5?=tXj+mC|OZG2u-x;cBs{;u0C65VyBc^4rFG1@5r&M}dr(K{Tlz?>_XAw&9x zInxYTiA3@ob*)3a?OGC0XpiQwSDv;G!#kr9L?50JJg5%S*53+U9ybAk7{U2~u++D| zS0nqU(fl;^zD5+I+4hNisNN~vwP|C6md{T5d$-unMldpu#xFwE5kk=3fHR>ZY1AaJ~;PF&j1!MN6+P{OXo0C z6_q$4HNH7~oW)@AB8GGiS21o0bcV%Cw0*??#Uut`_O#p0W=gK|RY+a-hJK}&%}Z!X zXYFd`b$17B>6=OzD=5pmet5s()uJOUJ*-9f$g-{f;)pXDUwWU->lpq|Oah0o5?0a= z^}m<|)BiuY5mj@HNAqabzU@M&q+XZ@4PG>}LW-j~azV(a`{pn)!7?1_&w$x~K-p_B z5EdQG{blc%ye)4Wc%fBjMO?$>0t9Rs=T&E(>31mW`3EZhM$dPrSQ7^M7tPquT>)`^ z-KHS-(xXhAV0BkeD;u82gXZG?Q78lvUj|0(=KIQLB0vEIe3!AF-2IgiM^T;@@>y(c zS7GAkFkIhvxYjCV6yulYIq))68*wy&>+jL(Eb}a)0!h!5bh?Rw8$jaC_{A{uJ)SVo zmS6wUh-4<5f0Sd)0g*N2|CmQqcY_g;bW;;9ND(NqC+!SqNG!3Q4!4g}btzL*%15Y1|7)%@)~gX0lVY4n%!W04^b z)I$8ME$4@+oTFAY;{&mLN`m6Itq+!x&6Mpr! z0|KlAo)Fz{$SdXP1PAojEaYb6%7)2tk4OH!JqhZ26etFTxHs49`J)Lu-Gspe>bW_( zVp|lgOG^~d8q2v%``!Tom58wyR_B=+>V84FoE=L3OsQiD#$nB!L1a0kRE@$D|Mu;~ zL?X*g0{O3Dx_{~wLx_)|^V=;~y9U|e1hiWaf9ov1vr1l5<4C>kiz9p8x~H=T)v@Y> zcp(ThJtX)H<~>aGwnpd`E?9O8N zY;*jR%{zHRbqP-fttYgAx-m(=%a#&j5E~Md2@LLIPa@R1yTN(dDyNc|3m z9|6)=KtS3N*LP%jnTZCXtD3p`>uwKE;b06TO?;+>f`_sBLkc^>S=lO>Snv6ded?yOo?(FsK&Jpk}Tj-Li z1m&BjEFQ(m2UTJ)_it>C+OuiOZk zE6xu5-U|spz@X*_5meTU^H2+YD1OZoo=?wOkJ5lK246??DQLm&No>H|F{4zoQdA`jDf3C-Boqv zH{x)Zbc)0VY=UT>IQp-K70w@@i^M6IpD^Yn>UvOvGFv+*r#BD-&qukSxF=OV4qZdk zji0wJe-~NAG~A+?_gkT@7(6v7U}A(Dvx|_;YS|n$6pefC(5oL1vDEJ+Tswiw%)K{P zG??50#o9H`X-q{k4yB^$X*=mC{nv(l87^xG) zZe8)Fe2}01UOX%PwJ$`dfkRN*Wouo3H2h4|gSK9TpR+8k-*e6_$NG}u^KYg;L&l%#DJ(Z@L2;%hhF}Now#16s3I4(!Ph2={%tA#zad`Q(xS$RvE8PnP5YIxe zYnv_&TxW41dqfjJUCmk?!d>XxWLPrlo*7u}%={X4hPc$N5Kj=Tj%qvl$0~eGiNF3bKTYkk1faGZc|8 z(tE@8H}5wtQS|Gj$o;)ax1fIrczvYB6J2t6DBWYc#`>CU03+@M$$jxtW-Py zeqTLSB8VgCU7->n$GaA{=)%7hkL!{xEK%T1t)u?&a}c{uczLD-yjb1G4Y#kQ>12)R zrR4{QkSSH=JUms9>J#WT{J8o^GG9HZHqPDI&x*hWBfX;cM<1{l?|b-Xb+3PEjGg7X zz2bk6d%hBYxGT~~K0tU>s&&4@^Pr{}jYhJf!{HlSgX+;L8T~a*70q%hl`1X(pF609 zQp0g;kimH=w9<+RCSj}@nZ^OCp{M&mc*41S8uBkMOhAUQ!@~W_SywY>LcfruM)0ab zh5XW3mZ7r8YhF=p)88zg*Y;s~9QLQ%a$Ni77Y&CNbO*?⪅doW;=lsE-1HL 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 na}#GN|m%Ch@PY6(V~+p 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 1 { + return "", fmt.Errorf("config filename (%s) in data directory (%s) matched more than one filetype: %v", + configFilename, dataDirectory, configFileTypes) + } + + // if count == 0 then the fullpath will be set to "" and error will be nil + // if count == 1 then it fullpath will be correct + return fullPath, err +} + type daemonConfig struct { flags *pflag.FlagSet algodDataDir string @@ -146,17 +172,22 @@ func configureIndexerDataDir(indexerDataDir string) error { func loadIndexerConfig(indexerDataDir string, configFile string) error { var err error var resolvedConfigPath string - indexerConfigAutoLoadPath := filepath.Join(indexerDataDir, autoLoadIndexerConfigName) - indexerConfigFound := util.FileExists(indexerConfigAutoLoadPath) + potentialIndexerConfigPath, err := GetConfigFromDataDir(indexerDataDir, autoLoadIndexerConfigFileName, config.FileTypes[:]) + if err != nil { + logger.Error(err) + return err + } + indexerConfigFound := potentialIndexerConfigPath != "" + if indexerConfigFound { //autoload if configFile != "" { err = fmt.Errorf("indexer configuration was found in data directory (%s) as well as supplied via command line. Only provide one", - indexerConfigAutoLoadPath) + potentialIndexerConfigPath) logger.Error(err) return err } - resolvedConfigPath = indexerConfigAutoLoadPath + resolvedConfigPath = potentialIndexerConfigPath } else if configFile != "" { // user specified resolvedConfigPath = configFile @@ -188,17 +219,21 @@ func loadIndexerParamConfig(cfg *daemonConfig) error { logger.WithError(err).Errorf("API Parameter Error: %v", err) return err } - autoloadParamConfigPath := filepath.Join(cfg.indexerDataDir, autoLoadParameterConfigName) - paramConfigFound := util.FileExists(autoloadParamConfigPath) + potentialParamConfigPath, err := GetConfigFromDataDir(cfg.indexerDataDir, autoLoadParameterConfigFileName, config.FileTypes[:]) + if err != nil { + logger.Error(err) + return err + } + paramConfigFound := potentialParamConfigPath != "" // If we auto-loaded configs but a user supplied them as well, we have an error if paramConfigFound { if cfg.suppliedAPIConfigFile != "" { err = fmt.Errorf("api parameter configuration was found in data directory (%s) as well as supplied via command line. Only provide one", - filepath.Join(cfg.indexerDataDir, autoLoadParameterConfigName)) + potentialParamConfigPath) logger.WithError(err).Errorf("indexer parameter config error: %v", err) return err } - cfg.suppliedAPIConfigFile = autoloadParamConfigPath + cfg.suppliedAPIConfigFile = potentialParamConfigPath logger.Infof("Auto-loading parameter configuration file: %s", suppliedAPIConfigFile) } return err diff --git a/cmd/algorand-indexer/daemon_test.go b/cmd/algorand-indexer/daemon_test.go index 768fa0e72..2d25491c9 100644 --- a/cmd/algorand-indexer/daemon_test.go +++ b/cmd/algorand-indexer/daemon_test.go @@ -21,6 +21,7 @@ import ( "github.com/algorand/go-algorand/ledger/ledgercore" "github.com/algorand/go-algorand/rpcs" + "github.com/algorand/indexer/config" "github.com/algorand/indexer/processor/blockprocessor" itest "github.com/algorand/indexer/util/test" ) @@ -90,21 +91,61 @@ func createTempDir(t *testing.T) string { return dir } -// Make sure we output and return an error when both an API Config and -// enable all parameters are provided together. -func TestConfigWithEnableAllParamsExpectError(t *testing.T) { +// TestParameterConfigErrorWhenBothFileTypesArePresent test that if both file types are there then it is an error +func TestParameterConfigErrorWhenBothFileTypesArePresent(t *testing.T) { + indexerDataDir := createTempDir(t) defer os.RemoveAll(indexerDataDir) - autoloadPath := filepath.Join(indexerDataDir, autoLoadIndexerConfigName) - os.WriteFile(autoloadPath, []byte{}, fs.ModePerm) + for _, configFiletype := range config.FileTypes { + autoloadPath := filepath.Join(indexerDataDir, autoLoadParameterConfigFileName+"."+configFiletype) + os.WriteFile(autoloadPath, []byte{}, fs.ModePerm) + } + daemonConfig := &daemonConfig{} daemonConfig.flags = pflag.NewFlagSet("indexer", 0) daemonConfig.indexerDataDir = indexerDataDir - daemonConfig.enableAllParameters = true - daemonConfig.suppliedAPIConfigFile = "foobar" err := runDaemon(daemonConfig) - errorStr := "not allowed to supply an api config file and enable all parameters" - assert.EqualError(t, err, errorStr) + errorStr := fmt.Errorf("config filename (%s) in data directory (%s) matched more than one filetype: %v", + autoLoadParameterConfigFileName, indexerDataDir, config.FileTypes) + assert.EqualError(t, err, errorStr.Error()) +} + +// TestIndexerConfigErrorWhenBothFileTypesArePresent test that if both file types are there then it is an error +func TestIndexerConfigErrorWhenBothFileTypesArePresent(t *testing.T) { + + indexerDataDir := createTempDir(t) + defer os.RemoveAll(indexerDataDir) + for _, configFiletype := range config.FileTypes { + autoloadPath := filepath.Join(indexerDataDir, autoLoadIndexerConfigFileName+"."+configFiletype) + os.WriteFile(autoloadPath, []byte{}, fs.ModePerm) + } + + daemonConfig := &daemonConfig{} + daemonConfig.flags = pflag.NewFlagSet("indexer", 0) + daemonConfig.indexerDataDir = indexerDataDir + err := runDaemon(daemonConfig) + errorStr := fmt.Errorf("config filename (%s) in data directory (%s) matched more than one filetype: %v", + autoLoadIndexerConfigFileName, indexerDataDir, config.FileTypes) + assert.EqualError(t, err, errorStr.Error()) +} + +// Make sure we output and return an error when both an API Config and +// enable all parameters are provided together. +func TestConfigWithEnableAllParamsExpectError(t *testing.T) { + for _, configFiletype := range config.FileTypes { + indexerDataDir := createTempDir(t) + defer os.RemoveAll(indexerDataDir) + autoloadPath := filepath.Join(indexerDataDir, autoLoadIndexerConfigFileName+"."+configFiletype) + os.WriteFile(autoloadPath, []byte{}, fs.ModePerm) + daemonConfig := &daemonConfig{} + daemonConfig.flags = pflag.NewFlagSet("indexer", 0) + daemonConfig.indexerDataDir = indexerDataDir + daemonConfig.enableAllParameters = true + daemonConfig.suppliedAPIConfigFile = "foobar" + err := runDaemon(daemonConfig) + errorStr := "not allowed to supply an api config file and enable all parameters" + assert.EqualError(t, err, errorStr) + } } func TestConfigDoesNotExistExpectError(t *testing.T) { @@ -153,20 +194,23 @@ func TestConfigSpecifiedTwiceExpectError(t *testing.T) { } func TestLoadAPIConfigGivenAutoLoadAndUserSuppliedExpectError(t *testing.T) { - indexerDataDir := createTempDir(t) - defer os.RemoveAll(indexerDataDir) - - autoloadPath := filepath.Join(indexerDataDir, autoLoadParameterConfigName) - userSuppliedPath := filepath.Join(indexerDataDir, "foobar.yml") - os.WriteFile(autoloadPath, []byte{}, fs.ModePerm) - cfg := &daemonConfig{} - cfg.indexerDataDir = indexerDataDir - cfg.suppliedAPIConfigFile = userSuppliedPath - err := loadIndexerParamConfig(cfg) - errorStr := fmt.Sprintf("api parameter configuration was found in data directory (%s) as well as supplied via command line. Only provide one", - autoloadPath) - assert.EqualError(t, err, errorStr) + for _, configFiletype := range config.FileTypes { + indexerDataDir := createTempDir(t) + defer os.RemoveAll(indexerDataDir) + + autoloadPath := filepath.Join(indexerDataDir, autoLoadParameterConfigFileName+"."+configFiletype) + userSuppliedPath := filepath.Join(indexerDataDir, "foobar.yml") + os.WriteFile(autoloadPath, []byte{}, fs.ModePerm) + cfg := &daemonConfig{} + cfg.indexerDataDir = indexerDataDir + cfg.suppliedAPIConfigFile = userSuppliedPath + + err := loadIndexerParamConfig(cfg) + errorStr := fmt.Sprintf("api parameter configuration was found in data directory (%s) as well as supplied via command line. Only provide one", + autoloadPath) + assert.EqualError(t, err, errorStr) + } } func TestLoadAPIConfigGivenUserSuppliedExpectSuccess(t *testing.T) { @@ -183,17 +227,19 @@ func TestLoadAPIConfigGivenUserSuppliedExpectSuccess(t *testing.T) { } func TestLoadAPIConfigGivenAutoLoadExpectSuccess(t *testing.T) { - indexerDataDir := createTempDir(t) - defer os.RemoveAll(indexerDataDir) - - autoloadPath := filepath.Join(indexerDataDir, autoLoadParameterConfigName) - os.WriteFile(autoloadPath, []byte{}, fs.ModePerm) - cfg := &daemonConfig{} - cfg.indexerDataDir = indexerDataDir - - err := loadIndexerParamConfig(cfg) - assert.NoError(t, err) - assert.Equal(t, autoloadPath, cfg.suppliedAPIConfigFile) + for _, configFiletype := range config.FileTypes { + indexerDataDir := createTempDir(t) + defer os.RemoveAll(indexerDataDir) + + autoloadPath := filepath.Join(indexerDataDir, autoLoadParameterConfigFileName+"."+configFiletype) + os.WriteFile(autoloadPath, []byte{}, fs.ModePerm) + cfg := &daemonConfig{} + cfg.indexerDataDir = indexerDataDir + + err := loadIndexerParamConfig(cfg) + assert.NoError(t, err) + assert.Equal(t, autoloadPath, cfg.suppliedAPIConfigFile) + } } func TestIndexerDataDirNotProvidedExpectError(t *testing.T) { @@ -217,18 +263,20 @@ func TestIndexerPidFileExpectSuccess(t *testing.T) { } func TestIndexerPidFileCreateFailExpectError(t *testing.T) { - indexerDataDir := createTempDir(t) - defer os.RemoveAll(indexerDataDir) - autoloadPath := filepath.Join(indexerDataDir, autoLoadIndexerConfigName) - os.WriteFile(autoloadPath, []byte{}, fs.ModePerm) + for _, configFiletype := range config.FileTypes { + indexerDataDir := createTempDir(t) + defer os.RemoveAll(indexerDataDir) + autoloadPath := filepath.Join(indexerDataDir, autoLoadIndexerConfigFileName+"."+configFiletype) + os.WriteFile(autoloadPath, []byte{}, fs.ModePerm) - invalidDir := filepath.Join(indexerDataDir, "foo", "bar") - cfg := &daemonConfig{} - cfg.pidFilePath = invalidDir + invalidDir := filepath.Join(indexerDataDir, "foo", "bar") + cfg := &daemonConfig{} + cfg.pidFilePath = invalidDir - cfg.flags = pflag.NewFlagSet("indexer", 0) - cfg.indexerDataDir = indexerDataDir + cfg.flags = pflag.NewFlagSet("indexer", 0) + cfg.indexerDataDir = indexerDataDir - assert.ErrorContains(t, runDaemon(cfg), "pid file") - assert.Error(t, createIndexerPidFile(cfg.pidFilePath)) + assert.ErrorContains(t, runDaemon(cfg), "pid file") + assert.Error(t, createIndexerPidFile(cfg.pidFilePath)) + } } diff --git a/cmd/algorand-indexer/main.go b/cmd/algorand-indexer/main.go index a12015820..f66f19223 100644 --- a/cmd/algorand-indexer/main.go +++ b/cmd/algorand-indexer/main.go @@ -22,8 +22,8 @@ import ( "github.com/algorand/indexer/version" ) -const autoLoadIndexerConfigName = config.FileName + "." + config.FileType -const autoLoadParameterConfigName = "api_config.yml" +const autoLoadIndexerConfigFileName = config.FileName +const autoLoadParameterConfigFileName = "api_config" // Calling os.Exit() directly will not honor any defer'd statements. // Instead, we will create an exit type and handler so that we may panic @@ -135,7 +135,8 @@ func init() { // Setup configuration file viper.SetConfigName(config.FileName) - viper.SetConfigType(config.FileType) + // just hard-code yaml since we support multiple yaml filetypes + viper.SetConfigType("yaml") viper.SetEnvKeyReplacer(strings.NewReplacer("-", "_")) if err := viper.ReadInConfig(); err != nil { diff --git a/config/config.go b/config/config.go index 2ed3fe47f..27cf0d9e6 100644 --- a/config/config.go +++ b/config/config.go @@ -11,8 +11,8 @@ import ( // EnvPrefix is the prefix for environment variable configurations. const EnvPrefix = "INDEXER" -// FileType is the type of the config file. -const FileType = "yml" +// FileTypes is an array of types of the config file. +var FileTypes = [...]string{"yml", "yaml"} // FileName is the name of the config file. Don't use 'algorand-indexer', viper // gets confused and thinks the binary is a config file with no extension. diff --git a/go.mod b/go.mod index 5e29ab0b5..8ea1c33b4 100644 --- a/go.mod +++ b/go.mod @@ -30,6 +30,7 @@ require ( require ( github.com/Microsoft/go-winio v0.4.14 // indirect + github.com/algorand/avm-abi v0.1.0 // indirect github.com/algorand/falcon v0.0.0-20220727072124-02a2a64c4414 // indirect github.com/algorand/go-deadlock v0.2.2 // indirect github.com/algorand/go-sumhash v0.1.0 // indirect diff --git a/go.sum b/go.sum index 509b80a54..56c8d41a3 100644 --- a/go.sum +++ b/go.sum @@ -80,6 +80,8 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/algorand/avm-abi v0.1.0 h1:znZFQXpSUVYz37vXbaH5OZG2VK4snTyXwnc/tV9CVr4= +github.com/algorand/avm-abi v0.1.0/go.mod h1:+CgwM46dithy850bpTeHh9MC99zpn2Snirb3QTl2O/g= github.com/algorand/falcon v0.0.0-20220727072124-02a2a64c4414 h1:nwYN+GQ7Z5OOfZwqBO1ma7DSlP7S1YrKWICOyjkwqrc= github.com/algorand/falcon v0.0.0-20220727072124-02a2a64c4414/go.mod h1:OkQyHlGvS0kLNcIWbC21/uQcnbfwSOQm+wiqWwBG9pQ= github.com/algorand/go-algorand-sdk v1.9.1 h1:v2UaVXeMOZxvWoNJp6+MUAjm8Gif+ultcxg1RBrj45s= diff --git a/idb/mocks/IndexerDb.go b/idb/mocks/IndexerDb.go index 7030558d7..55fe296c8 100644 --- a/idb/mocks/IndexerDb.go +++ b/idb/mocks/IndexerDb.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.12.3. DO NOT EDIT. +// Code generated by mockery v2.12.1. DO NOT EDIT. package mocks @@ -13,6 +13,8 @@ import ( mock "github.com/stretchr/testify/mock" + testing "testing" + transactions "github.com/algorand/go-algorand/data/transactions" ) @@ -320,13 +322,8 @@ func (_m *IndexerDb) Transactions(ctx context.Context, tf idb.TransactionFilter) return r0, r1 } -type NewIndexerDbT interface { - mock.TestingT - Cleanup(func()) -} - -// NewIndexerDb creates a new instance of IndexerDb. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewIndexerDb(t NewIndexerDbT) *IndexerDb { +// NewIndexerDb creates a new instance of IndexerDb. It also registers the testing.TB interface on the mock and a cleanup function to assert the mocks expectations. +func NewIndexerDb(t testing.TB) *IndexerDb { mock := &IndexerDb{} mock.Mock.Test(t) diff --git a/misc/README.md b/misc/README.md index 5fdc1121c..cf4d8d343 100644 --- a/misc/README.md +++ b/misc/README.md @@ -21,3 +21,5 @@ Once the developer has built the code they want to test, perform the following: If the error is related to goal then the most likely cause is that the goal binary hasn't been installed as a package in the GOPATH system variable. Navigate to the go-algorand repository directory and run `make install`. If the error persists then run `export GOPATH=$(go env GOPATH)` followed by `export PATH=$PATH:$GOPATH/bin` in order to verify that the binary is accessible. +The test data used in `make e2e` during CI build is pinned to a version of rel/nightly artifact defined by CI_E2E_FILENAME in .circleci/config.yml. +`make update-submodule` updates the submodule and CI_E2E_FILENAME should be updated accordingly. diff --git a/misc/docker-compose.yml b/misc/docker-compose.yml index bc12eb7d3..56cd6442e 100644 --- a/misc/docker-compose.yml +++ b/misc/docker-compose.yml @@ -1,13 +1,13 @@ -version: '3' - -services: - e2e: - build: +version: '3' + +services: + e2e: + build: context: ../. - dockerfile: ./misc/Dockerfile + dockerfile: ./misc/Dockerfile environment: CONNECTION_STRING: "host=e2e-db port=5432 user=algorand password=algorand dbname=indexer_db sslmode=disable" - CI_E2E_FILENAME: "rel-nightly" + CI_E2E_FILENAME: "${CI_E2E_FILENAME}" e2e-db: image: "postgres:13-alpine" diff --git a/misc/e2elive.py b/misc/e2elive.py index 90e12f796..0d3714d34 100644 --- a/misc/e2elive.py +++ b/misc/e2elive.py @@ -83,7 +83,11 @@ def main(): from botocore.config import Config from botocore import UNSIGNED s3 = boto3.client("s3", config=Config(signature_version=UNSIGNED)) - tarpath = os.path.join(tempdir, tarname) + if "/" in tarname: + tarname = tarname.split("/")[1] + tarpath = os.path.join(tempdir, tarname) + else: + tarpath = os.path.join(tempdir, tarname) prefix = "indexer/e2e4" success = firstFromS3Prefix(s3, bucket, prefix, tarname, outpath=tarpath) if not success: diff --git a/misc/release.py b/misc/release.py index 18967725d..0d0ea1b58 100755 --- a/misc/release.py +++ b/misc/release.py @@ -38,6 +38,7 @@ def groupname(gid): ("linux", "arm", "armhf"), ("linux", "arm64", "arm64"), ("darwin", "amd64", None), + ("darwin", "arm64", None) ] channel = "indexer" diff --git a/misc/util.py b/misc/util.py index 19b79f24a..cf137200a 100644 --- a/misc/util.py +++ b/misc/util.py @@ -181,8 +181,7 @@ def report(): for x in response["Contents"]: path = x["Key"] haystack.append(path) - _, fname = path.rsplit("/", 1) - if fname == desired_filename: + if desired_filename in path: if outpath is None: if outdir is None: outdir = "." diff --git a/third_party/go-algorand b/third_party/go-algorand index 55f00821e..b01652680 160000 --- a/third_party/go-algorand +++ b/third_party/go-algorand @@ -1 +1 @@ -Subproject commit 55f00821edb78e2a6368d0e00b6b764658992925 +Subproject commit b01652680098c6a64bf6c6bb8246adc407162164